Python v2 Azure函数应用:Azure队列消息不显示问题排查
Azure Python V2函数应用队列异常问题排查
问题现象
- 在VS Code中运行函数时,调用HTTP接口向Azure Queue发送消息,接口返回包含消息ID的成功响应,但消息未实际出现在队列中;
- 相同逻辑在VS Code外(如Jupyter Notebook)运行时,消息可正常显示在队列中。
示例代码
import azure.functions as func from azure.storage.queue import QueueServiceClient, QueueMessage import logging ........ def add_message_to_queue(queue_name, connection_string, message): # 创建QueueServiceClient实例 queue_service_client = QueueServiceClient.from_connection_string(connection_string) # 获取队列客户端 queue_client = queue_service_client.get_queue_client(queue_name) # 发送消息到队列 queue_client.send_message(message) return queue_client.send_message(message) def addTolog_queue(message): queue_name = 'xxxxxxx' connection_string = 'xxxxxxxxxxxx' return add_message_to_queue(queue_name, connection_string, message) @app.route(route="xxxxx", auth_level=func.AuthLevel.FUNCTION) def xxxxxx(req: func.HttpRequest, context: func.Context) -> func.HttpResponse: ............. print(addTolog_queue(log_payload)) return func.HttpResponse( body=json.dumps({}), mimetype="application/json", status_code=200 ) @app.queue_trigger(arg_name="azqueue", queue_name="xxxxxxx", connection="xxxxxx_STORAGE") def queue_trigger(azqueue: func.QueueMessage): logging.info('Python Queue trigger processed a message: %s', azqueue.get_body().decode('utf-8')) que_payload = azqueue.get_body().decode('utf-8') print(que_payload) print("posting") post_log(que_payload)
接口返回的成功响应
{'id': '1f5fe7dd-6d69-45d1-9bf4-86e62a3e4249', 'inserted_on': datetime.datetime(2023, 12, 15, 6, 43, 51, tzinfo=datetime.timezone.utc), 'expires_on': datetime.datetime(2023, 12, 22, 6, 43, 51, tzinfo=datetime.timezone.utc), 'dequeue_count': None, 'content': xxxxxxxxxx, 'pop_receipt': 'AgAAAAMAAAAAAAAACVCVECIv2gE=', 'next_visible_on': datetime.datetime(2023, 12, 15, 6, 43, 51, tzinfo=datetime.timezone.utc)}
排查进展
- 更新1:新建队列后,消息可成功显示在Azure门户的队列中,旧队列存在异常;
- 更新2:移除Queue Trigger函数后,问题消失;重新添加后问题复现,推测问题与同一环境中同时存在消息添加逻辑和队列触发逻辑有关。
修复方案
1. 规避本地触发器的即时消费
本地运行的队列触发器会自动轮询队列并消费消息,刚发送的消息可能立刻被queue_trigger函数取走,导致门户中看不到:
- 临时注释掉
queue_trigger函数代码,或在local.settings.json中添加"AzureWebJobs.queue_trigger.Disabled": true禁用该触发器,再测试消息显示情况; - 给发送的消息设置延迟可见性,预留时间在门户查看:
# 设置消息1分钟后才可见 queue_client.send_message(message, visibility_timeout=datetime.timedelta(minutes=1))
2. 检查触发器的消息处理逻辑
如果post_log函数执行阻塞、报错或未正常完成,会导致消息被锁定(隐藏状态)而非删除,门户中也无法看到:
- 在
post_log中添加完整的日志和异常捕获,确认是否存在执行错误; - 检查队列的可见性超时设置,若处理时间超过默认30秒,消息会重新可见,但持续失败会导致消息反复被锁定。
3. 重置异常队列
针对旧队列的异常状态:
- 使用Azure存储资源管理器清空队列的所有消息(包括隐藏状态的消息);
- 直接重建旧队列(保留原有配置),替换原队列使用。
4. 验证配置一致性
确认VS Code中local.settings.json的存储连接字符串、队列名称,与Jupyter Notebook中使用的完全一致,避免发送到了不同的存储资源。
内容的提问来源于stack exchange,提问作者Riley Cohen
相关产品推荐
相关产品推荐

