分布式队列是如何构建的?

How are distributed queues architectured?

使分布式队列运转的架构 patterns/solutions 是什么?

请分享有序和非有序类型。

您可以将队列的后端想象成一个复制的数据库。 (我假设您正在谈论的队列认为自己是 持久:当他们接受消息时,他们保证 至少一次传递 。)

作为复制数据库,消息队列后端使用复制协议来确保在向发件人确认收到之前消息至少在 N 台主机上。常见的复制协议有2PC、3PC以及Raft、Multi-Paxos、Chain Replication等共识协议。

要向接收方发送消息,您必须使用 消息租约 进行几乎相同的复制。队列服务器将消息保留一定时间;它将消息发送给接收者,if/when 接收者确认收到消息,服务器删除消息。否则,服务器会将消息重新发送给下一个可用的接收者。

一些消息队列就此止步,另一些则添加了很多花里胡哨的东西。 SQS 是一种队列实现,它不会添加很多花里胡哨的东西,因此它可以扩展得更多。例如,它允许他们对队列进行分片,以便一个 SQS 队列实际上由许多(甚至数千个)上述队列组成。顺便说一句,我曾经听到一位 SQS 开发人员问另一个 "What does 'ordering' mean when you are accepting millions of messages per second?"

也就是说,一些队列 确实 提供强大的排序保证。 (我已经实现了几个这样类型的系统。)这样做的代价是扩展能力较差。为了保持排序,队列的复杂性会上升。队列必须维护所有消息的有序日志,并在其服务器之间复制相同的顺序。这比无序复制要难得多。有序队列系统通常会选出一个 master 来维护顺序,所有消息都会路由到 master。他们还倾向于使用更复杂的复制协议。