Обработка последовательности с помощью Azure Function & Service Bus - PullRequest
1 голос
/ 31 мая 2019

У меня проблема с триггером служебной шины функции Azure.Проблема заключается в том, что функция Azure не может дождаться завершения сообщения перед обработкой нового сообщения.Он обрабатывает параллель, он не ждет 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);
    }

enter image description here

Ответы [ 3 ]

0 голосов
/ 31 мая 2019

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

. Функции 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(...);
}

Вот запись для получения дополнительной информации.

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

0 голосов
/ 20 июня 2019

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

{
"version": "2.0",
"extensions": {
    "serviceBus": {
        "messageHandlerOptions": {
            "maxConcurrentCalls": 1
        }
    }
}}
0 голосов
/ 31 мая 2019

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

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

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

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

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