我正在将基于ACID的整体迁移到基于事件的微服务体系结构中。在整体中,潜在的大文件存储在数据库中,我想与微服务共享此信息(包括文件内容)。
我的方法是将文件分割为编号的块,然后发送几条消息(例如1个{FileCreatedMessage
,带有元数据和一个ID,后跟n
FileContentMessage
,其中包含该块及其序号) )。在接收方,消息可能无法按顺序到达。因此,我将存储消息中的块,排序并加入它们并存储结果。
有没有一种方法可以让我以一条消息或另一种方法通过Kafka传输数据,而无需为多条消息实现拆分,排序和联接逻辑的开销?
我注意到Kafka Streams。似乎解决了与此问题不同的问题。
答案 0 :(得分:2)
Kafka不是发送大文件的正确方法。首先,您需要确保一条消息的多个块将进入同一分区,以便由使用者的一个实例对其进行处理。此处的弱点是,您的消费者可能会在中间失败,从而失去所聚集的部分。如果将块存储在某个存储(数据库)中,直到所有块都到达,那么您将需要单独的过程来组装它们。您还需要考虑如果在处理该块时丢失一块或发生错误会发生什么。我们正在公司中考虑此问题,因此决定完全不通过Kafka发送文件,将其保存在存储中,并在消息中发送对它们的引用。
This article总结了利弊。
Kafka流在这里不能为您提供帮助,因为它是框架,其中包含用于处理流的高级构造,但仅可在Kafka上使用。
答案 1 :(得分:2)
我尽量不要使用Kafka来保存大文件内容。相反,我将文件存储在分布式文件系统(通常是HDFS,但还有其他好的文件系统)上,然后将URI和我需要的任何其他元数据一起放入Kafka消息中。如果在分布式流执行平台(例如Storm或Flink)上处理Kafka主题,则确实需要注意分布式文件系统中的复制时间。在某些情况下,DFS可以在复制文件以供本地系统访问之前处理Kafka消息,但是比在Kafka中存储大文件内容引起的问题更容易解决。