Запуск актеров по запросу по идентификатору в Akka

В настоящее время я внедряю систему, которая получает входящие сообщения от внешней системы мониторинга. Я перевожу эти сообщения в более краткие «события» и использую их для изменения состояния объектов «Управляемая система». Akka Actors казался хорошим вариантом использования для инкапсуляции изменяемого состояния в параллельных приложениях.

Управляемые системы идентифицируются по имени (в 99% случаев это имя хоста). Всякий раз, когда получено правильное событие, система направляет сообщение правильному субъекту на основе свойства имени. Сначала я использовал ActorSelection и полные пути указанных акторов, но это было очень уродливо, и я видел, как несколько человек советовали не полагаться на полное имя актера для доставки сообщения. Итак, я настроил простой EventBus, и это здорово, поскольку теперь я могу просто сделать:

eventBus.subscribe(subscriber1, "/managedSystem01")
eventBus.subscribe(subscriber2, "/managedSystem02")

eventBus.publish(MonitoringEvent("/managedSystem01", MonitoringMessage("managedSystem01", "N", "CPU_LOAD_HIGH", True)))
eventBus.publish(MonitoringEvent("/managedSystem02", MonitoringMessage("managedSystem02", "Y", "DISK_USAGE_HIGH", True)))

Конечно, теперь у меня есть вопрос, должен ли я получать и событие, касающееся управляемой системы, для которой я еще не создал актера (это вполне возможно, я не могу получить абсолютный список управляемых систем, к сожалению ), сообщение будет перенаправлено в почтовый ящик недоставленных сообщений.

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

Я полагаю, что теоретически я мог бы подписаться на сообщения DeadLetter, но:

  1. Это звучит немного «хакерски», поскольку эти сообщения по существу зарезервированы для системы.
  2. Можно ли вообще восстановить исходное сообщение (в моем случае MonitoringMessage), отправленное на почтовый ящик DeadLetter?

В качестве альтернативы есть ли способ проверить, есть ли НУЛЕВЫЕ подписчики на определенную «тему»?


person romatthe    schedule 16.08.2015    source источник


Ответы (1)


То, что вы описываете ("отправить Актеру по некоторому идентификатору, если он не существует, буфер, пока он не будет создан, а затем доставить этому вновь созданному Актеру по запросу"), реализовано в Akka как Разбиение кластера.

Хотя он предназначен в первую очередь для сегментирования нагрузки (работы) в кластере, вы также можете использовать его локально, поскольку ваше требование, по сути, представляет собой уменьшенную (до одного узла) версию проблемы, которую он решает. Он позаботится о запуске новых Актеров, если они не существуют для данного идентификатора и т. д., поэтому вы просто подпишете shard-region на события, и он позаботится о создании актеров для вас.

person Konrad 'ktoso' Malawski    schedule 17.08.2015
comment
Интересно. Я никогда не изучал это, потому что, как вы сказали, это не соответствовало моему варианту использования. Я посмотрю на это! - person romatthe; 18.08.2015