我想在azure表存储中实现页面视图计数器。如果说两个用户同时访问该页面,并且PageViews的当前值= 100,是否保证更新操作后PageViews = 102?

最佳答案

答案取决于您如何实现计数器。 :-)

表存储没有“增量”运算符,因此您需要读取当前值(100)并将其更新为新值(101)。表存储采用开放式并发,因此,如果您使用.NET存储客户端库自然而然地进行了操作,则当两个进程尝试同时执行此操作时,您很可能会看到异常。流程如下:


进程A读取PageViews的值并接收100。
进程B读取PageViews的值并接收100。
进程A对PageViews进行有条件的更新,这意味着“将PageViews设置为101,只要当前为100。”这样成功了。
进程B执行相同的操作并失败,因为前提条件(PageViews == 100)为false。


收到错误时,显而易见的事情是重复该过程。 (读取当前值,现在为101,并更新为102。)这将始终(最终)使您的计数器具有正确的值。

还有其他可能性,并且我们针对如何实施真正可扩展的计数器进行了完整的Cloud Cover专题:http://channel9.msdn.com/Shows/Cloud+Cover/Cloud-Cover-Episode-43-Scalable-Counters-with-Windows-Azure

如果不太可能发生碰撞,该视频中描述的内容可能会过大。也就是说,如果您的点击率是每秒一秒,则正常的“读取,递增,写入”模式将是安全有效的。另一方面,如果您每秒收到1000次点击,则您想做点更聪明的事情。

编辑

只是想对阅读本文的人进行说明,以使他们理解乐观并发……条件操作实际上并不是“将PageViews设置为101,只要当前是100。”它更像是“将PageViews设置为101,只要它自从我上次查看以来就没有改变过”。 (这是通过使用HTTP请求中返回的ETag来完成的。)

关于azure - azure 表存储中的原子操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11852797/

10-11 18:03