根据这篇博文:
如果流的源轮询外部实体以获取新消息,并且下游处理是不一致的,那么插入缓冲区对于实现良好的吞吐量是至关重要的。例如,在某些情况下,在React流kafka库的kafka使用者之后插入一个大的缓冲区可以将性能提高一个数量级。否则,源可能无法足够快地轮询kafka,以保持下游工作饱和,源在反压和轮询kafka之间振荡。
alpakka-kafka连接器的文档没有提到这一点,所以我想知道在这种情况下使用缓冲区是否有意义。同样的事情也适用于Kafka接收器(我应该在之前添加缓冲区吗)?
根据这篇博文:
如果流的源轮询外部实体以获取新消息,并且下游处理是不一致的,那么插入缓冲区对于实现良好的吞吐量是至关重要的。例如,在某些情况下,在React流kafka库的kafka使用者之后插入一个大的缓冲区可以将性能提高一个数量级。否则,源可能无法足够快地轮询kafka,以保持下游工作饱和,源在反压和轮询kafka之间振荡。
alpakka-kafka连接器的文档没有提到这一点,所以我想知道在这种情况下使用缓冲区是否有意义。同样的事情也适用于Kafka接收器(我应该在之前添加缓冲区吗)?
1条答案
按热度按时间yqlxgs2m1#
…我想知道在这种情况下使用缓冲区是否有意义
考虑一下你引用的博客文章中的以下部分:
…下游处理不均匀。。。。
文章的这一部分的要点之一是说明用户定义的缓冲区和异步边界可以对流产生的类似效果。默认的行为(其中没有缓冲区或异步边界)是启用操作符融合,它在单个参与者中运行流。这本质上意味着,对于每一条被消费的kafka消息,在下一条消息通过管道之前,该消息必须通过流的整个管道,从源到接收器。换句话说,一条信息
m2
在前面的消息之前不会通过管道m1
已完成处理。如果从kafka连接器源下游发生的处理是“非均匀的”(即,它可能需要不同的时间:有时处理速度很快,有时需要一段时间),那么引入缓冲区或异步边界可以提高总体吞吐量。这是因为缓冲区或异步边界可以允许源继续使用kafka消息,即使下游处理碰巧需要很长时间。也就是说,如果
m1
处理需要很长时间,源可能会消耗消息m2
,m3
等(直到缓冲区已满),而无需等待m1
结束。正如科林·布雷克在他的帖子中所说:缓冲区通过解耦阶段来提高性能,平均而言,允许上游或下游继续处理元素,即使其中一个正在忙于处理相对昂贵的工作负载。
这种潜在的性能提升并不适用于所有情况。再次引用布雷克的话:
类似于
async
方法,应该注意,不加区分地插入缓冲区不会提高性能,只会消耗额外的资源。如果相邻的工作负载相对一致,则添加缓冲区不会改变性能,因为流的总体性能将由最慢的处理阶段控制。确定是否使用缓冲区的一个明显方法(即。,
.buffer
)在你的情况下有意义的是尝试一下。您还可以尝试添加一个异步边界(即。,.async
)相反。比较以下三种方法——(1)无缓冲的默认融合行为,(2).buffer
,和(3).async
--看看哪一个的表现最好。