Golang Go语言中如何解耦多层级 kafka consumer 比较好?

发布于 1周前 作者 gougou168 来自 Go语言

Golang Go语言中如何解耦多层级 kafka consumer 比较好?

简单描述一下当前的业务设计:

1.主线程从 kafka 读消息 (message)

2.把 message 根据 id 对 partition 取模转发给 dispatcher (dispatcher 数量 = partiton 大小)

3.dispatcher 转发 message 给 concurrent handler (一个 dispatcher 对应多个 concurrent handler)

4.concurrent handler 内有若干 message handler. 每个 concurrent handler 处理一类表(分表)的消息.

5.message handler 内有一个 handler.

6.handler 是实现了 Handle() 方法的实际业务处理者.(一条 message 被一个 handler 处理)

dispatcher 的设计目的是为了维护 partition offset.

concurrent message handler 的设计目的是简单的内部扩容,

message handler 的设计目的是复用业务判断和错误处理, 让 handler 可以只写业务.

目前的主要问题是, 我都是用 NewXX() 和 Run()方法, 在每一个 Run() 方法调用它的子 handler 的 Run(). 在 NewXX()方法里调用子 handler 的 NewXX() 方法.

最后导致代码结构比较复杂, 而且很难理清. 不知道该怎么优化

或者应该看些什么书 /文章比较好. 感觉思路是对的, 就是代码写的太绕了


更多关于Golang Go语言中如何解耦多层级 kafka consumer 比较好?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

为啥不用现成的轮子

https://github.com/segmentio/kafka-go

更多关于Golang Go语言中如何解耦多层级 kafka consumer 比较好?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我最近也在用这个库做 consumer 相关开发

在Golang中解耦多层级Kafka consumer的设计,关键在于模块化和接口抽象。以下是一些建议:

  1. 使用接口定义Consumer行为:首先,为Kafka consumer定义一个清晰的接口,包括启动、停止、提交offset等基本操作。这样,具体的consumer实现可以被轻松替换或扩展。

  2. 分层设计:将consumer逻辑分为多个层级,比如消息接收层、处理层和存储层。每个层级通过接口进行交互,减少层级间的直接依赖。

  3. 中间件模式:引入中间件模式来处理消息流。中间件可以对消息进行过滤、转换或路由,从而在不同层级之间提供灵活的解耦。

  4. 异步处理:使用goroutines和channels实现异步消息处理,这样consumer可以持续接收消息,而处理逻辑则可以在后台运行,避免阻塞。

  5. 配置和依赖注入:使用配置文件和依赖注入框架(如Uber的Dig或Facebook的Wire)来管理不同层级的依赖关系,使系统更加灵活和可测试。

  6. 错误处理和重试机制:设计健壮的错误处理和重试机制,确保在消费过程中出现问题时能够自动恢复,减少人工干预。

通过上述方法,你可以构建一个高度解耦、易于维护和扩展的Kafka consumer系统,从而满足不断变化的需求。

回到顶部