Azure Service Bus队列中的邮件多于发送的邮件

时间:2018-08-07 20:16:59

标签: c# multithreading azure-servicebus-queues

在尝试在天蓝色服务总线中发送到队列时捕获并重试瞬时异常时,与在测试场景中发送超过25,000条消息时相比,我看到的消息数量更多。我希望,如果我确实有多余的消息,那么它们将是第一次实际到达消息总线的某种超时/重试的结果。

我们正在使用.Net Standard Micrososft.Azure.ServiceBus库版本3.0.2

无限循环中的基本逻辑:

  1. 等待发送消息到队列
  2. 成功就打破
  3. 捕获异常并测试它是否是可从重试中受益的短暂异常
  4. 等待1-3秒的随机时间,然后重试
  5. 任何未捕获的异常都由调用者记录。

其他说明-在调试中,我看到许多“ system.timeout”异常,但是在未在调试中运行时无法捕获它们。

  public async Task SendToAzureQueue(Message messageToSend) {

        while (true) {
            try {                    
                await messageSender.SendAsync(messageToSend);
                break;
            }
            catch (Exception ex) when (
                ex is ServerBusyException ||
                ex is ServiceBusCommunicationException ||
                ex is ServiceBusTimeoutException ||
                ex is SessionCannotBeLockedException ||
                ex is SocketException
            ) {
                _logger.Warn($"Transient Exception Thrown. MessageId: {messageToSend.MessageId} - Retrying in 1-10 seconds.\n", ex);
                var randomGenerator = new Random();
                await Task.Delay(randomGenerator.Next(1000, 10000));
            }                
        }
    }

调用函数使用try / catch(例外)包装

这是集成测试的代码,调用上面的代码:

var graphLogObjects = AutoFixture.CreateMany<GraphlogWithNumericId>(30000);

var tasks = graphLogObjects
            .Select(graphLogEntryDto => _jsonSerializer.Serialize(graphLogEntryDto))
            .Select(dataToSend => graphLogMessageQueue.SendToAzureQueue(Message messageToSend));

await Task.WhenAll(tasks);

0 个答案:

没有答案