You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 更新1:新建队列后,消息可成功显示在Azure门户的队列中,旧队列存在异常;
  2. 更新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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 01:36:01