Есть ли атомная трансляция в акке?
Мне нужна атомная трансляция, и я хочу использовать кластер Акка.
Я не уверен, есть ли в akka атомная трансляция, поэтому я просто хочу спросить, чтобы быть уверенным.
Я знаю, что есть такие вещи, как DistributedPubSubMediator.SendToAll
так же как Cluster Aware Routers
, Поддерживает ли какой-нибудь общий заказ трансляцию?
Под атомным (общим порядком) вещанием я подразумеваю, что субъект A отправляет широковещательную передачу bA, а субъект B передает широковещательную передачу bB (параллельно и с другого узла). В конце концов, (каждый участник получает сообщение bA до bB) или (каждый участник получает сообщение bB до bA).
2 ответа
Единственная гарантия заказа, предлагаемая Akka, заключается в том, что сообщения отправляются актером. A
актеру B
будет получен для этой пары актеров. Сообщения от других актеров актеру B
могут быть получены до, после или чередуются с сообщениями от A
в B
,
Так что нет, Akka не предоставляет запрашиваемую вами гарантию заказа.
По умолчанию такой гарантии нет, поскольку сообщения отправляются асинхронно. Но вы можете просто использовать посредника X
(любой актер, включая DistributedPubSubMediator
) которая будет вызывать такую гарантию: отправить (bA, recipients)
от A
в X
, Отправить (bB, recipients)
от B
в X
, а также X
следует просто передавать каждое сообщение его получателям (оно будет "атомарным" и последовательным, как это делается внутри одного субъекта).
Если вам нужно сделать это в кластере - вы можете попробовать "Cluster Singleton", чтобы избежать единой точки отказа, пожертвовав высокой доступностью и, возможно, допуском разбиения (вам придется удалить узлы вручную из кластера, чтобы разрешить "P")