如何在微服务环境中通过消息查询处理大文件?
How can I handle large files processing via messaging queries in Microservices environment?
许多人建议组织 IPC (ImicroservicesC) 的好方法是通过 Kafka 和 JMS 等查询进行异步通信。
但是如果我需要在服务之间传递大数据文件怎么办?
假设我有一个视频微服务和一个发布者微服务。第一个接收来自用户的视频,验证并将它们发送给 Publisher 进行转换和发布。它的遗忘视频可能是一个非常大的文件,它可能会使消息系统过载(Kafka 根本不适合大消息)。当然,我可以为他们共享一个数据库并通过 Kafka 发送 video_id,但是它耦合了这些服务并且它不再是真正的微服务架构。
你在实践中有没有类似的情况?你是怎么处理的?
谢谢
Hohpe/Wolfe 书中有一个名为 Claim Check Pattern 的企业集成模式解决了这些问题。
基本上,大 blob 从消息中删除并存储在发件人和接收者都可以访问的某个地方,无论是公共文件共享、FTP 服务器、Amazon S3 blob 还是其他任何地方。它在后面留下一个 "claim check":某种描述如何找到 blob 的地址。
然后可以通过 Kafka/JMS 或其他一些消息队列系统传输微小的消息,其中大多数在处理大数据 blob 方面相当糟糕。
当然,一个非常简单的实现是将文件留在文件共享上,仅通过文件路径引用它们。
当最好将 blob 与消息的其余部分集成时,情况会更复杂,需要真正的 Claim Check 实现。这可以在基础架构级别处理,因此消息发送方和接收方不需要知道数据传输背后的任何细节。
我知道您在 Java 环境中,但在 NServiceBus (I work for Particular Software, the makers of NServiceBus) this pattern is implemented with the Data Bus feature 消息管道步骤中。开发人员需要做的就是确定适用于数据总线的消息属性类型,并(在默认文件共享实现中)配置文件存储位置。开发者也可以免费提供自己的数据总线实现。
要记住的一件事是,当 blob 与消息断开连接时,您必须进行清理。如果消息是单向的,您可以在成功处理消息后立即清除它们。使用 Kafka(不是很熟悉)有可能多次处理来自流的消息,对吗?如果是这样,您希望等到无法再处理该消息。或者,如果使用 Publish/Subscribe 模式,您将不想清理文件,直到您确定所有订阅者都有机会被处理。为了实现这一点,您需要在消息上设置 SLA(每条消息必须在其中处理的时间跨度),并在该时间跨度过去后清理 blob 存储。
无论如何,有很多事情需要考虑,这使得在基础架构级别实施比尝试在每个实例中都自己推出更有用。
许多人建议组织 IPC (ImicroservicesC) 的好方法是通过 Kafka 和 JMS 等查询进行异步通信。
但是如果我需要在服务之间传递大数据文件怎么办?
假设我有一个视频微服务和一个发布者微服务。第一个接收来自用户的视频,验证并将它们发送给 Publisher 进行转换和发布。它的遗忘视频可能是一个非常大的文件,它可能会使消息系统过载(Kafka 根本不适合大消息)。当然,我可以为他们共享一个数据库并通过 Kafka 发送 video_id,但是它耦合了这些服务并且它不再是真正的微服务架构。
你在实践中有没有类似的情况?你是怎么处理的?
谢谢
Hohpe/Wolfe 书中有一个名为 Claim Check Pattern 的企业集成模式解决了这些问题。
基本上,大 blob 从消息中删除并存储在发件人和接收者都可以访问的某个地方,无论是公共文件共享、FTP 服务器、Amazon S3 blob 还是其他任何地方。它在后面留下一个 "claim check":某种描述如何找到 blob 的地址。
然后可以通过 Kafka/JMS 或其他一些消息队列系统传输微小的消息,其中大多数在处理大数据 blob 方面相当糟糕。
当然,一个非常简单的实现是将文件留在文件共享上,仅通过文件路径引用它们。
当最好将 blob 与消息的其余部分集成时,情况会更复杂,需要真正的 Claim Check 实现。这可以在基础架构级别处理,因此消息发送方和接收方不需要知道数据传输背后的任何细节。
我知道您在 Java 环境中,但在 NServiceBus (I work for Particular Software, the makers of NServiceBus) this pattern is implemented with the Data Bus feature 消息管道步骤中。开发人员需要做的就是确定适用于数据总线的消息属性类型,并(在默认文件共享实现中)配置文件存储位置。开发者也可以免费提供自己的数据总线实现。
要记住的一件事是,当 blob 与消息断开连接时,您必须进行清理。如果消息是单向的,您可以在成功处理消息后立即清除它们。使用 Kafka(不是很熟悉)有可能多次处理来自流的消息,对吗?如果是这样,您希望等到无法再处理该消息。或者,如果使用 Publish/Subscribe 模式,您将不想清理文件,直到您确定所有订阅者都有机会被处理。为了实现这一点,您需要在消息上设置 SLA(每条消息必须在其中处理的时间跨度),并在该时间跨度过去后清理 blob 存储。
无论如何,有很多事情需要考虑,这使得在基础架构级别实施比尝试在每个实例中都自己推出更有用。