我有一个用例,其中消息来自某个渠道,我们希望将其推送到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
运行多个实例,但是问题在于如何维护消息的顺序。
任何想法或解决方案将大有帮助。
即使我认为只有一个分区,也可以将其复制到多个代理以提高可用性和容错能力吗?
答案 0 :(得分:1)
我们必须按照收到消息的顺序将消息推送到主题 如果我们只有一个制片人,并且 单个分区
您可以在一个生产者的主题中具有多个分区,并且如果您为消息提供密钥,则仍然可以保持顺序。单个生产者生产的所有具有相同密钥的消息始终井井有条。
当您说多个生产者时,我假设您正在运行应用程序的多个实例,并且没有在同一个JVM实例中创建多个生产者。
由于您说的是 channel ,所以我想它是一个网络通道,例如Datagram通道。在这种情况下,我想您正在某个端口上侦听并将接收到的数据发送到Kafka。
我看不到在同一实例中有多个生产者的意义 制作相同的主题,所以最好有一个制作人 发送所有消息,为了提高性能,您可以调整制作人
batch.size
,linger.ms
等属性。
要获得容错能力,请让另一个实例在HA模式(故障转移模式)下运行,以便该实例死亡时,另一个实例将自动启动。
如果是网络通道,则可以运行多个实例并打开 带有选项
SO_REUSEADDR
的套接字 StandardSocketOptions,这样您将只有一名制片人 在任何时候都处于活跃状态,一旦 活跃的人死了。