熊喵君的博客

Thinking will not overcome fear but action will.

GoWorker 高性能队列分析

分析一款基于 Golang 后台队列任务执行框架:benmanns/goworker

0x00 前言 goworker 是一个基于 Go 后台队列任务执行的高性能框架,下面是它的官方描述: goworker is a Go-based background worker that runs 10 to 100,000* times faster than Ruby-based workers goworker 兼容 Resque,所以可以使用 Rails/P...

Fasthttp 高性能 HttpServer 最佳实践之二:bytebufferpool

分析 Fasthttp 的 byte 对象池实现

0x00 前言 考虑这个普遍场景:在 Golang 开发中,在从 io.Reader 中读取数据时,通常要创建一个字节切片 []byte 去存储,在高频调用或并发比较高的场景中,需要频繁的进行内存申请和释放(频繁的创建[]byte),增大了 GC 的压力;此时需要采用字节池来优化 func main() { r, _ := os.Open("some_bigfile") ...

Xorm 使用总结(Mysql)

Xorm-Mysql 用法及避坑总结

0x00 前言 本文介绍 Xorm-MYSQL 的使用(自动分表)、超时封装、Tracing 封装及日常遇到的问题。Xorm 支持多种数据库驱动, 如: Mysql、Mariadb、Tidb、Postgres、Oracle 等等。 0x01 基础 Xorm-Mysql 的基础使用方式汇总如下,其他细节可以参见 Xorm 的 官方文档 1、Engine 相关 在项目中需要注意的是...

关于 Kafka 应用开发知识点的整理(一)

在项目中使用 Python 的 kafka 进行开发

0x00 前言 项目中使用 Kafka 作为消息队列,本篇文章就个人使用 Kafka 的一些经验做一些总结。大概从下面几个方面: Kafka 的基础知识总结 Kakfa 的生产者分区选择 Kafka 的消费者组机制 Kafka 的 offset 机制? Kafka 的消费延迟问题如何监控和优化? 关于 Kafka 应用的场景 0x01 Kafka 的基本概念...

Kratos 源码分析:超时(Timeout)传递

Context 的用法:Warden/Database 中的超时传递实现分析

0x00 前言 本篇文章,了解下 Kratos Warden 框架中的超时传递机制。 在微服务中,超时和熔断、重试、Backoff 策略都是有关联的。在实际项目中,每一个 RPC 调用都应该有超时退出的能力,这是比较合理的 API 设计。在 Context Deadlines and How to Set Them 中总结了超时的要点: Return an error. Thi...

Kratos 源码分析:Warden 中的 gRPC validator

分析 Kratos 的 gRPC 中的字段验证器

0x00 前言 validator 的意义是什么,简言之,在协议字段定义规则,使得开发者在代码中简化对字段的验证逻辑。 0x01 使用 validator 简单的来说,开启 gRPC 中的协议字段校验需要如下两步: proto 协议中按照指定 validator 包的规则定义字段的校验规则 在 gRPC 的 server 端、client 端中开启 validato...

Kratos 源码分析:Naming 解析(上)

分析 Naming 的多消费者订阅 - Watcher 模式

0x00 前言    分析下 Kratos 框架中的服务注册与发现的代码。准备分为两篇文章,一篇介绍 Naming 的公共接口及基于 Etcd 的 naming 机制实现,另一篇文章介绍 Warden 库是如何使用 Naming 的接口来完成服务注册与发现机制。总体而言,Kratos 的 Naming 逻辑分为如下几块: 公共的 Naming 逻辑与接口封装 ...

Kratos 源码分析:Kratos 中的 Metadata 元数据

一种全局变量的存储方式:Metadata

0x00 前言 看看下面这个例子,将 map[string]interface{} 定义成一个类型,这样直接 newmap:=MD{} 生成的对象就是一个 map(虽然这种语法看起来很奇怪)。理解此用法是分析 Metadata 的基础。 type mdKey struct{} type MD map[string]interface{} func main(){ f...

Kratos 源码分析:Lazy Load Container

分析 Kratos 的懒对象容器及应用场景

0x00 前言    所谓懒加载(Lazy)就是延时加载,延迟加载。至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适,因为内存容量有限,为了减少并发量及系统资源的消耗,我们让数据在需要的时候才进行加载。这就是懒加载。 在数据、策略等需要 “分组(组中以 Name 区分)” 的情况下,非常适合使用该方式实现存储(取),这里存储的值以 interface{} 表示,可...

分布式锁:使用 Redis 实现

Redis 应用开发:分布式锁构建 && Redlock 实现分析

0x00 前言 在应用环境中,不同的进程需要以互斥的方式使用共享资源时,就必须用到分布式锁。前文中,分析了如何 使用 Etcd 来构建分布式锁。本文,来聊聊如何使用 Redis 构造(可靠 && 高可用)分布式锁。一个高可用的分布式锁 至少需要满足几个条件 : 互斥:在任意时间内,只有一个客户端能够获得一把锁,具有排它性 避免死锁:即使客户端宕机或者从集群中...