假设我有一个包含 3 个应用程序的流 - 一个源、处理器和接收器。
我需要保留从来源收到的消息的顺序。当我收到消息 A、B、C、D 时,我必须将它们作为 A、B、C、D 发送到接收器。(我不能将它们作为 B、A、C、D 发送)。
如果我每个应用程序只有 1 个实例,那么一切都将按顺序运行并保留顺序。
如果每个应用程序有 10 个实例,则消息 A、B、C、D 可能会在不同实例中同时处理。我不知道这些消息会以什么顺序结束。
那么有什么方法可以确保在使用多个实例时保留消息的顺序?
假设我有一个包含 3 个应用程序的流 - 一个源、处理器和接收器。
我需要保留从来源收到的消息的顺序。当我收到消息 A、B、C、D 时,我必须将它们作为 A、B、C、D 发送到接收器。(我不能将它们作为 B、A、C、D 发送)。
如果我每个应用程序只有 1 个实例,那么一切都将按顺序运行并保留顺序。
如果每个应用程序有 10 个实例,则消息 A、B、C、D 可能会在不同实例中同时处理。我不知道这些消息会以什么顺序结束。
那么有什么方法可以确保在使用多个实例时保留消息的顺序?
不; 当您向外扩展时(通过活页夹中的并发性或通过部署多个实例),您将失去秩序。对于任何多线程应用程序都是如此,而不仅仅是 spring-cloud-stream。
您可以使用分区,以便每个实例获取数据的一个分区,但排序仅保留在每个分区内。
如果您的消息中有序列信息,您可以使用Spring Integration Resequencer添加一个自定义模块,将您的消息重新组合回相同的序列 - 但在单个接收器实例之前您需要一个重新排序器的单个实例。