2014-10-07 5 views
7

Я хотел бы сохранить порядок событий, введенных в автобус. Например, если event1, а затем event2, где введено в автобус, то подписанный актер получит их в этом порядке.Выполняется ли заказной заказной автобус Akka на заказ?

Вопрос в том, является ли такой заказ гарантией как для кластеризованной, так и для системы с одним узлом.

+0

Я предполагаю, что вы добавляете их из одного потока, иначе все, что вы можете гарантировать, это то, что все слушатели видят тот же порядок. –

+0

@dds В этом разделе речь идет об общении с актерами, но Im интересно о шине событий. –

+1

@PeterLawrey да, издатель одного потока –

ответ

3

Если вы используете поток событий в системе актеров (system.eventStream), и если вы можете гарантировать публикацию одной нити, тогда да, заказ будет сохранен. Классификационный атрибут подканала шины событий (вид, привязанный к system.eventStream), действительно прост. Существует Map в основном типа класса для списка подписчиков. Когда событие публикуется, он получает список подписчиков из Map (если есть), а затем отправляет сообщение каждому из них. Поэтому, если только один поток вызывал publish, ему нужно было закончить публикацию event1 (и, таким образом, доставить его в почтовые ящики всех подписчиков), прежде чем перейти к событию2. Актеры обрабатывают свои почтовые ящики в том порядке, в котором были получены сообщения (если вы не используете пользовательский PriorityMailbox impl), поэтому сначала сначала.

Теперь, конечно, если у вас было несколько потоков, я не могу гарантировать это при обработке заказа, так как thread1 может начать публикацию сначала, но поток 2 может завершить его сначала, что приведет к тому, что вы считаете не по порядку.

Смежные вопросы