关于jdon框架 in-memery 模式的状态和线程问题

17-04-03 yxh1122
最近研究了jdon框架的 ES 和 CQRS模式,采用disruptor模式的领域事件使用单线程执行。经过测试jdonframework 源码包中的Match实例项目,在领域事件的1:1消费关系中,component中的onEvent方法执行的业务是单线程执行的(1:N应该一样,没有测试),对于一个领域模型内部的多个事件来说,可能会存在同时有多个事件的消费者执行,也就是一个内存模型会同时有多个线程在执行,会同时修改模型状态,这样对领域模型的共享状态是否会存在干扰,导致冲突?

另外,如果内存中存在几万、几十万乃至上百万的模型对象,按系统并发达到单机每秒1000算,可能会同时需要上万的线程执行,如果使用线程池,想知道jdon框架如何对模型分配线程的?

希望banq大神能够解答下!

[该贴被yxh1122于2017-04-03 17:41修改过]

1
banq
2017-04-04 19:16
不是很明白你的意思,jdon框架的设计思路如下:

前端--->-command ----1:1--->in-memory领域模型聚合根 -----事件-1:N-->事件消费者

command修改聚合根实体状态时是单线程,确保并发时不会扰乱状态。状态改变后发出的事件是1:N,这个事件如果需要更新分布式系统的其他机器上的状态,那么保证事件顺序很重要(通过Kafka),否则更新其他机器上状态会出错。前面command更新的是本地内存中状态。

kof99
2017-04-10 09:14
in-memory如何集群? 有状态的领域对象,单服务器还能控制线程修改,集群下咋整

[该贴被kof99于2017-04-10 09:25修改过]

banq
2017-04-11 09:31
2017-04-10 09:14 "@

kof99

"的内容

有状态的领域对象 ...

in-memory集群有开源Hazelcast(Java),Redis(非Java),和ORacle的coherence。

kof99
2017-04-11 17:29
不是很明白,如果把领域对象放入缓存,它还能执行方法吗? 

banq
2017-04-12 12:25
当执行A a =new A()时,a就在内存in-memory中,只不过不是每次都new A,而是第一次new A以后,将a这个实例着床到缓存实例或容器壁上,以后需要使用a时,从in-memory缓存或容器壁上获取就可以了。

kof99
2017-04-13 16:18
2017-04-12 12:25 "@

banq

"的内容

以后需要使用a时,从in-memory缓存或容器壁上获取就可以了。 ...

如果集群,多台服务器从redis取得a,并发修改状态咋办? 用redis的分布式锁,还是架构上读写分离,读集群,只允许单点写?

banq
2017-04-13 19:48
redis不是Java,只能当数据库使用

yxh1122
2017-05-16 15:03
2017-04-11 17:29 "@

kof99

"的内容

不是很明白,如果把领域对象放入缓存,它还能执行方法吗? ...

领域对象放入缓存只是暂存,将内存当成临时存储的地方,等下次使用时直接从缓存中拿出,免除了对数据库的开销。从缓存拿出后还是原来的内存对象,方法和数据都没有变化

yxh1122
2017-05-16 15:10
2017-04-04 19:16 "@

banq

"的内容

不是很明白你的意思,jdon框架的设计思路如下: ...

首先感谢大家的参与

一个聚合根实体会有多个command来修改状态,单个command是单线程的,多个command那不就是多线程了吗?

比如一个聚合根A,内部有一个属性a,A会有多个commad命令会影响a属性的值,虽然单个command避免了对a的同时修改,但多个command会否出现问题呢?

banq
2017-05-19 21:27
2017-05-16 15:10 "@

yxh1122

"的内容

虽然单个command避免了对a的同时修改,但多个command会否出现问题呢? ...

Jdon框架在command处使用ringbuffer保证某个时刻只能一个command访问。

猜你喜欢