Mecanismo confiable de almacenamiento de mensajes .Net Core y RabbitMQ

punto de tránsito de mensajes

El productor envía un mensaje a RabbitMQ. Si el conmutador puede hacer coincidir la cola según su propio tipo y RoutingKey, se almacenará en la cola correspondiente. Se perderá o se enviará de vuelta al productor, según la configuración del mensaje del productor.

  • Si el productor establece Obligatorio y es verdadero, el mensaje se devolverá al productor.

  • Cuando el productor establece Obligatorio o falso, para evitar la pérdida de mensajes, el conmutador se puede enrutar al conmutador de respaldo para que sea responsable del almacenamiento.

Obligatorio

Cuando el productor envía un mensaje, puede establecer un parámetro obligatorio para determinar la dirección del mensaje si el conmutador no puede encontrar una cola adecuada según su propio tipo y RoutingKey después de que el mensaje llegue a RabbitMQ.

  • Cuando obligatorio es verdadero, el mensaje se devuelve al productor.

  • Cuando obligatorio es falso, el mensaje se descarta.

 código de productor

Cuando se establece obligatorio en verdadero en el parámetro del método BasicPublish y la cola aún no se ha declarado, solo hay un interruptor y se devolverá el mensaje.

var connFactory = new ConnectionFactory
{
    HostName = "xxx.xxx.xxx.xxx",
    Port = 5672,
    UserName = "rabbitmqdemo",
    Password = "rabbitmqdemo@test",
    VirtualHost = "rabbitmqdemo"};
using (var conn = connFactory.CreateConnection())
{
    using (var channel = conn.CreateModel())
    {
        var exchangeName = "mandatory_publishsubscribe_exchange";
        channel.ExchangeDeclare(exchange: exchangeName, type: "fanout");
        while (true)
        {
            Console.WriteLine("消息内容(exit退出):");
            var message = Console.ReadLine();
            if (message.Trim().ToLower() == "exit")
            {
                break;
            }

            var body = Encoding.UTF8.GetBytes(message);
            channel.BasicPublish(exchange: exchangeName, routingKey: "", mandatory: true, basicProperties: null, body: body);
            Console.WriteLine("消息内容发送完毕:" + message);
        }
    }
}

El productor envía un mensaje, el intercambio recibe el mensaje pero no hay una cola correspondiente y se devuelve el mensaje.

 Para saber intuitivamente que el mensaje ha sido devuelto al productor, podemos agregar un oyente para monitorear el mensaje devuelto.

Escuche los mensajes de respaldo

Cuando obligatorio se establece en verdadero, el mensaje se puede escuchar cuando el mensaje retrocede

channel.BasicReturn += new EventHandler<RabbitMQ.Client.Events.BasicReturnEventArgs>((sender, e) =>
{
    var message = Encoding.UTF8.GetString(e.Body.ToArray());
    Console.WriteLine($"收到回退消息:{message}");
});

El productor envía un mensaje, porque no hay una cola coincidente, el mensaje se devuelve y el mensaje devuelto se puede ver intuitivamente.

 

 interruptor de respaldo

Cuando obligatorio se establece en falso, los mensajes se pierden, lo que no es una buena situación. Se puede usar un interruptor de respaldo para almacenar mensajes que se iban a descartar y para obtener estos mensajes cuando sea necesario. De hecho, no hay nada especial en el interruptor de respaldo, es el mismo que el interruptor principal y solo actúa como respaldo.

 código de productor

  1. Al crear un interruptor maestro, proporcione el argumento del parámetro, configure el interruptor de respaldo del interruptor maestro y especifique el nombre del interruptor de respaldo.

  2. Luego declare un intercambio de respaldo y vincule una cola para almacenar los mensajes descartados.

  3. El parámetro obligatorio se establece en falso al enviar el mensaje.

var connFactory = new ConnectionFactory
{
    HostName = "xxx.xxx.xxx.xxx",
    Port = 5672,
    UserName = "rabbitmqdemo",
    Password = "rabbitmqdemo@test",
    VirtualHost = "rabbitmqdemo"};
using (var conn = connFactory.CreateConnection())
{
    using (var channel = conn.CreateModel())
    {
        var exchangeName = "aedemo_publishsubscribe_exchange";
        var alternateExchangeName = "aedemo_ae_publishsubscribe_exchange";
        var arguments = new Dictionary<string, object>
        {
            { "alternate-exchange", alternateExchangeName }
        };
        channel.ExchangeDeclare(exchange: exchangeName, type: "fanout", arguments: arguments);
        channel.ExchangeDeclare(exchange: alternateExchangeName, type: "fanout");

        var alternateExchangeQueueName = alternateExchangeName + "_worker";
        channel.QueueDeclare(queue: alternateExchangeQueueName, durable: false, exclusive: false, autoDelete: false, arguments: null);
        channel.QueueBind(queue: alternateExchangeQueueName, exchange: alternateExchangeName, routingKey: "");

        while (true)
        {
            Console.WriteLine("消息内容(exit退出):");
            var message = Console.ReadLine();
            if (message.Trim().ToLower() == "exit")
            {
                break;
            }

            var body = Encoding.UTF8.GetBytes(message);
            channel.BasicPublish(exchange: exchangeName, routingKey: "", mandatory: false, basicProperties: null, body: body);
            Console.WriteLine("消息内容发送完毕:" + message);
        }
    }
}

Inicie el programa y podrá ver desde el panel web que se han creado tanto el interruptor maestro como el interruptor de respaldo, y el interruptor maestro está marcado con una marca AE.

El productor envía un mensaje, después de que el conmutador principal lo empareja pero sin una cola adecuada, se reenvía al conmutador de respaldo y se enruta a su cola para su almacenamiento.

 Nota: Se recomienda utilizar un conmutador Fanout. Si otros conmutadores, como Direct, cuando el conmutador maestro reenvía al conmutador de respaldo, al coincidir, si la RoutingKey dada del mensaje no coincide con la cola correspondiente, el mensaje se perderá. De esta manera, inicialmente las predicciones se han desviado.

Persistencia

Cuando RabbitMQ se encuentra en condiciones anormales, como tiempo de inactividad del sistema, reinicio, apagado, etc., puede provocar la pérdida de datos y reducir la confiabilidad. En respuesta a esta situación, RabbitMQ proporciona un mecanismo de persistencia que guarda el mensaje y los metadatos (colas, conmutadores, información de vinculación) en el disco. Específicamente dividido en tres tipos de persistencia.

  • cambiar la persistencia

  • persistencia de la cola

  • persistencia del mensaje

cambiar la persistencia

Cuando RabbitMQ encuentra una situación anormal (como un reinicio del servicio), si la persistencia del conmutador no está configurada, los datos relacionados con el conmutador se perderán y el productor fallará al enviar un mensaje al conmutador especificado.

Excepción de reinicio del servicio

1. Cree un nuevo interruptor en la Web y especifique el modo no persistente.

 2. Cree una nueva cola y especifique el modo no persistente.

 3. Establezca la relación vinculante entre el conmutador y la cola.

 4. La parte frontal del productor envía mensajes normalmente.Después de que el servicio se reinicia en el medio, el interruptor, la cola y la relación de enlace se borran, y el productor continúa enviando mensajes y ocurre una excepción.

  

Configuración de persistencia

Puede especificar que el parámetro duradero se establezca en verdadero al declarar el cambio (también se puede establecer en el panel web).

channel.ExchangeDeclare(exchange: exchangeName, type: "fanout", durable: true, arguments: null);

El servicio RabbitMQ se reinicia y el productor continúa enviando mensajes al conmutador.

 

persistencia de la cola

La persistencia de la cola consiste en establecer el parámetro duradero en verdadero cuando se declara la cola. Si la cola no es duradera, después de una situación anormal (como un reinicio del servicio), los metadatos de la cola se perderán y los mensajes almacenados en él también se perderán.

Excepción de reinicio del servicio

1. Cree un conmutador en la Web y configúrelo en modo persistente.

2. Cree una cola y configúrela en modo no persistente

3. Establezca la relación vinculante entre el conmutador y la cola.

4. La parte frontal del productor envía mensajes normalmente. Después de que el servicio se reinicia en el medio, la cola y la relación vinculante se borran, y la producción continúa enviando mensajes. Si la cola coincidente falla, el mensaje se devuelve al productor.

Configuración de persistencia

Al declarar la cola, puede especificar que el parámetro duradero se establezca en verdadero (también se puede establecer en el panel web).

channel.QueueDeclare(queue: queueName, durable: true, exclusive: false, autoDelete: false, arguments: null);

El servicio RabbitMQ se reinicia y el productor continúa enviando mensajes al conmutador.

persistencia del mensaje

La persistencia de la cola solo puede garantizar que sus propios datos no se perderán, pero no se puede garantizar que los mensajes almacenados en ella no se pierdan.

Configuración de persistencia

Es necesario configurar la persistencia del mensaje para garantizar que el mensaje en sí no se pierda debido a condiciones anormales (como el reinicio del servicio). Al enviar un mensaje, puede establecer las propiedades básicas del mensaje para admitir la persistencia del mensaje.

var basicProperties = channel.CreateBasicProperties();
basicProperties.DeliveryMode = 2;// 1非持久化 2持久化
channel.BasicPublish(exchange: exchangeName, routingKey: "", mandatory: true, basicProperties: basicProperties, body: body);

De esta forma, cuando hay una situación anormal (como después de que se reinicia el servicio), el mensaje aún existe.

 Nota: la persistencia de mensajes afectará el rendimiento y solo garantizará la persistencia de mensajes valiosos para equilibrar la confiabilidad y el rendimiento.

Supongo que te gusta

Origin blog.csdn.net/qq_41872328/article/details/126785876
Recomendado
Clasificación