1

有人知道将幂等操作设计为天蓝色操作的模式,特别是表存储吗?更常见的方法是生成一个 id 操作并将其缓存以验证新的执行,但是,如果我有十几个工人处理操作,这种方法会更加复杂。:-))

谢谢

4

2 回答 2

1

好的,所以您没有按照knightpfhorcodingoutloud的要求提供示例。也就是说,这是处理幂等操作的一种非常常见的方法:将您需要的操作推送到 Windows Azure 队列。然后,无论您拥有多少个工作角色实例,一次只能有一个实例处理特定的队列项。当从队列中读取队列消息时,它会在您指定的时间内变得不可见。

现在:在处理该消息期间可能会发生一些事情:

  • 您在超时期限后完成处理。当你去删除消息时,你会得到一个例外。
  • 您意识到您的时间不多了,因此您增加了队列消息超时(今天,您必须调用 REST API 来执行此操作;有一天它会包含在 SDK 中)。
  • 出现问题,在您删除消息之前导致您的代码出现异常。最终,消息在队列中再次可见(在指定的不可见超时时间之后)。
  • 您在超时前完成处理并成功删除消息。

这涉及并发性。对于幂等性,这取决于您确保可以重复操作而不会产生副作用。例如,您计算某人的周薪,排队打印作业,并将周薪存储在表格行中。由于某种原因,发生了故障,您要么永远不会删除消息,要么代码在获得删除消息的机会之前中止。

时间快进,另一个工作实例(甚至可能是同一个)重新读取此消息。此时,理论上您应该能够简单地重新执行所需的操作。如果在您的情况下这真的不可能,那么您就没有幂等操作。但是,您可以使用一些机制来帮助您解决此问题:

  • 每个队列消息都有一个 DequeueCount。您可以使用它来确定之前是否已处理过队列消息,如果是,则采取适当的操作(例如,可能检查该员工的表行)。
  • 也许您的处理管道的某些阶段无法重复。在这种情况下:您现在可以修改队列消息内容,而其他人仍然看不到队列消息并由您处理。因此,想象一下添加类似|SalaryServiceCalled的内容。稍后,追加|PrintJobQueued等等。现在,如果您的管道出现故障,您可以在下次阅读您的消息时找出您离开的地方。

希望有帮助。有点在黑暗中拍摄,不知道更多关于你想要达到的目标。

编辑:我想我应该提到我没有看到幂等性和表存储之间的联系。我认为这更像是一个并发问题,因为无论是使用表存储、SQL Azure 还是任何其他存储容器,都需要处理幂等性。

于 2011-11-05T01:15:10.613 回答
0

相信你可以使用Reply log存储的方式来解决这个问题

于 2012-01-12T01:16:07.443 回答