Ответ, вероятно, зависит от вашего прецедента. Если вы в первую очередь обеспокоены контролируемыми отключениями, то вы можете сообщить актеру перед выключением или обработать зашитые сообщения раньше или сохранить их во временном хранилище, пока актер не перезапустится.
Это не принесет вам много пользы, если система актеров сработает. Чтобы защитить от этого, вы можете просто сохранить сообщение в базу данных, текстовый файл или другой механизм хранения по вашему выбору, вместо использования Stash. Создайте дочернего актера («актер хранения» ниже), чтобы обрабатывать IO для вас (поскольку это потенциально опасная операция).
Родительский субъект имеет (как минимум) два состояния: Listening
и Processing
. В то время как Listening
, он отправляет любые сообщения, которые поступают к актеру хранения, который записывает его в репозиторий. Когда ваша работа бежит, тогда актер Become()
s Processing
.
Когда состояние родительского субъекта изменяется на Processing
, родительские сообщения актора хранения и запросы на отправку всех сохраненных сообщений. Они принимаются и обрабатываются соответствующим образом. Когда актер хранилища отправил все сообщения, которые он имеет, он отправит сообщение Complete
. Затем родительский актер Become()
's Listening
, и цикл начинается.
В других случаях вы можете использовать Akka.Persistence. Это слишком большая тема для обсуждения здесь, но вы можете найти информацию, необходимую для принятия обоснованного решения здесь: http://bartoszsypytkowski.com/how-akka-net-persistence-works/
Другая вещь, которую я бы рассмотрел, заключается в том, действительно ли этот процесс требует пакетной обработки. В системах сообщений существуют некоторые допустимые случаи пакетного использования, особенно при взаимодействии с другими системами, не связанными с сообщением, но если это используется внутри вашей системы, мое первое действие будет состоять в том, чтобы увидеть, можно ли выполнить процесс в режиме реального времени.