push/pop 真的不能作为云服务使用吗?

问题描述 投票:0回答:2

我们正在寻找一种消息队列系统,确保根据消息的行号顺序处理消息。

这似乎是计算的基础部分 - 但我们似乎无法找到它。

这就是我们的意思。

PUSH/POP:从列表中添加和删除项目在代码中很常见(推送/弹出)。这些方法通常确保每个项目仅处理一次(“恰好一次处理”)并且按顺序(序数)。

将其视为云服务似乎难以捉摸。

GOOGLE:Google 代表告诉我们,Pub/Sub 可以保证列表中的项目按顺序发出且仅一次,但不能保证添加到列表中的项目已添加按照您预期的顺序。 (互联网可能很慢 - 或者掉落物品 - 并且订单可能会丢失。)

APACHE:正如我们还被告知的那样,Kafka 不能保证按序数进行恰好一次处理。

结果是两者似乎都部分实现了推送/弹出功能。

是否存在此类云消息队列服务?或者这只是我们必须自己写的东西?

这对于队列处理来说似乎是如此基本和基础,如果它不存在,我们会感到惊讶。


背景示例

假设我有 5 条消息,标记为行号 1 到 5,但它们可能不按顺序到达消息队列。例如,行号为 3 的消息可能会先于行号为 2 的消息到达。消息队列应根据消息的行号按升序将消息转发到服务。此外,如果存在延迟或错误导致行号丢失,我们希望队列暂停处理,直到丢失的消息到达,然后再将后续消息发送到服务。难道真的没有适合这个需求的消息队列系统吗?

message-queue publish-subscribe google-cloud-pubsub
2个回答
0
投票

这对于队列处理来说似乎是如此基本和基础,如果它不存在,我们会感到惊讶。

通常队列本身决定顺序,而不是某些外部系统。


第一个想法是使用 SQL 表作为队列,并始终请求下一个未处理的项目(我们也可以通过索引搜索正确的项目,因为我们总是知道接下来会发生什么)


另一个想法:有 2 个队列:

  • 队列 1 的项目未排序
  • 队列 2 已订购商品
  • 中间是一个消息排序器,它将不适合抓取的项目保留在内存/持久性存储中,并在较早的消息出现时对它们进行排序。

0
投票

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 或其他队列来
触发
该事件完成/查找);

© www.soinside.com 2019 - 2024. All rights reserved.