У меня есть цепочка акк Акка K -> L -> M, где K отправляет сообщения L, L отправляет сообщение в M, и каждый может ответить своему предшественнику, используя sender
полученного сообщения.Как очистить/безопасно удалить ссылку из асинхронной цепочки связи
Мой вопрос заключается в следующем: как мы можем безопасно отсоединить L от цепи, чтобы после операции K посылал сообщения непосредственно M, а M видит K как свой sender
?
Если каждый актер был стабильным и долгоживущим, я мог бы разобраться, как сообщить K и M поговорить друг с другом. L мог зависнуть достаточно долго, чтобы пересылать сообщения, уже находящиеся в ее почтовом ящике, до получения сигнала о том, что каждый из K и M больше не разговаривает с L.
Однако K и M также могут подумать о том, чтобы развязать себя, и вот где все становится волосатым.
Есть ли известный протокол для безопасной работы? До сих пор я не нашел правильных условий поиска.
Я знаю, что одним из вариантов было бы заморозить систему и скопировать всю вещь, минус L, в новую цепочку. Тем не менее, я хотел бы реализовать более прерывистое решение в режиме реального времени.
Я думал о каком-то обмене замками, в котором K и M обещают не отсоединиться, пока L не закончит отмену и пересылку всех сообщений. Но любое решение со словом «блокировка» кажется неудобным в асинхронном решении, хотя актеры не будут полностью заблокированы (просто откладывают свои собственные операции разблокировки до удобного времени).
Что вы пытаетесь достичь? Какая большая картина здесь вы ищете, удалив ссылку из асинхронной цепи обмена? –
Будет ли это работать, если вы замените L прокси-сервером с состоянием, который сначала делегирует ваш текущий L для обработки, но в какой-то момент забывает об этом делетете и просто передает сообщения непосредственно между K и M. У вас все еще есть 3 участника, но вы эффективно превращая один из них в no-op в какой-то момент. – erickson
В случае, если вы хотите поменять L с помощью M, ваш актер K может отправить сообщение от Z до L, после чего он может прекратить отправку сообщений и дождаться подтверждения сообщения X.Ваш актер L в случае сообщения Z (если вы используете почтовый ящик на основе приоритета, не забудьте установить ниже обычного приоритета для Z), вы можете отправить подтверждающее сообщение X в K (и, при необходимости, остановить его). После получения X K можно безопасно отправлять сообщения непосредственно на M. Вы можете использовать [FSM] (http://doc.akka.io/docs/akka/snapshot/scala/fsm.html) для реализации государственной логики. –