Python azure.servicebus.common.errors.ServiceBusConnectionError:未能打开处理程序:无法打开连接上的身份验证会话

Python azure.servicebus.common.errors.ServiceBusConnectionError:未能打开处理程序:无法打开连接上的身份验证会话,python,azureservicebus,servicebus,azure-servicebus-queues,Python,Azureservicebus,Servicebus,Azure Servicebus Queues,我正在使用Azure service bus library for python从队列读取消息。在x段时间之后 我得到以下错误: Traceback (most recent call last): File "/opt/anaconda3/lib/python3.7/site-packages/uamqp/authentication/cbs_auth.py", line 76, in create_authenticator self._connection

我正在使用Azure service bus library for python从队列读取消息。在x段时间之后 我得到以下错误:

Traceback (most recent call last):
  File "/opt/anaconda3/lib/python3.7/site-packages/uamqp/authentication/cbs_auth.py", line 76, in create_authenticator
    self._connection.container_id)
  File "./src/cbs.pyx", line 73, in uamqp.c_uamqp.CBSTokenAuth.__cinit__
ValueError: Unable to open CBS link.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/opt/anaconda3/lib/python3.7/site-packages/azure/servicebus/receive_handler.py", line 309, in open
    self._handler.open(connection=self.connection)
  File "/opt/anaconda3/lib/python3.7/site-packages/uamqp/client.py", line 259, in open
    self._build_session()
  File "/opt/anaconda3/lib/python3.7/site-packages/uamqp/client.py", line 214, in _build_session
    on_attach=self._on_attach)
  File "/opt/anaconda3/lib/python3.7/site-packages/uamqp/authentication/cbs_auth.py", line 82, in create_authenticator
    "Please confirm target hostname exists: {}".format(connection.container_id, connection.hostname))
uamqp.errors.AMQPConnectionError: Unable to open authentication session on connection b'SBReceiver-00000000-0000-0000-0000-000000000000'.
Please confirm target hostname exists: b'myhostname.servicebus.windows.net'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/opt/anaconda3/lib/python3.7/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/opt/anaconda3/lib/python3.7/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/path/to/main.py", line 648, in <module>
    main()
  File "/path/to/main.py", line 631, in main
    run_service_bus()
  File "/path/to/main.py", line 482, in run_service_bus
    with my_client.get_receiver() as queue_receiver:
  File "/opt/anaconda3/lib/python3.7/site-packages/azure/servicebus/base_handler.py", line 57, in __enter__
    self.open()
  File "/opt/anaconda3/lib/python3.7/site-packages/azure/servicebus/receive_handler.py", line 318, in open
    self._handle_exception(e)
  File "/opt/anaconda3/lib/python3.7/site-packages/azure/servicebus/base_handler.py", line 131, in _handle_exception
    raise ServiceBusConnectionError(message, exception)
azure.servicebus.common.errors.ServiceBusConnectionError: Failed to open handler: Unable to open authentication session on connection b'SBReceiver-00000000-0000-0000-0000-000000000000'.
Please confirm target hostname exists: b'myhostname.servicebus.windows.net'

正如在评论中所讨论的,这种情况下的问题很可能是由于网络瞬态错误造成的,这在分布式环境中是很正常的。大多数情况下,可以通过重试来恢复暂时性错误。不幸的是,在v0.50.x的旧式python服务总线SDK中,没有现成的重试功能。在中添加了指数退避重试(当前处于预览中,很快将成为GA)。有关详细信息,请参阅。下面是一个使用V7SDK的接收器代码示例(注意:一个sync变体,还有一个asyncio支持,您可以在扩展列表中查看)

V7SDK现在允许您为客户端传递重试参数。虽然默认值一般来说应该足够了

重试\u总数
:允许的重试总数。优先于其他计数。默认值为10

retry\u backoff\u factor
:在第二次尝试后的两次尝试之间应用的退避因子(大多数错误通过第二次尝试立即解决,不会延迟)。在固定模式下,重试策略将一直为{backoff factor}休眠。在“指数”模式下,重试策略将休眠:{backoff factor}*(2**({总重试次数}-1))秒。如果退避系数为0.1,则重试将在两次重试之间休眠[0.0s、0.2s、0.4s,…]。默认值为0.8

重试\u退避\u max
:最大退避时间。默认值为120(以秒为单位)


正如在评论中所讨论的,这种情况下的问题很可能是由于网络瞬态错误造成的,这在分布式环境中是很正常的。大多数情况下,可以通过重试来恢复暂时性错误。不幸的是,在v0.50.x的旧式python服务总线SDK中,没有现成的重试功能。在中添加了指数退避重试(当前处于预览中,很快将成为GA)。有关详细信息,请参阅。下面是一个使用V7SDK的接收器代码示例(注意:一个sync变体,还有一个asyncio支持,您可以在扩展列表中查看)

V7SDK现在允许您为客户端传递重试参数。虽然默认值一般来说应该足够了

重试\u总数
:允许的重试总数。优先于其他计数。默认值为10

retry\u backoff\u factor
:在第二次尝试后的两次尝试之间应用的退避因子(大多数错误通过第二次尝试立即解决,不会延迟)。在固定模式下,重试策略将一直为{backoff factor}休眠。在“指数”模式下,重试策略将休眠:{backoff factor}*(2**({总重试次数}-1))秒。如果退避系数为0.1,则重试将在两次重试之间休眠[0.0s、0.2s、0.4s,…]。默认值为0.8

重试\u退避\u max
:最大退避时间。默认值为120(以秒为单位)


当你说“在x段时间后”,你的意思是你能够成功地处理和完成信息,直到x段时间?查看
错误
,您的连接字符串似乎是错误的,在这种情况下,您应该始终看到此错误。在这种情况下,明显的x周期将是SB客户端的重试连接。我能够正常处理消息。这个x周期是几天。好的。谢谢你的确认。您得到的错误是暂时性错误,这是正常的,应该在重试时恢复。你能告诉我你的版本吗?目前,内置重试功能在(预览中,即将推出GA)中可用。我的当前版本为:0.50.3。好的,据我所知,这将很快提供。你能根据我的问题提供一个使用示例吗?谢谢当你说“在x段时间后”时,你的意思是你能够成功地处理和完成消息直到x段时间吗?查看
错误
,您的连接字符串似乎是错误的,在这种情况下,您应该始终看到此错误。在这种情况下,明显的x周期将是SB客户端的重试连接。我能够正常处理消息。这个x周期是几天。好的。谢谢你的确认。您得到的错误是暂时性错误,这是正常的,应该在重试时恢复。你能告诉我你的版本吗?目前,内置重试功能在(预览中,即将推出GA)中可用。我的当前版本为:0.50.3。好的,据我所知,这将很快提供。你能根据我的问题提供一个使用示例吗?谢谢作为详细答案发布。
sb_client = ServiceBusClient.from_connection_string("primary_connection_string_here")
my_client = sb_client.get_queue("queue_name_here")
    with my_client.get_receiver() as queue_receiver:
        messages = queue_receiver.fetch_next(timeout=3)
        for message in messages:
            message.complete()
servicebus_client = ServiceBusClient.from_connection_string(conn_str=CONNECTION_STR, retry_total=10, retry_backoff_factor=1, retry_backoff_max=30)

with servicebus_client:
    receiver = servicebus_client.get_queue_receiver(queue_name=QUEUE_NAME)
    with receiver:
        received_msgs = receiver.receive_messages(max_message_count=10, max_wait_time=5)
        for msg in received_msgs:
            print(str(msg))
            msg.complete()