熊喵君的博客

Thinking will not overcome fear but action will.

Golang Web/RPC 框架中的设计模式

装饰器模式及 Pipeline 模式回顾

0x00 前言 这篇文章想聊聊,在使用 gRPC 和 Gin 框架中,理解到的设计模式。主要有下面几个: 装饰器模式 Pipeline 模式 0x01 基础回顾 1、 装饰器模式 装饰器模式,是一种动态地往一个类中添加新的行为的设计模式。就功能而言,修饰模式相比生成子类更为灵活,这样可以给某个对象而不是整个类添加一些功能。 看起来像洋葱一样, 洋葱内部最嫩最核心的时...

Golang TCP 并发服务器框架:Zinx

一个基于 Golang 轻量级 TCP 并发服务器框架分析

0x00 前言 zinx的开发文档基本上描述的很详细了,对初学者比较友好。笔者先前基于reactor模型实现过一个TCP网络框架tcpframe,要点是: 多进程模型 Reactor反应堆模式,基于事件驱动的循环 基于TLV的协议通信,避免粘包 本文就以上面3个维度分析下zinx网络框架的实现的核心思路。 0x01 zinx的架构 0x02 代码分析...

Go-redis with Metrics:关键指标采集

魔改 go-redis 实现 Metrcis + Prometheus 关键指标上报

0x00 前言 本文总结下,工作中使用 go-redis 库的一些高级用法。 0x01 回调钩子 WrapProcess V7 版本之前提供了 WrapProcess 和 WrapProcessPipeline 方法,用于在 RedisAPI 执行方法前后进行自定义处理,下面的例子中,使用 time.Since() 来计算 Redis 操作的耗时代码: 注意:err := ol...

分布式一致性 hash 算法的实现分析

ketama 算法分析与应用

0x00 前言 在工作中,遇到过如下几种需要分布式一致的场景: 分布式一致的缓存系统 gRPC的基于一致性算法的loadbalance实现,某些业务场景下,需要尽可能使指定客户端的请求经由consistent-hash算法到达指定的服务器进行处理 分布式crontab中,如何实现多机运行独占性任务 consistent-hash 的应用场景 consistent-...

GoIM 源码分析(四):一些细节

GOIM

0x00 前言 0x01 数据结构:Ring Ring的使用场景 Ring本质上是一个环形缓冲区,其中保存的是空闲的protocol.Proto对象,主要用于长连接下TCP数据的拆包封包(每个连接都会初始化自己的Ring结构) 为什么要设计如此的结构呢?这里有个issue,思考下,长连接的场景,连接上不断有报文收发,使用一个可复用协议包体的数据结构是一个不错的优化手段(避免...

GoIM 源码分析(三):Logic


GoIM 源码分析(二):Job


GoIM 源码分析(一):Comet

分析 GoIM 对外服务模块 Comet

0x00 前言 本篇文章,分析下 GoIM 的 Comet 模块。 Comet 主方法 Comet 主要数据结构 Comet 管理服务(与 Job 模块通信) Comet模块的位置: 0x01 Comet 模块 Comet 模块为用户代理 Server(主要提供对外服务),用于客户端的连接,根据情况可部署多个 Comet-Server(扩展)。Comet 模块支持 Tc...

开源限流组件分析(一):Uber 的 Leaky Bucket

分析 Uber 的基于 Leaky Bucket 的限流器

0x00 前言 前一篇文章了解了微服务中限流的基础概念,这篇文章来分析下基于漏桶(Leaky Bucket)的一个典型开源实现 Uber:ratelimit 及其一般应用场景。 0x01 概念回顾 漏桶算法是对计数器算法的一种改进。 漏桶可以看作是一个带有常量服务时间的单服务器队列,如果漏桶(包缓存)溢出,那么数据包会被丢弃。 0x02 Uber-ratelimiter...

Kratos 源码分析:Warden 负载均衡算法之 P2C

分析 Warden 实现的负载均衡算法 P2C(Power of Two Choices)

0x00 前言 Warden 框架默认实现了两种负载均衡算法: WRR:Weight Round Robin(Dynamic) P2C:Power of Two Choice 之前的文章Kratos源码分析:分析 Kratos 中的 Dynamic-Wrr 负载均衡算法的实现,简单分析了WRR算法的实现思路及解决的场景。那么WRR算法存在哪些问题呢? 从B站的实践经验来...