azure - Azure 存储队列和消息形状
问题描述
我环顾四周,找不到任何解决此问题的方法,因此,如果我的 Google Fu 失败了,请指出正确的方向。
我们正在使用 Azure 存储队列来触发 Azure Functions (V2) 的执行。(我不认为这种用法是相关的,但我将其包括在内以防万一。)在开发函数的过程中,输入数据的“形状”发生了变化(我正在使用 C# POCO 对象和序列化将它们转换为 JSON 以创建队列消息内容。)
我发现,在将代码更改推送到 Azure 后,存储队列继续以旧对象 JSON 格式向函数发送 JSON 消息——即使提供给存储队列的 JSON 是新格式。
修复很简单——删除队列并让代码重新创建它。但是,这里有很多混乱:
- Azure 存储队列将消息作为字符串值,那么为什么要附加一个“模式”呢?我意识到消息最终是在一个
CloudQueueMessage
对象中提供的,因此可能在幕后发生了某种 JSON 优点。但... - 如果有一个(而且肯定有一个),为什么存储队列会接受并成功处理与该格式不匹配的消息?如果有的话,我希望消息最终会出现在毒队列中,而不是尝试将传入消息“翻译”到模式中。
- 有没有办法处理这个“代码”(除了编写一堆我自己的代码来“检查架构”)?
- 如果我提供一个简单的字符串值会发生什么?(这对我来说真的比什么都好奇……)
任何人都可以提供/指向我的任何答案将不胜感激。
解决方案
您可能将消息内容与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 有效负载反序列化为代码中定义的任意类的实例。
- 细绳
- 字节[]
- 云队列消息
推荐阅读
- java - 如何在Java中找到列表的偶数
- r - 你怎么说`[`和`[[`?
- java - 如何创建具有相同超类的多个类型的列表,而不会丢失类型
- javascript - 如何将 Cropper.js 与已经上传到我的服务器的图像一起使用,而不是裁剪然后将图像上传到正确的文件夹
- javascript - 为什么我在 discord.js 中使用此 Slash 命令时收到错误“无效的交互应用程序命令”?
- haskell - 如何获取 Haskell 代码字符串(连同值)
- java - flink-connector-redis 中如何设置 TTL 使 Redis 的 key 过期?
- html - 我正在尝试在 div 中制作响应式图像
- google-maps - GoogleMap addMarker 不能同时具有 setIcon 和 setTag?
- python-asyncio - Monkey 使用 Future 对象修补协程不返回 Future 对象