如何最大限度地减少kafka消息传递框架中涉及的延迟?

Amo*_*rni 28 apache-kafka

场景:我有一个低容量主题(~150msgs/sec),我们希望从生产者到消费者的传播延迟较低.

我从生产者处添加了一个时间戳,并在消费者处读取它以记录传播延迟,默认配置msg(20个字节)显示传播延迟为1960ms到1230ms.因为没有网络延迟,我在同一台机器上尝试了1个生产者和1个简单的消费者.

当我尝试将主题刷新间隔调整为20ms时,它会下降到1100ms到980ms.然后我尝试将消费者调整"fetcher.backoff.ms"到10毫秒,它下降到1070毫秒 - 860毫秒.

问题:对于msg的20个字节,我希望传播延迟尽可能低,并且~950ms是更高的数字.

问题:我在配置中遗漏了什么?我欢迎您的评论,延迟至少.

假设:Kafka系统涉及消费者从生产者获取消息之前的磁盘I/O,这与硬盘RPM等有关.


更新:尝试调整日志刷新策略的持久性和延迟.
以下是配置:

# The number of messages to accept before forcing a flush of data to disk
log.flush.interval=10
# The maximum amount of time a message can sit in a log before we force a flush
log.default.flush.interval.ms=100
# The interval (in ms) at which logs are checked to see if they need to be 
# flushed to disk.
log.default.flush.scheduler.interval.ms=100
Run Code Online (Sandbox Code Playgroud)

对于20字节的相同消息,延迟为740ms-880ms.

以下语句在配置本身中已明确说明.
有一些重要的权衡:

  1. 耐用性:在发生崩溃时,未刷新的数据更容易丢失.
  2. 延迟:在刷新之前,消费者无法获得数据(这会增加延迟).
  3. 吞吐量:冲洗通常是最昂贵的操作.

所以,我相信没有办法达到150毫秒 - 250毫秒的标记.(没有硬件升级).

Pau*_*l M 36

我并不想回答这个问题,但我认为kafka对于这个用例来说是一个糟糕的选择.虽然我认为卡夫卡很棒(我一直是我在工作场所使用它的巨大支持者),但它的优势并不是低延迟.它的优势在于高生产者吞吐量以及对快速和慢速消费者的支持.虽然它确实提供了耐用性和容错性,但像RabbitMQ这样的通用系统也是如此.RabbitMQ还支持各种不同的客户端,包括node.js. 与kafka相比,当你处理极高的音量(比如150K msg/s)时,rabbitMQ不足.那时,兔子的耐久性方法开始分崩离析,卡夫卡真正脱颖而出.兔子的耐久性和容错能力超过20K msg/s(根据我的经验).

此外,为了实现如此高的吞吐量,Kafka分批处理消息.虽然批次很小且尺寸可配置,但是如果不产生大量开销,则不能使它们太小.不幸的是,消息批处理使低延迟变得非常困难.虽然您可以调整kafka中的各种设置,但我不会将Kafka用于任何需要延迟不到1-2秒的延迟.

此外,如果您要启动新应用程序,kafka 0.7.2不是一个好的选择.现在所有关注的焦点都是0.8,所以如果你遇到问题我会独自一人,我绝对不会期待任何新功能.

再说一次,我认为Kafka非常适合一些非常具体的,虽然很受欢迎的用例.在我的工作场所,我们同时使用Rabbit和Kafka.虽然这看起来很有趣,但它们确实是一种贬义.


Jak*_*obb 15

我知道问题已经过去了一年多,但我刚刚建立了一个用于开发目的的Kafka集群,我们看到从生产者到消费者的延迟时间<1毫秒.我的群集包含三个运行在具有SAN存储的云VM服务(Skytap)上的VM节点,因此它远非理想的硬件.我正在使用Kafka 0.9.0.0,这是足够新的,我相信提问者正在使用更旧的东西.我对旧版本没有经验,因此您只需升级即可获得性能提升.

我正在通过运行我编写的Java生产者和消费者来衡量延迟.两者都运行在同一台机器上,位于同一Skytap环境中的第四台VM上(以最大限度地减少网络延迟).生产者记录当前时间(System.nanoTime()),将该值用作Avro消息中的有效负载,并发送(acks = 1).使用者配置为以1ms超时连续轮询.当它收到一批消息时,它会(System.nanoTime()再次)记录当前时间,然后从发送时间中减去接收时间以计算延迟.当它有100条消息时,它会计算所有100个延迟的平均值并打印到stdout.请注意,在同一台计算机上运行生产者和使用者非常重要,这样延迟计算就不会出现时钟同步问题.

我已经玩了很多生产者生成的消息量.肯定存在太多而且延迟开始增加的点,但它大大高于150 /秒.偶尔的消息需要多达20毫秒才能完成,但绝大多数都在0.5毫秒到1.5毫秒之间.

所有这一切都是通过Kafka 0.9的默认配置完成的.我没有做任何调整.我在初始测试时使用了batch-size = 1,但后来发现它在低音量时没有效果,并且在延迟开始增加之前对峰值音量施加了显着的限制.

重要的是要注意,当我在本地计算机上运行我的生产者和消费者时,完全相同的设置会报告100ms范围内的消息延迟 - 如果我只是ping我的Kafka代理,则会报告完全相同的延迟.

我稍后将使用来自我的制作人和消费者的示例代码以及其他细节编辑此消息,但我想在忘记之前发布一些内容.

  • 经过这么长时间的努力,再次投票,以丰富您的答案。 (2认同)

Rav*_*avi 5

Kafka的现代版本似乎具有非常小的延迟,因为此处的结果显示:

2 ms(中位数)3 ms(第99百分位数)14 ms(第99.9百分位数)