"的内容
消息是有序列的啊.第一次没转完.第二次就不会启动.等第一次都处理利索了.再处理第二次吧.
2013-09-12 07:59 "@banq
"的内容
A作为一个对象,注意不是数据表,对象是有行为的,检查自己余额是否可转账,如果可以,冻结这部分金额,比如转账100元,冻结100元,从余额中扣除。因为外部命令是通过消息顺序进来的,所以下一个消息如果也是扣除,再次检查余额是否足够...... ...
这个有些疑问,比如A发起转账,在转账中我需要判断A账户余额是否满足转账条件,满足后发送转账消息,那么在还没处理消息时,这是的余额是还没有扣除的,那么A又发起了一个转账,假设余额有1000 那么第一次转账为500 第二次为600 ,如果第二次转账的时候还没处理第一次的消息,那么第二次转账是会被发送消息的。
我也有同样的疑惑
public class A {
private volatile int lower, upper; //两个状态值
...
今天又重温了下这个帖子。结合Disruptor的机制和源码,个人理解如下:
虽然外部线程可以保证以MESSAGE的方式通知模型执行自身的行为修改模型状态,但正如道友提问的,多线程同时访问同一模型的时候,如何保证,比如帖子回复中提到的多次转账的问题。
在Disruptor中ringbuffer中的内容是可以多个消费者同时获取的,但是基于不同的类型是对应不同的处理逻辑,实际从全局看,仍然是单线程来处理用户的请求(顺序转账),故能保证其一致性。所以说没有类似DISRUTOR这样的底层机制。就没有了ACTOR模型的实现。
不知理解的是否正确,请BANQ大哥和道友指正!多谢
[该贴被lovejdon于2014-06-22 15:24修改过]
Actor模型不只是Disruptor,还有Akka框架,见这个Akka案例使用“协调事务Coordinated transactions”实现转账的案例,也许会开拓思路。
我也对actor比较疑问,就上面转账问题。1000元的情况,第一次转500,第2次转600的问题。你交到队列里面去判断。那我们整个系统的逻辑部分。怎么写?岂不是都在队列处理的时候做判断了!如果在队列外处理。我的判断就有可能出错。只能保证数据不会出错!但我的判断可能引发其他的逻辑触发!这点怎么处理!还是我理解错了!
实在是不敢恭维楼主。
你贴的那个A类,错误一大堆,而且你发现没,这个类是个死循环。
我也认为开头那个例子是会死循环的!无限嵌套嘛。