我们正在寻找一种消息队列系统,确保根据消息的行号顺序处理消息。
这似乎是计算的基础部分 - 但我们似乎无法找到它。
这就是我们的意思。
PUSH/POP:从列表中添加和删除项目在代码中很常见(推送/弹出)。这些方法通常确保每个项目仅处理一次(“恰好一次处理”)并且按顺序(序数)。
将其视为云服务似乎难以捉摸。
GOOGLE:Google 代表告诉我们,Pub/Sub 可以保证列表中的项目按顺序发出且仅一次,但不能保证添加到列表中的项目已添加按照您预期的顺序。 (互联网可能很慢 - 或者掉落物品 - 并且订单可能会丢失。)
APACHE:正如我们还被告知的那样,Kafka 不能保证按序数进行恰好一次处理。
结果是两者似乎都部分实现了推送/弹出功能。
是否存在此类云消息队列服务?或者这只是我们必须自己写的东西?
这对于队列处理来说似乎是如此基本和基础,如果它不存在,我们会感到惊讶。
背景示例
假设我有 5 条消息,标记为行号 1 到 5,但它们可能不按顺序到达消息队列。例如,行号为 3 的消息可能会先于行号为 2 的消息到达。消息队列应根据消息的行号按升序将消息转发到服务。此外,如果存在延迟或错误导致行号丢失,我们希望队列暂停处理,直到丢失的消息到达,然后再将后续消息发送到服务。难道真的没有适合这个需求的消息队列系统吗?
这对于队列处理来说似乎是如此基本和基础,如果它不存在,我们会感到惊讶。
通常队列本身决定顺序,而不是某些外部系统。
第一个想法是使用 SQL 表作为队列,并始终请求下一个未处理的项目(我们也可以通过索引搜索正确的项目,因为我们总是知道接下来会发生什么)
另一个想法:有 2 个队列:
APACHE:正如我们还被告知的那样,Kafka 不能保证按序数进行恰好一次处理
谁告诉的?
单个分区内是有秩序的。但数据是持久化的,因此如果需要的话,或者如果您不仔细处理偏移量,它“可能”会被多次读取。 offset 决定排序,而不是“记录中的数据(即行号)” 如果不在生产者上启用重试,则在网络故障的情况下也不应重新排序记录批次中的数据。
但是 Pulsar、RabbitMQ、JMS、ActiveMQ、NATS、Mosquito 都存在。肯定有一款符合您的要求。
但最终,您需要一个分布式锁/全局计数器来跟踪需要处理的增量值,然后您可以在一些常规 RDBMS 中回填无序数据 -
SELECT data_to_process FROM queue WHERE status='WAITING' ORDER BY row DESC LIMIT 1;
,然后在
N-1
完成后进行简单的查找处理(您可以使用 Kafka 或其他队列来触发该事件完成/查找);