Как получить обновленное состояние всего кластера Akka.net?
Я создал узел мониторинга в моем кластере akka.net, и я использую cluster.SendCurrentClusterState(Self)
но не все узлы видны сразу, иногда узел покидает кластер, и в то время как в журнале говорится, что узел был удален правильно, состояние сообщает, что узел работает в течение длительного времени.
Каков наилучший / правильный способ получить обновленное состояние всего кластера akka.net?
1 ответ
Есть два важных свойства, о которых стоит помнить, когда дело доходит до состояния кластера:
- Нет такого понятия, как глобальное состояние кластера. Каждый узел имеет свой взгляд на то, как кластер выглядит в данный момент. Это естественный эффект наличия однорангового подхода (поэтому нет единого главного узла, который может установить произвольное состояние).
- Состояние кластера не обновляется сразу. Все состояния создаются для достижения возможной конвергенции, но может пройти некоторое время, прежде чем текущее состояние узла кластера будет сплетничаться с другими.
Простейшим для состояния кластера на данный момент является Cluster.Get(Context.System).State
который содержит информацию об известных на данный момент членах, а также о недоступных узлах.
Другой способ заключается в cluster.Subscribe(Self, typeof(ClusterEvent.IMemberEvent), typeof(ClusterEvent.IReachabilityEvent))
(которые должны быть отписаны, когда актер умирает). Таким образом, вы можете получать уведомления об изменениях состояния кластера по мере их появления.
Относительно долгого времени, необходимого для подтверждения удаленного узла. В зависимости от того, что можно было бы назвать "длинным", это может быть признаком некоторой ошибки. В этом случае было бы замечательно, если бы вы могли установить проблему с шагами воспроизведения.