Может ли кто-нибудь объяснить, что происходит за кулисами в кластере RabbitMQ с несколькими узлами и очередями зеркальным способом при публикации на подчиненный узел?Поведение кластеров и зеркальных очередей RabbitMQ за кадром
Из того, что я читал, кажется, что все действия, кроме опубликования, идут только к ведущему, а ведущий затем передает действие действий подчиненным (это из документации). Формулируйте мое понимание, это означает, что потребитель всегда будет потреблять сообщение из главной очереди. Кроме того, если я отправлю запрос подчиненному устройству для потребления сообщения, этот ведомый будет выполнять дополнительный прыжок, перейдя к мастеру для получения этого сообщения.
Но что происходит, когда я публикую на подчиненном узле? Будет ли этот узел делать то же самое, что и сначала отправить сообщение хозяину?
Кажется, что есть много лишних прыжков при работе с рабами, поэтому, похоже, вы могли бы улучшить производительность, если знаете только мастера. Но как вы справляетесь с мастер-неудачей? Тогда один из рабов будет избран мастером, поэтому вы должны знать, к чему подключиться?
Прошу об этом, потому что мы используем кластер RabbitMQ с HAProxy спереди, поэтому мы можем отделить структуру кластера от наших приложений. Таким образом, всякий раз, когда узел завершается, HAProxy перенаправляется на живые узлы. Но у нас есть проблемы, когда мы убиваем один из узлов кролика. Соединение с кроликом является постоянным, поэтому, если это не удается, вы должны его воссоздать. Кроме того, вы должны повторно отправить сообщения в этом случае, иначе вы потеряете их.
Даже со всем этим сообщения все еще могут быть потеряны, поскольку они могут быть в пути, когда я убиваю узел (в некоторых буферах, где-то в сети и т. Д.). Таким образом, вам необходимо использовать транзакции или подтверждения издателя, которые гарантируют доставку после того, как все зеркала были заполнены сообщением. Но вот еще одна проблема. Возможно, у вас есть повторяющиеся сообщения, потому что брокер мог отправить подтверждение, которое никогда не достигало производителя (из-за сбоев сети и т. Д.). Поэтому потребительские приложения должны будут выполнять дедупликацию или обрабатывать входящие сообщения в идемпотентном порядке.
Есть ли способ избежать этого? Или я должен решить, могу ли я потерять пару сообщений против дублирования некоторых сообщений?
Спасибо, Пол. Вы бог. Чтобы убедиться, прежде чем я перейду к реализации, вы можете подтвердить это: 1) Я могу использовать все еще использование HAProxy, и издатель подтверждает, и я не потеряю никакого сообщения. У меня будут повторяющиеся сообщения, которые мне нужно как-то удалить. У меня будут проблемы с производительностью (из-за дополнительных переходов к мастеру при первом доступе к ведомым устройствам), но мои данные будут «пуленепробиваемыми». 2) Чтобы повысить производительность, я создам службу мониторинга, поэтому каждый раз я буду отправлять запросы только мастеру, но мне все равно нужно иметь дело с дубликатами. Благодарю. –
Вы все еще можете использовать HAProxy, но вы будете нести дополнительные сетевые перелеты с круговой конфигурацией. Если вы хотите добиться равномерной балансировки нагрузки, прочитайте это: http://insidethecpu.com/2014/11/17/load-balancing-a-rabbitmq-cluster/ Очень маловероятно, что у вас будут повторяющиеся сообщения.Я думаю, что установить свойство message-ttl достаточно, чтобы удалить дубликаты, хотя добавление ссылочного тега, как я упоминал, решит проблему. Я выпущу библиотеку RabbitMQ на C#, которая вскоре выберет все вышеперечисленное. Следите за моим блогом за обновлениями. –
На самом деле у меня были дублирующие сообщения. Я проверил пару раз, публикуя 10000 сообщений для кластера с двумя узлами. Я убил один узел, и я получил 10011-10012 сообщений. Один из моих потребляющих API - идемпотент, так что конечный результат был в порядке. Большое спасибо. –