我已经提出了一个具体要求,想听听人们的观点,当然也不会重新发明轮子。
我有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消费者(可能需要分批处理吗?)有想法吗?
答案 0 :(得分:2)
使用Spring,创建2个@KafkaListener
,一个用于A,一个用于B;将容器确认模式设置为“手动”,并将Acknowledgment
添加到方法签名中。
在每个侦听器中,累积记录直到您获得50个记录,然后暂停侦听器容器(这样Kafka就不会再发送任何消息了,但使用者仍然可以存活)。
您可能需要将max.poll.records
设置为1,以更好地控制功耗。
每个有50个时;合并并发送。
通过在A和B中收到的最后一个acknowledge()
上调用Acknowledgment
来提交偏移量。
恢复容器。
重复。
在累积阶段,如果服务器崩溃,则推迟偏移提交将避免记录丢失。
在两个主题中都有大量消息时,可以跳过暂停/继续部分。