服务总线重试逻辑

ServiceBus Retry Logic

转发 https://github.com/Azure/azure-sdk-for-python/issues/6731#issuecomment-1028393257

我正在测试 ServiceBusClient 上的重试参数,不清楚 if/how 它们是否有效。

我是不是做错了什么,我不明白重试的原理吗?在下面,我预计消息将在 30 秒内传递 3 次。取而代之的是交付 10 次,两次交付之间的间隔约为 150 毫秒。

with ServiceBusClient.from_connection_string(
    CONNECTION_STRING, retry_total=2, retry_backoff_factor=10
) as client:
    with client.get_subscription_receiver(
        topic_name="test", subscription_name="andrew_test"
    ) as receiver:
        for message in receiver:
            logger.debug(
                f"message {message.sequence_number}, delivery count {message.delivery_count}"
            )
            receiver.abandon_message(message)

上述 运行 一条消息的结果 -

11:08:02.721 DEBUG    message 40719, delivery count 0
11:08:02.875 DEBUG    message 40719, delivery count 1
11:08:03.029 DEBUG    message 40719, delivery count 2
11:08:03.183 DEBUG    message 40719, delivery count 3
11:08:03.339 DEBUG    message 40719, delivery count 4
11:08:03.644 DEBUG    message 40719, delivery count 5
11:08:03.799 DEBUG    message 40719, delivery count 6
11:08:03.955 DEBUG    message 40719, delivery count 7
11:08:04.111 DEBUG    message 40719, delivery count 8
11:08:04.269 DEBUG    message 40719, delivery count 9

如何解释 retry_backoff_factor 取决于 retry_mode 参数。默认情况下,它设置为“指数”,设置 retry_mode="fixed" 以获得恒定的重试时间。

重试机制通常只与SDK 中发生的错误相关,例如连接超时。您可以通过设置 retry_total=1, retry_backoff_factor=10, retry_mode="fixed" 关闭您的 Internet 连接 来模拟这一点,然后启动您的代码 - 应该在 10 秒后引发异常。如果您现在将其更改为 retry_total=3, retry_backoff_factor=10, retry_mode="fixed",您将在 30 秒内看到异常,在该时间范围内,客户端已尝试接收消息 3 次。