如何通过Kafka流式传输大文件?

Kar*_*ter 5 java apache-kafka

我正在将基于ACID的整体迁移到基于事件的微服务架构中。在整体中,潜在的大文件存储在数据库中,我想与微服务共享此信息(包括文件内容)。

我的方法是将文件拆分为编号的块,然后发送几条消息(例如1,FileCreatedMessage其中包含元数据和ID,然后n FileContentMessage包含该块及其序列号)。在接收方,消息可能无法按顺序到达。因此,我将存储消息中的块,排序并加入它们并存储结果。

有没有一种方法可以让我通过Kafka以一条消息或另一种消息流传输数据,而无需为多个消息实现拆分,排序和联接逻辑的开销?

我注意到Kafka Streams。似乎解决了与此不同的问题。

Kat*_*ova 4

Kafka 不是发送大文件的正确方法。首先,您需要确保一条消息的块将到达同一分区,以便它们将由消费者的一个实例处理。这里的弱点是你的消费者可能会在中间失败,丢失它收集的块。如果您将块存储在某个存储(数据库)中直到它们全部到达,那么您将需要单独的过程来组装它们。您还需要考虑如果丢失块或在处理块期间出现错误会发生什么。我们公司正在考虑这个问题,并决定根本不通过 Kafka 发送文件,将它们保存在存储中,并在消息中发送对它们的引用。

本文总结了优点和缺点。

Kafka 流在这里不会为您提供帮助,因为它是一个框架,其中包含用于处理流的高级构造,但它仅适用于 Kafka。