2016-12-27 1 views
0
  1. В основном используется akka примитив Actor - любые изменения состояния или государственные запросы выполняются исключительно с помощью асинхронных сообщений.Akka: сочетание актера и агент

  2. Akka также предоставляет менее известный примитив Agent, который обновляется асинхронно новым значением (или функцией, изменяющей его значение). Ans могут быть прочитаны синхронно из любого потока.

Вопрос: В одной JVM системы Актер, как совместить эти подходы: есть примитив, который обновляется в асинхронном. только сообщения (например, Actor), но какое состояние может быть прочитано непосредственно в потокобезопасном режиме (например, Agent) ?

Я бы очень признателен за ссылку на любой соответствующий вопрос/проект/образец.

Решения, которые я нашел до сих пор:

  1. Очевидная возможность состоит в том, чтобы иметь Actor обновляющий в Agent. Но мне интересно, есть ли более элегантное решение &.
  2. Scalaz Agent, но было бы предпочтительным решение без зависимостей scalaz.
  3. Полуостровное грязное решение: break Actor Разделение путем публикации (в исходящем сообщении) функции для чтения состояния актера, аналогично Agent.get(). Безопасность резьбы должна выполняться вручную.
  4. Работать вокруг: дайте Actor обновить внешнее общее состояние в . Безопасность резьбы должна выполняться вручную.

ответ

1

Обратите внимание, что агенты были помечены как устаревшим по Akka Team, и будут удалены в следующей версии (вероятно, 2.5.0). This - соответствующий билет.

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

Альтернативным решением может быть использование Актера и асинхронное обращение к его состоянию. Если этот сценарий относится к вам как к сообщению Get, возможно, потребуется дождаться обработки нескольких сообщений Update, вы можете сначала использовать почтовый ящик приоритета для обработки сообщений Get. Пример here.

Смежные вопросы