В настоящее время я внедряю систему, которая получает входящие сообщения от внешней системы мониторинга. Я перевожу эти сообщения в более краткие «события» и использую их для изменения состояния объектов «Управляемая система». 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, но:
- Это звучит немного «хакерски», поскольку эти сообщения по существу зарезервированы для системы.
- Можно ли вообще восстановить исходное сообщение (в моем случае MonitoringMessage), отправленное на почтовый ящик DeadLetter?
В качестве альтернативы есть ли способ проверить, есть ли НУЛЕВЫЕ подписчики на определенную «тему»?