Windows Azure登台<--&燃气轮机;造成冲突的生产;表存储上的错误
昨天,当我们试图交换舞台制作角色时,遇到了一个可怕的问题/经历 这是我们的设置: 我们有一个workerrole从队列中提取消息。这些消息是在角色上处理的。(表存储插入、数据库选择等)。每个队列消息可能需要1-3秒的时间,具体取决于他需要发布多少个表存储帖子。当一切完成后,他将删除该消息 交换时出现问题: 当我们的登台项目上线时,我们的生产工作开始出错 当角色想要处理队列消息时,它给出了一个持续不断的“EntityReadyExists”错误流。由于这些错误,队列消息未被删除。这导致队列消息被放回队列并返回处理,等等 当查看这些队列消息并分析它们会发生什么时,我们看到它们实际上已被处理,但未被删除 删除这些错误消息时,问题还没有结束。新的队列消息也没有得到处理,而这些消息还没有得到处理,并且没有添加表存储记录,这听起来很奇怪 当删除暂存和生产并再次发布到生产时,一切都开始正常工作 可能的问题? 我们不知道到底发生了什么Windows Azure登台<--&燃气轮机;造成冲突的生产;表存储上的错误,azure,azure-storage,azure-worker-roles,azure-queues,Azure,Azure Storage,Azure Worker Roles,Azure Queues,昨天,当我们试图交换舞台制作角色时,遇到了一个可怕的问题/经历 这是我们的设置: 我们有一个workerrole从队列中提取消息。这些消息是在角色上处理的。(表存储插入、数据库选择等)。每个队列消息可能需要1-3秒的时间,具体取决于他需要发布多少个表存储帖子。当一切完成后,他将删除该消息 交换时出现问题: 当我们的登台项目上线时,我们的生产工作开始出错 当角色想要处理队列消息时,它给出了一个持续不断的“EntityReadyExists”错误流。由于这些错误,队列消息未被删除。这导致队列消息被放
- 也许两个角色都收到了相同的信息,一个发了帖子,另一个出错了
- 在故障转移系统中生成有害消息?当出列计数超过X时,我们应该删除该队列消息或将其放入单独的“中毒队列”
- 捕获EntityReadyExists错误,然后删除该队列消息或将其放入单独的队列中
- 实际上,我们使用的是GetMessage()
- 队列中的每个项目都是唯一的,并将在表存储中生成唯一的消息。关于这个过程的更多信息:一个用户发布了一些东西,并且必须分发给某些其他用户。从该用户生成的消息将具有唯一Id(guid)。此消息将发布到队列中,并由工作者角色拾取。消息分布在其他几个表上(partitionkey->UserId,rowkey->ticks中的一些时间戳&唯一的消息id)。因此,在正常情况下,几乎不可能发布相同的消息
- 不可见超时可能是一种逻辑解释,因为某些消息可能会分发到10-20个表中。这意味着10-20次插入,而不使用批处理选项。您可以设置或扩展此不可见超时吗
- 由于异常而不删除队列消息也可能是一种解释,因为我们还没有实现任何有害消息故障转移;)李>
一般来说,您确实需要处理有毒消息,因此无论如何都需要实现该逻辑,但我建议您首先找到此问题的根本原因,否则您将在以后遇到更多问题。有几个可能的原因: 您如何读取队列消息?如果您正在执行Peek消息,则在删除该消息之前,其他角色实例(或您的登台环境)仍可以看到该消息。您希望确保您正在使用Get Message,以便在删除该邮件之前,该邮件是不可见的 您的第一个角色是否可能在完成邮件工作后但在删除邮件之前崩溃?这将导致消息再次可见,并被另一个角色实例拾取。在这一点上的消息将是一个有毒的消息,这将导致你