问题描述
我遇到akka.net消息发送/发送问题,最终出现在死信队列中。
我使用Akka.Cluster.Tools.PublishSubscribe
开发了一个基于集群的应用程序,其中两个ActorSystems都在同一台计算机的“ console.application”中运行。
我与一些演员一起启动了一个演员系统。然后我开始我的第二。应用程序,并在我初始化Actor系统后立即立即。我将第一条消息Mediator.Tell(new Publish(Topics.Backend.someName,new MyInitialMessage()))
发布到主题所在的主题,接收主题的参与者在第一主题中托管。应用。
此消息始终总是死信队列中。
现在好了,我没有立即发送消息,而是将其延迟时间设置为例如5秒。然后可以正确传递邮件。 在我看来,这是一个握手问题。
问题:我如何找出第二个。演员系统已准备好接收任何消息?
我当前的解决方法是:我每秒基于MyInitialMessage发送调度程序,并等待第二个响应消息发送。应用。然后我知道我的第二。应用现已准备就绪,握手已完成。 但这在我看来只是一种解决方法。什么是解决此问题的合适方法?
chris
解决方法
Akka.Cluster.Tools.PublishSubscribe
在群集上工作。您需要等待集群初始化,然后才能发布任何消息。所有集群操作都封装在Cluster类中,该类可以使用Cluster.Get(actorSystem)
从任何参与者系统创建。为了等待集群初始化:
- 您可以使用await cluster.JoinAsync(address,cancellationToken)以编程方式加入集群-您可以使用它来初始化种子节点(只需使actor系统加入其自身)和新节点。这将需要将HOCON配置中的种子节点留空。
- 如果要通过配置初始化集群(使用HOCON配置文件),则可以使用cluster.RegisterOnMemberUp(callback)注册一个回调函数,以将其余处理推迟到本地actor系统成功加入集群为止。
最快的方式(就性能和资源使用而言)是从特定参与者中订阅集群成员资格事件。实际上,这就是在引擎盖下实际实现上述其他解决方案的方式。
class MyActor : ReceiveActor
{
readonly Cluster cluster = Akka.Cluster.Cluster.Get(Context.System);
public MyActor()
{
Receive<ClusterEvent.MemberUp>(up =>
{
if (up.Member.Address == cluster.SelfAddress)
{
Become(Ready);
}
});
}
protected override void PreStart()
{
cluster.Subscribe(Self,new[]{ typeof(ClusterEvent.IMemberEvent) });
}
protected override void PostStop()
{
// rember to unsubscribe once actor is stopping
cluster.Subscribe(Self);
}
void Ready()
{
// other receiver handlers
}
}