【发布时间】:2012-03-14 00:05:09
【问题描述】:
昨天我们在尝试交换我们的舞台生产角色时遇到了一个可怕的问题/经历。
这是我们的设置:
我们有一个工人角色从队列中提取消息。这些消息在角色上进行处理。 (表存储插入、数据库选择等)。每个队列消息可能需要 1-3 秒,具体取决于他需要创建多少表存储帖子。一切完成后,他会删除该消息。
交换时的问题:
当我们的暂存项目上线时,我们的生产工人角色开始出错。
当角色想要处理队列消息时,它会给出一个恒定的“EntityAlreadyExists”错误流。由于这些错误,队列消息没有被删除。这导致队列消息被放回队列中并返回处理等等......
在查看这些队列消息并分析它们会发生什么时,我们看到它们实际上已被处理但没有被删除。
删除这些错误消息时问题并未结束。新的队列消息也没有处理,而这些还没有处理,也没有添加表存储记录,这听起来很奇怪。
当删除暂存和生产并再次发布到生产时,一切都开始正常工作了。
可能的问题?
我们只有小 2 不知道实际发生了什么。
- 也许两个角色都收到了相同的消息,一个发了帖子,一个出错了?
- ...???
可能的解决方案?
我们对如何解决这个“问题”有一些想法。
- 制作有害消息故障转移系统?当出队计数超过 X 时,我们应该删除该队列消息或将其放入单独的“毒队列”中。
- 捕获 EntityAlreadyExists 错误并删除该队列消息或将其放入单独的队列中。
- ...????
多个角色
我想我们在设置多个角色时会遇到同样的问题?
非常感谢。
编辑 24/02/2012 - 额外信息
- 我们实际上使用 GetMessage()
- 队列中的每个项目都是唯一的,并且会在表 Storage 中生成唯一的消息。关于这个过程的更多信息:用户发布了一些东西,并且必须分发给某些其他用户。从该用户生成的消息将具有唯一的 Id (guid)。此消息将被发布到队列中并由工作角色拾取。消息分布在其他几个表中(partitionkey -> UserId、rowkey -> 一些时间戳记和唯一消息 ID。因此,在正常情况下几乎不可能发布相同的消息。
- 隐形超时可能是合乎逻辑的解释,因为某些消息可能会分发到 10-20 个表格。这意味着没有批处理选项的 10-20 插入。你能设置或延长这个隐身时间吗?
- 由于异常而未删除队列消息可能也是一种解释,因为我们还没有实施任何有害消息故障转移;)。
【问题讨论】:
-
最新的队列实现确实允许您更改可见性超时。 msdn.microsoft.com/en-us/library/windowsazure/hh452234.aspx
标签: azure azure-storage azure-worker-roles azure-queues