Akka的事件总线是否保证消息顺序?

时间:2014-10-07 10:49:39

标签: java scala akka event-bus

我想保留事件进入公交车的顺序。 例如,如果event1然后event2输入到总线,则订阅的actor将按顺序获取它们。

问题是,如果这种顺序是保证的,那么无论是在集群节点还是单节点演员系统上。

1 个答案:

答案 0 :(得分:3)

如果您在actor系统(system.eventStream)上使用事件流,并且如果您可以保证单个线程正在发布,那么是,将保留该顺序。事件总线的子通道分类风格(与system.eventStream绑定的类型)非常简单。订阅演员列表中有一个Map基本类类型。发布事件时,它会从Map(如果有)获取匹配的订阅者列表,然后将消息发送给每个订阅者。因此,如果只有一个线程正在调用publish,那么它需要完成发布event1(并因此将其传递给所有订户的邮箱),然后再转到event2。 Actors按照收到邮件的顺序处理邮箱(除非您使用的是自定义PriorityMailbox impl),所以先进先出。

现在当然如果你有多个线程,我不能保证这个顺序处理,因为thread1可能首先启动发布,但是线程2可能首先完成它,导致你不按顺序考虑。