Функция Azure ServiceBusTrigger дизайн процессора сообщений - PullRequest
1 голос
/ 13 мая 2019

Фон и текущий дизайн

У меня есть некоторые службы (ASP.Net Core), которые отправляют сообщения в очередь служебной шины Azure. Функция Azure обрабатывает сообщение, используя ServiceBusTrigger, который нацелен на очередь, то есть только одну очередь и ServiceBusTrigger. Свойство Message UserProperties (IDictionary) заполняется записью типа, которая идентифицирует тело сообщения и способ его десериализации (в известный тип) и его обработки. Текущий дизайн кажется немного грубым. Расширение его по сути означает расширение оператора case для включения новых типов сообщений и процессов. Или добавьте больше очередей, каждая из которых посвящена определенному типу сообщений, и каждая с выделенным процессором. то есть одна функция Azure с несколькими ServiceBusTriggers, предназначенными для каждой очереди \ типа сообщения.

Вопрос: есть ли лучший способ сделать это? И какие еще проекты \ архитектуры были успешно использованы?

Ответы [ 2 ]

1 голос
/ 14 мая 2019

Тема-подписка

Я бы хотел расширить ответ @arnumprabhu. Если вы хотите использовать сообщения разных типов, вам следует искать модель Subscription. Таким образом, ваша публикация сообщения в теме и сервисах, на которые вы подписаны, может получить сообщение. Каждая тема может иметь много подписок, и каждая подписка может прослушивать только определенный тип сообщений или все их. например Вы публикуете 3 сообщения. Бронирование подтверждено, оплата обработана, заказ доставлен. У вас есть 3 подписки, которые могут прослушивать любое из указанных выше сообщений или все из них. Скажем, ваша подписка (скажем, имя подписки - «Отслеживание») решает прослушать 2 сообщения BookingConfirmed, PaymentProcessed. Когда сообщение публикуется в теме, ваша подписка получает копию этих сообщений

Функция Azure

Ваша функция Azure может подписаться на подписку (отслеживание) и прослушивать только те сообщения, которые поступили в этой подписке. На очень высоком уровне это может выглядеть примерно так.

[FunctionName("myfunction")]
    public static async void Run([ServiceBusTrigger("topicName", "Subscriptionname", Connection = "ServiceBus")]Message serviceBusMessage, ILogger log)
    {            
        EventStore eS = new EventStore();
        await eS.UpdateData(serviceBusMessage);

        // log.LogInformation($"C# ServiceBus topic trigger function processed message: {mySbMsg}");
    }
public class EventStore
{
    public async Task UpdateData(Message msg)
    {        

        try
        {
            if (msg.Label == "BookingAdd")
            {
                BookingAddIntegrationEvent eventMsg = JsonConvert.DeserializeObject<BookingAddIntegrationEvent>(Encoding.UTF8.GetString(msg.Body));

                string messageType = "BookingCreated";

                BookingCreated bookingCreated = new
                   BookingCreated(eventMsg.BookingId, string.Empty, eventMsg.Id
                   , messageType, eventMsg.CreationDate, eventMsg.Origin, eventMsg.Destination);

                bookingId = eventMsg.BookingId;
                tracking.BookingAdd(bookingCreated);

            }
            else if (msg.Label == "OrderPicked")
            {
                OrderPickedIntegrationEvent eventMsg = JsonConvert.DeserializeObject<OrderPickedIntegrationEvent>(Encoding.UTF8.GetString(msg.Body));

                string messageType = "OrderPicked";

                OrderPicked orderPicked = new
                    OrderPicked(eventMsg.BookingId, eventMsg.Description, eventMsg.Id
                    , messageType, eventMsg.CreationDate);

                bookingId = eventMsg.BookingId;
                tracking.OrderPicked(orderPicked);

            }


        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
}

}

1 голос
/ 13 мая 2019

Если вы хотите, чтобы сообщения обрабатывались от разных клиентов (функций), вы можете воспользоваться подпиской на разделы служебной шины.Темы рекомендуются для нескольких подписчиков.

Вы можете создавать правила для каждой подписки, и на основе настроенных пользовательских свойств и правил сообщения автоматически попадают в соответствующую подписку, из которой можно запускать функции.Проверьте здесь для более подробной информации о Тематические подписки .

...