Azure Триггер функции Servicebus Queue вызывается дважды - PullRequest
1 голос
/ 14 марта 2020

У меня есть функция Azure с ServiceBusTrigger, который вызывается дважды при развертывании в Azure. Это очень легко воспроизвести. Просто создайте новую функцию триггера ServiceBus и добавьте сообщение в очередь.

Вот код для отправки сообщения:

static async Task Main(string[] args)
{
    IQueueClient qc = new QueueClient(_sbConnString, "testing");

    string data = "hello";

    var msg = new Message(Encoding.UTF8.GetBytes(data));

    await qc.SendAsync(msg);
    await qc.CloseAsync();
}

Вот функция:

[FunctionName("TestTrigger")]
public static void Run([ServiceBusTrigger("testing", Connection = "myConnString")]string myQueueItem, ILogger log)
{
    log.LogInformation($"C# ServiceBus queue trigger function processed message: {myQueueItem}");
}

Поток журнала показывает следующее:

2020-03-13T23:51:23.197 [Information] Executing 'Function1' (Reason='New ServiceBus message detected on 'testing'.', Id=1b52f3c0-2497-4473-b5f9-ae406a6dee94)
2020-03-13T23:51:23.198 [Information] Trigger Details: MessageId: 9f2a7af3d4c549bb8202a013c15c0358, DeliveryCount: 1, EnqueuedTime: 3/13/2020 11:51:23 PM, LockedUntil: 3/13/2020 11:51:53 PM
2020-03-13T23:51:23.198 [Information] C# ServiceBus queue trigger function processed message: hello
2020-03-13T23:51:23.198 [Information] Executed 'Function1' (Succeeded, Id=1b52f3c0-2497-4473-b5f9-ae406a6dee94)
2020-03-13T23:51:23.197 [Information] Executing 'Function1' (Reason='New ServiceBus message detected on 'testing'.', Id=1b52f3c0-2497-4473-b5f9-ae406a6dee94)
2020-03-13T23:51:23.198 [Information] Trigger Details: MessageId: 9f2a7af3d4c549bb8202a013c15c0358, DeliveryCount: 1, EnqueuedTime: 3/13/2020 11:51:23 PM, LockedUntil: 3/13/2020 11:51:53 PM
2020-03-13T23:51:23.198 [Information] C# ServiceBus queue trigger function processed message: hello
2020-03-13T23:51:23.198 [Information] Executed 'Function1' (Succeeded, Id=1b52f3c0-2497-4473-b5f9-ae406a6dee94)

Я попытался создать это на Ma c и Windows (VSCode и VS2019 соответственно) и получить одинаковые результаты. Когда я отлаживаю локально на VS2019, триггер вызывается только один раз.

Я также проверил очередь с помощью Service Bus Explorer, и только одно сообщение попадает в очередь. Триггер просто вызывается дважды.

Я что-то упустил? Глядя на временные метки журнала, кажется, что он выполняется параллельно.

1 Ответ

1 голос
/ 14 марта 2020

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

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

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

Вы должны сделать следующее:

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