我正在研究基本上是一个高度可用的分布式消息传递系统。系统通过 HTTP 或 TCP 从某个地方接收消息,对其执行各种转换,然后将其发送到一个或多个目的地(也使用 TCP/HTTP)。
系统要求发送到给定目的地的所有消息都是有序的,因为某些消息建立在先前消息的内容之上。这限制了我们按顺序处理消息,每条消息大约需要 750 毫秒。因此,例如,如果有人每 250 毫秒向我们发送一条消息,我们将被迫将消息排在彼此后面。这最终在高负载下的消息处理中引入了无法容忍的延迟,因为每条消息可能必须等待数百条其他消息被处理才能轮到它。
为了解决这个问题,我希望能够在不破坏我们按顺序发送它们的要求的情况下并行化我们的消息处理。
我们可以轻松地横向扩展我们的处理。缺少的部分是一种确保即使消息被无序处理,它们也会被“重新排序”并按照接收顺序发送到目的地的方法。我正在努力寻找实现这一目标的最佳方法。
Apache Camel 有一个叫做 Resequencer 的东西可以做到这一点,它包括一个漂亮的图表(我没有足够的代表直接嵌入)。这正是我想要的:接收乱序消息并将它们排序的东西。
但是,我不希望它是用 Java 编写的,而且我需要高可用性的解决方案(即能够抵抗崩溃或系统重启等典型系统故障),我认为 Apache Camel 不提供这种解决方案。
我们的应用程序是用 Node.js 编写的,使用 Redis 和 Postgresql 进行数据持久化。我们将Kue库用于我们的消息队列。尽管 Kue 提供了优先队列,但对于上述用例来说,功能集太有限了,所以我认为我们需要一种替代技术来与 Kue 协同工作来重新排序我们的消息。
我试图在网上研究这个话题,但我找不到我预期的那么多信息。这似乎是那种会有大量文章和实现的分布式架构模式,但我看不到那么多。搜索诸如“消息重排序”、“乱序处理”、“并行消息处理”等内容的解决方案大多只是放松基于分区或主题等的“有序”要求。或者,他们谈论单台机器上的并行化。我需要一个解决方案:
- 可以以任何顺序同时处理多条消息。
- 将始终按照它们到达系统的顺序发送消息,无论它们是按什么顺序处理的。
- 可从 Node.js 使用
- 可以在 HA 环境中运行(即它的多个实例同时在同一个消息队列上运行而不会出现不一致。)
我们目前的计划对我来说很有意义,但我无法在网上任何地方找到它的描述,它是使用 Redis 来维护按到达时间排序的正在进行和准备发送的消息集。大致来说,它是这样工作的:
- 当收到一条消息时,该消息将放在进行中的集上。
- 消息处理完成后,该消息将放入准备发送集。
- 只要在进行中和准备发送集的前面都有相同的消息,则可以发送该消息并且它会按顺序排列。
我会编写一个小型 Node 库,使用原子 Redis 事务通过优先级队列式 API 实现此行为。但这只是我自己想出来的,所以我想知道:是否还有其他技术(最好使用我们已经使用的 Node/Redis 堆栈)来解决重新排序无序消息的问题? 或者我可以将这个问题用作研究关键字的其他术语吗?谢谢你的帮助!