基于kafka原理单机高性能微秒级别队列改造

为满足线上业务对超低延迟消息队列的需求,本文探讨了一种改造方案。通过对kafka、zeromq等常见消息队列的调研,发现它们无法达到微秒级别延迟。因此,设计了一个利用本地磁盘、顺序IO和inotify的队列系统,避免网络传输,减少数据拷贝,并采用water_mark机制应对消息积压。实测结果显示,消息从生产到消费的延迟约为100us,实现了高性能的目标。
摘要由CSDN通过智能技术生成

场景:

线上业务需要一款拥有超低延迟(us),支持多消费者,并且能够处理海量的消息积压的消息队列。

调研:

  1. kafka是我们日常生活中比较常见的消息队列,非常适合做消息的离线处理。但是在一些实时性要求比较高的场景下,消息自带的延迟是不可忍受的,测试发现一条消息转发大概需要200ms的耗时,实际情况可能有所出入,但肯定是毫秒级别的。kafka从设计上就是倾向于面向大众,满足大部分需求。当然满足这些要求的成本就是通过牺牲了性能。所以说kafka适合做离线处理。而不是做一些非常实时的应用。
  2. zeromq就是针对实时应用的一款消息队列,提供了各个拓扑结构的链接方式,性能不错,但不足的是当消息积压有可能会写满内存。

市面上目前的消息队列都与我们的设计目标不符。

设计:

要想拥有微秒级别的延迟,

  1. 不能走网络,数据必须放本地。
  2. 用磁盘以及顺序io来保证写入读取性能。生产者收到数据后将数据以换行符append的形式写入文件(顺序写),消费者getline一直到文件尾(顺序读),
  3. 使用inotify等待新数据的产生。
  4. 不适用get_line, fgets等库函数,减少数据拷贝,自己实现拆包逻辑。
  5. 读取的buffer_size不能设置的过小,由于下游消费通常存在一定的耗时,我们尽量一次多读取一些,否则系统调用read的成本很高。
  6. 当消息产生积压的情况,我们采用water_mark机制来自动调节每次数据读取的最大字节。

实现:

 


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值