Обработка сообщений по порядку в бессерверных функциях Azure с использованием приложений логики - PullRequest
0 голосов
/ 01 декабря 2018

Мне нужно обрабатывать входящие сообщения в Azure.Каждое сообщение будет связано с конкретной сущностью, скажем, через свойство EntityId, а сообщения, принадлежащие одной и той же сущности, должны обрабатываться по порядку относительно друг друга.В то же время я хотел бы сохранить безсерверный аспект функций Azure;если бы у меня были постоянные потоки сообщений для 1000 объектов, я бы хотел иметь 1000 одновременных выполнений моей функции.Я не нашел чистого способа достижения этого.Очереди служебной шины имеют сеансы, которые являются наиболее близкой реализацией моих требований, но они не поддерживаются в функциях Azure: https://github.com/Azure/azure-functions-host/issues/563. Однако они, похоже, поддерживаются в приложениях логики Azure.Я подумываю о создании приложения логики Azure, которое запускается очередью служебной шины с использованием сеансов (шаблон «Коррелированная доставка по порядку с использованием сеансов служебной шины»), а затем подключается к инициируемой HTTP функции Azure для обработки сообщений.Единственная цель приложения логики - предотвратить одновременную обработку нескольких сообщений, принадлежащих одному объекту / сеансу.Может ли кто-нибудь дать представление о том, сработает ли этот подход и есть ли какие-либо предостережения?

1 Ответ

0 голосов
/ 03 декабря 2018

Посмотрите на эту статью одного из членов функциональной группы Azure: В обработке событий заказа с помощью функций Azure

Используются Функции Azure и Концентраторы событий Azure :

Концентраторы событий Azure могут обрабатывать миллиарды событий, а имеет гарантии согласованности и упорядоченности для каждого раздела .

Для вашего сценария каждое сообщение, относящееся к одному и тому же EntityId, должно идти в один и тот же раздел.

Хитрость при обработке заказов и независимом масштабировании функции Azure заключается в извлечении пакетов из концентраторов событий исохранить порядок.

Ваша функция должна выглядеть следующим образом:

[FunctionName("EventHubTrigger")]
public static async Task RunAsync([EventHubTrigger("ordered", Connection = "EventHub")] EventData[] eventDataSet, TraceWriter log)
{
    log.Info($"Triggered batch of size {eventDataSet.Length}");
    foreach (var eventData in eventDataSet)
    {
        try
        {
            // Process message in order here.
        }
        catch
        {
            // handle event exception
        }
    }
}

Я бы порекомендовал вам прочитать всю статью, это очень поучительно

Вы можете найти полное решение на Github:

https://github.com/jeffhollan/functions-csharp-eventhub-ordered-processing

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...