熊喵君的博客

Thinking will not overcome fear but action will.

gRPC 客户端长连接机制实现及 keepalive 分析

如何实现针对 gRPC 客户端的自动重连机制

0x00 前言 HTTP2 是一个全双工的流式协议, 服务端也可以主动 ping 客户端, 且服务端还会有一些检测连接可用性和控制客户端 ping 包频率的配置。gRPC 就是采用 HTTP2 来作为其基础通信模式的,所以默认的 gRPC 客户端都是长连接。 有这么一种场景,需要客户端和服务端保持持久的长连接,即无论服务端、客户端异常断开或重启,长连接都要具备重试保活(当然前提是两方...

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...