你在使用消息队列的时候关注过吞吐量吗?
思考过吞吐量的影响因素吗?
考虑过怎么提高吗?
总结过最佳实践吗?
本文带你一起探讨下消息队列消费端高吞吐的 Go
框架实现。Let’s go!
关于吞吐量的一些思考
-
写入消息队列吞吐量取决于以下两个方面
- 网络带宽
- 消息队列(比如Kafka)写入速度
最佳吞吐量是让其中之一打满,而一般情况下内网带宽都会非常高,不太可能被打满,所以自然就是讲消息队列的写入速度打满,这就就有两个点需要平衡
- 批量写入的消息量大小或者字节数多少
- 延迟多久写入
go-zero 的
PeriodicalExecutor
和ChunkExecutor
就是为了这种情况设计的 -
从消息队列里消费消息的吞吐量取决于以下两个方面
- 消息队列的读取速度,一般情况下消息队列本身的读取速度相比于处理消息的速度都是足够快的
- 处理速度,这个依赖于业务
这里有个核心问题是不能不考虑业务处理速度,而读取过多的消息到内存里,否则可能会引起两个问题:
- 内存占用过高,甚至出现OOM,
pod
也是有memory limit
的 - 停止
pod
时堆积的消息来不及处理而导致消息丢失