Обработка последовательности с помощью Azure Function & Service Bus

У меня возникла проблема с триггером служебной шины функций Azure. Проблема заключается в том, что функция Azure не может дождаться отправки сообщения перед обработкой нового сообщения. Он обрабатывает Parallel, он не ждет 5 секунд, прежде чем получит следующее сообщение. Но мне нужно, чтобы он обрабатывал последовательность (как показано ниже). Как я могу это сделать?

[FunctionName("HttpStartSingle")]
    public static void Run(
 [ServiceBusTrigger("MyServiceBusQueue", Connection = "Connection")]string myQueueItem,
[OrchestrationClient] DurableOrchestrationClient starter,
ILogger log)
    {
        Console.WriteLine($"MessageId={myQueueItem}");
        Thread.Sleep(5000);
    }

введите здесь описание изображения


person TuanDPH    schedule 31.05.2019    source источник
comment
Посмотрите здесь   -  person Dimi Takis    schedule 31.05.2019


Ответы (3)


Я решил свою проблему, используя эту конфигурацию в своем host.json

{
"version": "2.0",
"extensions": {
    "serviceBus": {
        "messageHandlerOptions": {
            "maxConcurrentCalls": 1
        }
    }
}}
person TuanDPH    schedule 20.06.2019

Есть два подхода, которые вы можете выполнить,

(1) Вы ищете Durable Function с function chaining

Для фоновых заданий часто необходимо обеспечить, чтобы одновременно выполнялся только один экземпляр определенного оркестратора. Это можно сделать в устойчивых функциях, назначив конкретный идентификатор экземпляра оркестратору при его создании.

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

person Sajeetharan    schedule 31.05.2019
comment
Он по-прежнему не ждет завершения сообщения перед обработкой нового сообщения. Мой обновленный код в моем вопросе. Пожалуйста, просмотрите его, если я где-то ошибся - person TuanDPH; 31.05.2019
comment

В общем, упорядоченный обмен сообщениями - это не то, к чему я стремился бы реализовать, поскольку порядок может и в какой-то момент будет искажен. Сказав, что в некоторых сценариях это требуется. Для этого вы должны либо использовать устойчивую функцию для организации ваших сообщений, либо использовать служебную шину сеансы обмена сообщениями.

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

public async Task Run(
  [ServiceBusTrigger("queue", 
   Connection = "ServiceBusConnectionString",
   IsSessionsEnabled = true)] Message message, // Enable Sessions
   ILogger log)
{
    log.LogInformation($"C# ServiceBus queue trigger function processed message: {Encoding.UTF8.GetString(message.MessageId)}");
    await _cosmosDbClient.Save(...);
}

Подробнее см. в сообщении.

Предупреждение: использование сеансов потребует отправки сообщений с идентификатором сеанса, что может потребовать изменения на стороне отправки.

person Sean Feldman    schedule 31.05.2019