RabbitMQ - транзакционная публикация - PullRequest
0 голосов
/ 20 января 2020

У меня есть получатель, который получает сообщение, ведет внутренний лог c и отправляет следующую очередь сообщений. Эти сообщения не могут быть отправлены дважды.

Пример кода: (C# потребитель / производитель, использующий RabbitMQ)

            BasicDeliverEventArgs deliverEventArgs = _subscription.Next();

            // Deserialize message
            string message = Encoding.UTF8.GetString(deliverEventArgs.Body);

            // Some logic that will create the message's to forward
            string[] messagesToForwardToNextListner = message.Split(',');

            for (int i = 0; i < messagesToForwardToNextListner.Length; i++)
            {
                IBasicProperties props = _model.CreateBasicProperties();
                props.Persistent = true;

                // Serialize message
                byte[] messageToForward = Encoding.UTF8.GetBytes(messagesToForwardToNextListner[i]);

                _model.BasicPublish("ForwardExchange", "", props, messageToForward);
            }

            _subscription.Ack(deliverEventArgs);

Два вопроса:

  1. Как можно я отправляю все сообщения в транзакции в RabbitMQ, чтобы избежать частичной публикации sh? Например: у меня есть 3 сообщения для отправки.

отправка M1 => Успех,

отправка M2 => Успех,

отправка M3 => Application Cra sh или сервер cra sh

Если программа пробьет sh между Ack и концом l oop, как я могу избежать повторной отправки этих сообщений на кролик-сервер? Есть ли идентификатор сеанса, который может помочь?
...