我有一个具有2个节点的Akka集群,并使用滚动更新策略进行部署。
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
将永远不会收到响应。
答案 0 :(得分:0)
仅从/ u / jrudolph的评论中做出完整的回答,演员A就不会得到答复。由于消息传递是“最多一次”的,因此无论如何都需要对其进行处理。 Actor B可能没有发送响应的潜在原因有很多,而正常关机是一个相对模糊的原因。
任何需要响应的演员都必须具有某种机制来处理无法获得响应的情况。可以是简单的重试,也可以是Akka内置的保证邮件传递(它将自动重试),也可以是任何方法。