Kafka从2个主题中消费并获取相等数量的消息

时间:2019-07-08 17:44:07

标签: apache-kafka kafka-consumer-api apache-kafka-streams spring-kafka

我已经提出了一个具体要求,想听听人们的观点,当然也不会重新发明轮子。

我有2个卡夫卡主题-A和B。

A和B将以不同的接收速率填充邮件。 例如:A可以先填充10K消息,然后再填充B。或者在某些情况下,我们将A和B同时填充消息。摄取过程是我们无法控制的。对我们来说,这就像是第三方的上游系统。

我需要从这两个主题中提取消息,并以相等的比例混合它们。 例如:如果配置的大小为50。那么我应该从A那里选择50,从B那里选择50(或者等到我拥有它),然后将其发送给另一个kafka主题为100(A和B的比例相等)

我想知道解决这个问题的最佳方法是什么?尽管我在研究KStreams和KTables的联接语义,但我不太确信这是联接的有效用例(因为消息中没有键来联接这两个流或表)。

可以在没有Kafka Streams的情况下完成此操作吗? Vanilla Kafka消费者(可能需要分批处理吗?)有想法吗?

1 个答案:

答案 0 :(得分:2)

使用Spring,创建2个@KafkaListener,一个用于A,一个用于B;将容器确认模式设置为“手动”,并将Acknowledgment添加到方法签名中。

在每个侦听器中,累积记录直到您获得50个记录,然后暂停侦听器容器(这样Kafka就不会再发送任何消息了,但使用者仍然可以存活)。

您可能需要将max.poll.records设置为1,以更好地控制功耗。

每个有50个时;合并并发送。

通过在A和B中收到的最后一个acknowledge()上调用Acknowledgment来提交偏移量。

恢复容器。

重复。

在累积阶段,如果服务器崩溃,则推迟偏移提交将避免记录丢失。

在两个主题中都有大量消息时,可以跳过暂停/继续部分。

相关问题