ответ

5

Вы можете думать о бэкэнде очереди как о реплицированной базе данных. (Я предполагаю, что очереди вы говорите о считают себя прочным:., Когда они принимают сообщение, они гарантируют по крайней мере один разы доставки)

В реплицированных базах данных, бэкенд очереди сообщений использует протокол репликации чтобы убедиться, что сообщение включено, по крайней мере, N хостов перед подтверждением получения отправителю. Обычными протоколами репликации являются протоколы 2PC, 3PC и консенсус, такие как Raft, Multi-Paxos и Chain Replication.

Чтобы отправить сообщение получателю, вы должны выполнить почти ту же репликацию с помощью сообщения об аренде. Сервер очереди резервирует сообщение в течение определенного периода времени; он отправляет сообщение получателю, и если/когда приемник отменяет получение сообщения, сервер удаляет это сообщение. В противном случае серверы отправят сообщение на следующий доступный приемник.

Некоторые очереди сообщений останавливаются там, другие добавляют много колоколов и свистов. SQS - это одна реализация очереди, которая не добавляет много колоколов и свистов, чтобы она могла масштабироваться больше. Это позволяет им, например, очертить очередь, так что одна очередь SQS фактически сделана из многих-даже тысяч из этих очередей, как описано выше. Как я уже сказал, один разработчик SQS спрашивает другое: «Что делает« заказ »означает, когда вы принимаете миллионы сообщений в секунду?»

Это, как говорится, несколько очередей do обеспечивают надежные гарантии заказа. (Я реализовал пару таких типов систем.) Стоимость этого меньше, чем масштабирование. Для поддержания порядка сложности очереди идет вверх. Очередь должна поддерживать упорядоченный журнал всех сообщений и иметь одинаковый порядок репликации на всех серверах. Это намного сложнее, чем неупорядоченная репликация. Упорядоченные системы очередей обычно выбирают ведущий для поддержания заказа, и все сообщения направляются мастеру. Они также склонны использовать более сложные протоколы для репликации.

+0

Спасибо, хороший ответ. – Bohdan

+0

Какая часть системы отменяет аренду сообщения, когда пользователь не передает то, что он арендовал? – Bohdan

+0

@Bohdan Аренда хранится с ttl. Когда серверы очередей ищут сообщение для отправки получателю, они запрашивают те, где ttl либо имеет значение null, либо истек. –

Смежные вопросы