Cómo implementar una cola de prioridad basada en RabbitMQ
Debido a varias razones, RabbitMQ no ha implementado oficialmente una cola de prioridad hasta ahora, solo ha implementado el procesamiento de prioridad del consumidor.
Sin embargo, debido a varias razones, las colas de prioridad son necesarias a nivel de aplicación, por lo que surge la demanda: cómo agregar funciones de cola de prioridad a RabbitMQ.
Después de consultar la información, descubrí que aunque RabbitMQ no admite oficialmente esta función, la comunidad ya tiene un complemento de cola de prioridad relacionado, y este complemento figura en el sitio web oficial de RabbitMQ.
¿Cómo instalar el complemento?
Ingrese al directorio de instalación de Rabbitmq, ingrese al directorio de complementos, copie el archivo ez anterior al directorio de complementos y luego ejecute el comando para habilitar este complemento.
En centos, la ruta predeterminada es: /usr /lib/rabbitmq/lib/rabbitmq_server-3.3.4/plugins (el número de versión puede cambiar)
En Windows, la ruta predeterminada es: C:\Program Files\RabbitMQ Server\rabbitmq_server- 3.3.4\ complementos (el número de versión puede cambiar)
Copie el archivo ez y luego ejecute el comando de lista de complementos:
Busque el nombre del complemento de la cola de prioridad: Rabbitmq_priority_queue
Ejecutar: Rabbitmq-plugins habilita Rabbitmq_priority_queue
OK, reinicie el servicio RabbitMQ-Server.
De esta forma se completa la configuración del lado del servidor.
Cambios que deben realizarse en el lado del código C#
Echemos un vistazo a la escritura de la biblioteca de clases del cliente:
Primero debemos definir la enumeración de prioridad, que hereda de byte, porque la prioridad del cliente C# de RabbitMQ se pasa en bytes:
Primero defina tres niveles de prioridad: baja, media y alta (de hecho, se pueden definir muchos niveles, solo para simplificar, solo se definen 3 niveles)
Hay dos lugares que deben cambiarse:
Se deben agregar atributos personalizados al declarar la cola
Al enviar un mensaje a Rabbitmq, establezca propiedades personalizadas
IDictionarylt estático interno; string, objectgt; QueueArguments { ?get ?{ IDictionarylt; arguments=new Dictionarylt (); argumentos["x-max-priority "] = 10; //Definir la prioridad de la cola como argumentos de retorno de 10 niveles; ?} }
channel.QueueDeclare("queueName", true, false, false, QueueArguments ); //QueueArguments es lo anterior El diccionario definido
var headers = channel.CreateBasicProperties(); headers.Priority = (byte)msg.Priority //Aquí, la enumeración heredada de byte se convierte en; bytechannel.BasicPublish("exchange ", "route", headers, SerializerUtility.Serialize2Bytes(msg));
Otros aspectos a tener en cuenta
En la instancia de Rabbitmq-server con la cola de prioridad complemento instalado, toda la cola Durable debe configurar el atributo x-max-priority de la manera anterior; de lo contrario, el servicio RabbitMQ-Server fallará
Reimprimir