Apache kafka 我应该在Akka流中的Kafka源之后添加缓冲区吗

Apache kafka 我应该在Akka流中的Kafka源之后添加缓冲区吗,apache-kafka,akka,buffer,akka-stream,Apache Kafka,Akka,Buffer,Akka Stream,根据: 如果流的源轮询外部实体以获取新消息,并且下游处理是非统一的,则插入缓冲区对于实现良好吞吐量至关重要。例如,在某些情况下,在反应流Kafka库的Kafka使用者之后插入一个大缓冲区可以将性能提高一个数量级。否则,源可能无法足够快地轮询卡夫卡,以保持下游工作饱和,源在反压和轮询卡夫卡之间振荡 的文档没有提到这一点,所以我想知道在这种情况下使用缓冲区是否有意义。同样的事情是否也适用于卡夫卡接收器(我应该在之前添加缓冲区吗) …我想知道在这种情况下使用缓冲区是否有意义 考虑你引用的博客文章中的以

根据:

如果流的源轮询外部实体以获取新消息,并且下游处理是非统一的,则插入缓冲区对于实现良好吞吐量至关重要。例如,在某些情况下,在反应流Kafka库的Kafka使用者之后插入一个大缓冲区可以将性能提高一个数量级。否则,源可能无法足够快地轮询卡夫卡,以保持下游工作饱和,源在反压和轮询卡夫卡之间振荡

的文档没有提到这一点,所以我想知道在这种情况下使用缓冲区是否有意义。同样的事情是否也适用于卡夫卡接收器(我应该在之前添加缓冲区吗)

…我想知道在这种情况下使用缓冲区是否有意义

考虑你引用的博客文章中的以下部分:

…下游处理是不均匀的

本文这一部分的要点之一是说明用户定义的缓冲区和异步边界对流的类似效果。没有缓冲区或异步边界的默认行为是启用,它在单个参与者中运行流。这本质上意味着,对于使用的每个卡夫卡消息,在下一条消息通过管道之前,该消息必须通过流的整个管道,从源到接收器。换句话说,在前面的消息
m1
完成处理之前,消息
m2
不会通过管道

如果卡夫卡连接器源下游发生的处理是“非均匀的”(即,可能需要不同的时间:有时处理速度很快,有时需要一段时间),则引入缓冲区或异步边界可以提高总体吞吐量。这是因为缓冲区或异步边界可以允许源继续使用Kafka消息,即使下游处理恰好需要很长时间。也就是说,如果
m1
需要很长时间来处理,则源可以使用消息
m2
m3
等(直到缓冲区已满),而无需等待
m1
完成。正如科林·布雷克在他的帖子中所说:

缓冲区通过解耦阶段来提高性能,平均而言,允许上游或下游继续处理元素,即使其中一个正在忙于处理相对昂贵的工作负载

这种潜在的性能提升并不适用于所有情况。再次引用布雷克的话:

与上一节讨论的
async
方法类似,应该注意,不加区分地插入缓冲区不会提高性能,只会消耗额外的资源。如果相邻的工作负载相对一致,则添加缓冲区不会改变性能,因为流的总体性能将由最慢的处理阶段控制


确定在您的案例中使用缓冲区(即,
.buffer
)是否合理的一个明显方法是尝试它。您也可以尝试添加一个异步边界(即,
.async
)。比较以下三种方法—(1)无缓冲的默认融合行为,(2)
.buffer
,以及(3)
.async
——看看哪种方法的性能最好。

谢谢您的回答。我仍然不清楚在不使用aync的情况下使用缓冲区是否有意义,特别是当您说“每一条被消费的Kafka消息,消息都必须经过流的整个管道,从源到接收器”。缓冲区会有什么变化吗?在花了大量时间测试不同的配置之后,我发现我需要向kafka接收器和源添加缓冲区。我不需要添加异步边界,接收器实际上大部分是异步的。此外,我还增加了生产者并行性,这很有帮助(请参阅)