Windows Azure登台<--&燃气轮机;造成冲突的生产;表存储上的错误

Windows Azure登台<--&燃气轮机;造成冲突的生产;表存储上的错误,azure,azure-storage,azure-worker-roles,azure-queues,Azure,Azure Storage,Azure Worker Roles,Azure Queues,昨天,当我们试图交换舞台制作角色时,遇到了一个可怕的问题/经历 这是我们的设置: 我们有一个workerrole从队列中提取消息。这些消息是在角色上处理的。(表存储插入、数据库选择等)。每个队列消息可能需要1-3秒的时间,具体取决于他需要发布多少个表存储帖子。当一切完成后,他将删除该消息 交换时出现问题: 当我们的登台项目上线时,我们的生产工作开始出错 当角色想要处理队列消息时,它给出了一个持续不断的“EntityReadyExists”错误流。由于这些错误,队列消息未被删除。这导致队列消息被放

昨天,当我们试图交换舞台制作角色时,遇到了一个可怕的问题/经历

这是我们的设置:

我们有一个workerrole从队列中提取消息。这些消息是在角色上处理的。(表存储插入、数据库选择等)。每个队列消息可能需要1-3秒的时间,具体取决于他需要发布多少个表存储帖子。当一切完成后,他将删除该消息

交换时出现问题:

当我们的登台项目上线时,我们的生产工作开始出错

当角色想要处理队列消息时,它给出了一个持续不断的“EntityReadyExists”错误流。由于这些错误,队列消息未被删除。这导致队列消息被放回队列并返回处理,等等

当查看这些队列消息并分析它们会发生什么时,我们看到它们实际上已被处理,但未被删除

删除这些错误消息时,问题还没有结束。新的队列消息也没有得到处理,而这些消息还没有得到处理,并且没有添加表存储记录,这听起来很奇怪

当删除暂存和生产并再次发布到生产时,一切都开始正常工作

可能的问题?

我们不知道到底发生了什么

  • 也许两个角色都收到了相同的信息,一个发了帖子,另一个出错了
可能的解决方案?

我们对如何解决这个“问题”有一些想法

  • 在故障转移系统中生成有害消息?当出列计数超过X时,我们应该删除该队列消息或将其放入单独的“中毒队列”
  • 捕获EntityReadyExists错误,然后删除该队列消息或将其放入单独的队列中
多重角色

我想我们在扮演多个角色时也会遇到同样的问题

非常感谢

编辑2012年2月24日-额外信息

  • 实际上,我们使用的是GetMessage()
  • 队列中的每个项目都是唯一的,并将在表存储中生成唯一的消息。关于这个过程的更多信息:一个用户发布了一些东西,并且必须分发给某些其他用户。从该用户生成的消息将具有唯一Id(guid)。此消息将发布到队列中,并由工作者角色拾取。消息分布在其他几个表上(partitionkey->UserId,rowkey->ticks中的一些时间戳&唯一的消息id)。因此,在正常情况下,几乎不可能发布相同的消息
  • 不可见超时可能是一种逻辑解释,因为某些消息可能会分发到10-20个表中。这意味着10-20次插入,而不使用批处理选项。您可以设置或扩展此不可见超时吗
  • 由于异常而不删除队列消息也可能是一种解释,因为我们还没有实现任何有害消息故障转移;)
无论是暂存还是生产问题,拥有一个处理有毒消息的机制都是至关重要的。我们在Azure队列上实现了一个抽象层,一旦尝试处理消息的次数达到可配置的程度,它会自动将消息移动到有毒队列。

无论是暂存还是生产问题,拥有一个处理有毒消息的机制是至关重要的。我们在Azure队列上实现了一个抽象层,一旦消息被尝试处理了一些可配置的次数,它就会自动将消息移动到有毒队列。

有几个可能的原因:

您如何读取队列消息?如果您正在执行Peek消息,则在删除该消息之前,其他角色实例(或您的登台环境)仍可以看到该消息。您希望确保您正在使用Get Message,以便在删除该邮件之前,该邮件是不可见的

您的第一个角色是否可能在完成邮件工作后但在删除邮件之前崩溃?这将导致消息再次可见,并被另一个角色实例拾取。在这一点上,消息将是一个有毒消息,这将导致您的实例不断崩溃

这个问题几乎肯定与登台vs生产无关,但最有可能是由多个实例从同一队列读取数据引起的。通过指定2个实例,或者将相同的代码部署到2个不同的生产服务,或者使用2个实例在您的开发人员计算机(仍然指向Azure存储)上本地运行代码,您可能会重现相同的问题


一般来说,您确实需要处理有毒消息,因此无论如何都需要实现该逻辑,但我建议您首先找到此问题的根本原因,否则您将在以后遇到更多问题。

有几个可能的原因:

您如何读取队列消息?如果您正在执行Peek消息,则在删除该消息之前,其他角色实例(或您的登台环境)仍可以看到该消息。您希望确保您正在使用Get Message,以便在删除该邮件之前,该邮件是不可见的

您的第一个角色是否可能在完成邮件工作后但在删除邮件之前崩溃?这将导致消息再次可见,并被另一个角色实例拾取。在这一点上的消息将是一个有毒的消息,这将导致你