我有一个用例,其中消息来自一个通道,我们希望将其推入一个kafka主题(多个分区)。在我们的例子中,消息顺序很重要,所以我们必须按接收到消息的顺序将消息推送到主题,如果只有一条消息,这看起来非常直接 producer
和单个分区。在我们的例子中,为了负载平衡和可伸缩性,我们希望为同一个服务器运行多个示例 producer
但问题是如何保持信息的顺序。
任何想法或解决方案都会很有帮助。
即使我认为只有一个分区,它是否可以复制到多个代理以获得可用性和容错性?
我有一个用例,其中消息来自一个通道,我们希望将其推入一个kafka主题(多个分区)。在我们的例子中,消息顺序很重要,所以我们必须按接收到消息的顺序将消息推送到主题,如果只有一条消息,这看起来非常直接 producer
和单个分区。在我们的例子中,为了负载平衡和可伸缩性,我们希望为同一个服务器运行多个示例 producer
但问题是如何保持信息的顺序。
任何想法或解决方案都会很有帮助。
即使我认为只有一个分区,它是否可以复制到多个代理以获得可用性和容错性?
1条答案
按热度按时间camsedfj1#
如果只有一个生产者和一个分区,我们必须按接收的顺序将消息推送到主题,这看起来非常直接
主题中可以有多个分区和一个生产者,如果为消息提供密钥,则仍然可以保持顺序。由单个生产者生成的具有相同密钥的所有消息总是按顺序排列的。
当您说有多个生产者时,我假设您正在运行应用程序的多个示例,并且您没有在同一个jvm示例中创建多个生产者。
既然你说的是信道,我假设它是一个网络信道,比如数据报信道。在这种情况下,我假设您正在监听某个端口,并将接收到的数据发送给kafka。
我不认为让多个生产者在同一个示例中为同一主题进行生产有什么意义,因此最好让一个生产者发送所有消息,为了提高性能,您可以调整生产者属性,如
batch.size
,linger.ms
等。为了实现容错,让另一个示例在ha模式(fail-over模式)下运行,这样,如果这个示例死了,另一个示例就会自动恢复。
如果是网络通道,则可以运行多个示例并使用选项打开套接字
SO_REUSEADDR
在standardsocketoptions中,通过这种方式,您在任何时候都只有一个生产者处于活动状态,并且一旦活动生产者死亡,新生产者将变为活动生产者。