Kafka Producer(具有多个实例)写入同一主题

时间:2019-09-07 12:41:38

标签: apache-kafka kafka-producer-api

我有一个用例,其中消息来自某个渠道,我们希望将其推送到Kafka主题(多个分区)中。在我们的情况下,消息顺序很重要,因此我们必须按照接收消息的顺序将消息推送到主题,如果我们只有一个 -nd --no-directories Do not create a hierarchy of directories when retrieving recursively. With this option turned on, all files will get saved to the current directory, without clobbering (if a name shows up more than once, the filenames will get extensions .n). -np --no-parent Do not ever ascend to the parent directory when retrieving recursively. This is a useful option, since it guarantees that only the files below a certain hierarchy will be downloaded. 和单个分区,这看起来非常简单。在我们的案例中,为了实现负载平衡和可扩展性,我们希望为同一producer运行多个实例,但是问题在于如何维护消息的顺序

任何想法或解决方案将大有帮助。

即使我认为只有一个分区,也可以将其复制到多个代理以提高可用性和容错能力吗?

1 个答案:

答案 0 :(得分:1)

  

我们必须按照收到消息的顺序将消息推送到主题   如果我们只有一个制片人,并且   单个分区

您可以在一个生产者的主题中具有多个分区,并且如果您为消息提供密钥,则仍然可以保持顺序。单个生产者生产的所有具有相同密钥的消息始终井井有条。


当您说多个生产者时,我假设您正在运行应用程序的多个实例,并且没有在同一个JVM实例中创建多个生产者。

由于您说的是 channel ,所以我想它是一个网络通道,例如Datagram通道。在这种情况下,我想您正在某个端口上侦听并将接收到的数据发送到Kafka。

  

我看不到在同一实例中有多个生产者的意义   制作相同的主题,所以最好有一个制作人   发送所有消息,为了提高性能,您可以调整制作人   batch.sizelinger.ms等属性。

要获得容错能力,请让另一个实例在HA模式(故障转移模式)下运行,以便该实例死亡时,另一个实例将自动启动。

  

如果是网络通道,则可以运行多个实例并打开   带有选项SO_REUSEADDR的套接字   StandardSocketOptions,这样您将只有一名制片人   在任何时候都处于活跃状态,一旦   活跃的人死了。