我在机器(机器#1和机器#2)之间设置了kafka集群,配置如下:
1) 每台机器都配置为运行一个代理和一个动物园管理员。 2) 服务器和动物园管理员属性配置为具有多代理、多节点动物园管理员。
我目前对KafkaProduceer和KafkaConsumer有以下了解:
1)如果我将文件从machine#1
发送到machine#2
,它会使用一些默认分隔符(LF或)分解为行。 2)因此,如果machine#1将2个不同的文件发布到同一主题,这并不意味着machine#2
将收到这两个文件。相反,每一行都将附加到主题日志分区,machine#2
将按到达顺序从日志分区读取它。即顺序与
file1-line1
file1-line2
end-of-file1
file2-line1
file2-line2
end-of-file2
但它可能是这样的: 文件1-行1 文件2-行1 文件1-行2 文件结尾1 文件-2-行2 文件结尾2
假设上述是正确的(我很高兴错了),我相信简单的生产者消费者使用来传输文件不是正确的方法(可能连接 API 是这里的解决方案)。由于 Kafka 网站说"日志聚合"是一个非常流行的用例,我想知道是否有任何示例项目或网站演示使用 Kafka 的文件交换示例。
附言我知道根据定义,Connect API
说这是为了 kafka 和"其他"系统之间的可靠数据交换——但我不明白为什么其他系统不能有 kafka。所以我希望我的问题不必集中在"其他"非卡夫卡系统上。
您的理解是正确的,但是如果您想要相同的顺序,则可以对该主题仅使用 1 个分区。 因此,机器#2读取的顺序将与您发送的顺序相同。 然而,这将是低效的,并且缺乏Kafka广泛使用的并行性。
Kafka 在分区内有排序保证。 引用自文档
Kafka 仅提供分区内记录的总顺序,而不是 在主题中的不同分区之间
为了仅将文件中的所有行发送到一个分区,请向生产者客户端发送一个额外的密钥,该密钥会将发送的消息散列到同一分区。 这将确保您在机器 #2 上以相同的顺序从一个文件接收事件。如果您有任何问题,请随时提出,因为我们使用 Kafka 来订购从生产中多个来源生成的事件的保证,这基本上也是您的用例。