Python azure.servicebus.common.errors.ServiceBusConnectionError:未能打开处理程序:无法打开连接上的身份验证会话
我正在使用Azure service bus library for python从队列读取消息。在x段时间之后 我得到以下错误: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
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()