/
Priority Queue Pattern

Priority Queue Pattern

Problem

  • To handle tasks efficiently based on their priority, workloads need a mechanism to prioritize and execute tasks accordingly.

    • Workloads process tasks in the order they arrive, using a first-in, first-out (FIFO) queue structure.

 

Solution

  • Application sending a message to the queue assigns a priority to the message, and consumers process the messages by priority.

  • There are 2 approaches :

    • Single queue : All messages are sent to one queue and each message assigned a priority → application (producer) assigns a priority to each message and sends the message to the queue.

    • Multiple queue : Separate queues are used for each message priority.

image-20240827-153038.png
Single Queue : Diagram from Microsoft Documentation

Priority Queue In Practice

image-20240827-155228.png

Example of code in C# : sending message as Priority Low and High

using System; using System.Threading.Tasks; using Azure.Messaging.ServiceBus; using Microsoft.Azure.WebJobs; namespace PriorityQueueSender { public static class PriorityQueueSenderFn { [FunctionName("PriorityQueueSenderFunction")] public static async Task Run( [TimerTrigger("0,30 * * * * *")] TimerInfo myTimer, [ServiceBus("messages", Connection = "ServiceBusConnection")] IAsyncCollector<ServiceBusMessage> collector ) { for (int i = 0; i < 10; i++) { var messageId = Guid.NewGuid().ToString(); var lpMessage = new ServiceBusMessage() { MessageId = messageId }; lpMessage.ApplicationProperties["Priority"] = Priority.Low; lpMessage.Body = BinaryData.FromString($"Low priority message with Id: {messageId}"); await collector.AddAsync(lpMessage); messageId = Guid.NewGuid().ToString(); var hpMessage = new ServiceBusMessage() { MessageId = messageId }; hpMessage.ApplicationProperties["Priority"] = Priority.High; hpMessage.Body = BinaryData.FromString($"High priority message with Id: {messageId}"); await collector.AddAsync(hpMessage); } } } }