弱一致性的问题

12-03-07 lovejdon
看了BANQ对弱一致性的讨论,引用了PPT里面的卖票的用例。票包含了很多状态。这样可以将一个事物操作表示成一个事物的过程。每一个步骤都有对应的状态。还有一个卖咖啡的例子也是。但是这里有一个问题:利用弱一致性达到大吞吐量和性能提升,但是带来的问题就是弱安全性,我们必须通过一种机制来保证数据一致(最终一致性)。实际弱一致性就是并不一定要在处理过程中保持一致,而是在过程处理完成的时候达到了一致(最终一致即可)。

所以在选择恢复机制的时候是有讲究的。比如undo,retry,give up等等。

但是对于undo ,retry的情况我的疑问就是:因为这两个操作也可能存在异常的情况,那么当异常出现的时候,如何来处理,可能,因为没有了事物的控制,所以又可能带来数据的丢失等情况,比如卖票的情况,到了一个状态 prcessing,然后需要等待用户付款后,然后再更新到saled,但是在更新的时候报错,此时状态仍然是Processing,那么我们需要利用一个操作将processing变为available,但是这个操作也有可能出现失败的危险,所以仍然无法保证,好像到了一个死循环里面一样。

但是可以通过后台一个线程去扫描状态中间状态,将值批量更新回来。但是仍然感觉很奇怪。。不知道这样一种情况该如何处理。

实际本人某些时候还是被数据库事务的思想束缚着。望banq指点迷津。。。。

         

banq
2012-03-07 16:42
2012年03月07日 15:00 "@lovejdon"的内容
为这两个操作也可能存在异常的情况,那么当异常出现的时候,如何来处理, ...

你说的操作异常,是指取出操作这个事件时异常,还是再次执行这个操作时异常呢?

操作是一种事件,将这些事件保存,采取的双击备份等传统可靠性高方式即可。需要回放时,也就是undo 或retry时,将这些事件取出再执行一遍,至于执行时又出错,那么依次再次向前面一步回放。

推荐你看一遍这篇文章:

InfoQ: Transactions without Transactions(没有事务的事务)

里面有你关心的问题,这是讲如何使用事件回放来实现事务的。

[该贴被banq于2012-03-07 16:45修改过]

猜你喜欢