2015-08-16 2 views
1

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

Управляемые системы идентифицируются по имени (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. Это звучит немного «Hacky», так как те сообщения, по существу, зарезервированы для системы
  2. ли вообще можно восстановить оригинальное сообщение (в моем случае, MonitoringMessage), которое отправляется в почтовый ящик DeadLetter?

Альтернативно, есть ли способ проверить, есть ли абоненты ZERO для определенной «темы»?

ответ

1

То, что вы описали («отправить актера некоторым идентификатором, если он не существует буфер до тех пор, пока не будет создаваться, а затем доставить к этому вновь по требованию создал актер») реализуется в Акку, как Cluster Sharding.

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

+0

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