熊喵君的博客

Thinking will not overcome fear but action will.

分布式一致性 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站的实践经验来...

Kratos 源码分析:Metrics 与 Prometheus 的集成与使用

分析 Kratos 的数据指标采集与使用

0x00 前言 前面已经分析过 Kratos 中的滑动窗口及基于滑动窗口实现的 RollingCounter、RollingGauge 实现,主要 代码在此。 这篇文章主要分析如下几点内容: Kratos 中对 Prometheus 接口的集成及封装 Warden 中使用 Metrics 做指标数据上报的拦截器封装 Metrics 的自定义使用 主要引用了这个包 gi...

Kratos 源码分析:Warden 之 gRPC-Server 封装

分析 Warden 的 Server 端封装

0x00 前言 Kratos 的 Warden 框架 server.go 封装了 gRPC 的服务端启动的核心逻辑。 服务端的启动 & 配置流程 拦截器链的 “安装” 顺序 tracer、metrics 以及 limiter 与 grpc.Server 的结合 过载保护实现 0x01 Server 端拦截器 Kratos 的拦截器链实现非常典型,实际项目可...

Kratos 源码分析:Warden 之 gRPC-Client 封装

分析 Warden 的 Client 端封装

0x00 前言 Kratos 的 Warden 框架 client.go 封装了 gRPC 的客户端启动的核心逻辑。 客户端封装的重点在下面几个方面: 客户端启动 & 配置流程 客户端拦截器链的 “安装” 顺序 tracer、metrics 以及 breaker 与 grpc.Client 的结合 客户端的 Naming 和 gRPC 框架结合 客户端调用...