使用Kafka在两个客户端之间传输文件

Using Kafka to Transfer Files between two clients

我在机器(机器#1 和机器#2)之间设置了 kafka 集群,配置如下:

1)每台机器配置一台broker和一台zookeeper运行。 2) 服务器和动物园管理员属性被配置为具有多代理、多节点动物园管理员。

我目前对KafkaProducer和KafkaConsumer的理解如下:

1) 如果我将文件从 machine#1 发送到 machine#2,它会使用一些默认定界符(LF 或 \n)分成几行。 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

假设以上是正确的(我很高兴是错的),我相信简单的 Producer Consumer 使用来传输文件不是正确的方法(可能 connect API 是这里的解决方案)。由于 Kafka 网站说 "Log Aggregation" 是一个非常流行的用例,我想知道是否有人有任何示例项目或网站演示使用 Kafka 的文件交换示例。

P.S. 我知道根据定义 Connect API 说这是为了在 kafka 和 "Other" 系统之间进行可靠的数据交换 - 但是我不明白为什么其他系统不能有卡夫卡。所以我希望我的问题不必关注 "Other" 非 kafka 系统。

您的理解是正确的,但是如果您想要相同的顺序,您可以只为该主题使用 1 个分区。 所以 machine#2 读取的顺序将与您发送的顺序相同。 然而,这将是低效的,并且缺乏 Kafka 广泛使用的并行性。

Kafka 在一个分区内有顺序保证。引用自文档

Kafka only provides a total order over records within a partition, not between different partitions in a topic

为了将文件中的所有行仅发送到一个分区,请向生产者客户端发送一个附加密钥,该密钥会将发送的消息散列到同一分区。 这将确保您在机器 #2 上以相同的顺序从一个文件接收事件。如果您有任何问题,请随时提出,因为我们使用 Kafka 对生产中从多个来源生成的事件进行排序保证,这基本上也是您的用例。