Изящное отключение, пока актер ждет ответа - PullRequest
0 голосов
/ 17 мая 2019

У меня есть кластер Akka с 2 узлами, и я развертываю его с использованием стратегии непрерывного обновления.

Actor A отправляет сообщение на Actor B и становится поведением, которое ожидает ответа.

Пример Actor A реализация:

class ActorA extends AbstractActor {
    private ActorRef sender;

    static Props props () {
        return Props.create(ActorA.class);
    }

    @Override
    public Receive createReceive() {
        return ReceiveBuilder.create()
                .matchAny(msg -> {
                    sender = getSender();
                    getContext().become(waiting());
                })
                .build();
    }

    private Receive waiting() {
        return ReceiveBuilder.create()
                .matchAny(msg -> sender.tell("COMPLETE", getSelf()))
                .build();
    }
}

Развертывание происходит одновременно, поэтому узел, содержащий Actor A, получает SIGTERM и начинает постепенное завершение работы. Из того, что я понял из документов Akka, изящное завершение работы включает отправку PoisonPill всем актерам на узле.

Так что же происходит с Actor A? Он ожидал ответа от Actor B, но теперь получил PoisonPill. Что происходит, когда Actor B отвечает отправителю?

В моем случае Actor A никогда не получит ответ.

1 Ответ

0 голосов
/ 26 мая 2019

Просто чтобы сделать полный ответ из комментария / u / jrudolph, актер A не получит ответ.К чему он должен быть готов в любом случае иметь дело, так как доставка сообщений происходит "по крайней мере один раз".Существует множество потенциальных причин, по которым субъект B может не отправлять ответ, изящное отключение является относительно неясной причиной.

Любой субъект, которому требуется ответ, должен иметь какой-то механизм для работы в ситуациях, когда он не получаетэтот ответ.Это может быть простая повторная попытка, встроенная гарантированная доставка сообщений Akka (при которой она автоматически повторяется) или любой другой метод.

...