首页 > 解决方案 > Azure 存储队列和消息形状

问题描述

我环顾四周,找不到任何解决此问题的方法,因此,如果我的 Google Fu 失败了,请指出正确的方向。

我们正在使用 Azure 存储队列来触发 Azure Functions (V2) 的执行。(我不认为这种用法是相关的,但我将其包括在内以防万一。)在开发函数的过程中,输入数据的“形状”发生了变化(我正在使用 C# POCO 对象和序列化将它们转换为 JSON 以创建队列消息内容。)

我发现,在将代码更改推送到 Azure 后,存储队列继续以旧对象 JSON 格式向函数发送 JSON 消息——即使提供给存储队列的 JSON 是新格式。

修复很简单——删除队列并让代码重新创建它。但是,这里有很多混乱:

  1. Azure 存储队列将消息作为字符串值,那么为什么要附加一个“模式”呢?我意识到消息最终是在一个CloudQueueMessage对象中提供的,因此可能在幕后发生了某种 JSON 优点。但...
  2. 如果有一个(而且肯定有一个),为什么存储队列会接受并成功处理与该格式不匹配的消息?如果有的话,我希望消息最终会出现在毒队列中,而不是尝试将传入消息“翻译”到模式中。
  3. 有没有办法处理这个“代码”(除了编写一堆我自己的代码来“检查架构”)?
  4. 如果我提供一个简单的字符串值会发生什么?(这对我来说真的比什么都好奇……)

任何人都可以提供/指向我的任何答案将不胜感激。

标签: azureazure-storageazure-functionsazure-storage-queues

解决方案


您可能将消息内容与CloudQueueMessage对象错误。

我们通常在代码中处理的是包含我们要处理的信息的消息内容/文本/正文。在您的情况下,即 C# POCO 和序列化的 Json 有效负载。

当我们在 Azure 存储队列中创建队列消息时,Azure 会填充几个属性。CloudQueueMessage对象由消息内容和这些属性组成。它们用于控制队列消息在我们处理其内容时的行为方式,检查文档以了解它们的用法。

    public static long MaxMessageSize { get; }
    public static TimeSpan MaxVisibilityTimeout { get; }
    public static int MaxNumberOfMessagesToPeek { get; }
    public string Id { get; }
    public string PopReceipt { get; }
    public DateTimeOffset? InsertionTime { get; }
    public DateTimeOffset? ExpirationTime { get; }
    public DateTimeOffset? NextVisibleTime { get; }
    public int DequeueCount { get; }

至于消息内容本身,可以是字符串,也可以是字节数组。当 Azure Function 接收到消息时,我们有几个选项如何填充队列消息,前三个仅获取消息内容。

  • Object - Functions 运行时将 JSON 有效负载反序列化为代码中定义的任意类的实例。
  • 细绳
  • 字节[]
  • 云队列消息

推荐阅读