繁体   English   中英

Akka演员和消息最佳实践

[英]Akka actors and messages best practic

我正在尝试了解以下选项之间的权衡和最佳实践(如果有):

消息

  1. 许多消息类(例如MessageClassForActorA,MessageClassForActorB,MessageClassForActorC ....),其中每个类仅具有目标参与者所需的特殊字段。
  2. 上面的选项是所有MessagesClass扩展了存储一些重复字段的基本类。
  3. 一个消息类(例如MotherOfAllMessages ),它包含系统中每个参与者可能需要的所有字段。 每个演员依次使用(获取/设置)此消息中的相关字段

演员

  1. Actor可以获取少量消息类型,并且业务逻辑将相应拆分

.match(POJOA.class, message -> {

...

.match(POJOB.class, message -> {

...

.match(POJOC.class, message -> { ...

  1. Actor仅接收一种消息类型,并根据消息中的某些ENUM /参数执行所有不同的业务逻辑

if (POJO.getPhase().equals("start"))

...

else ...

常用的做法是什么? 在性能,代码可维护性等方面更胜一筹。

到目前为止,A,B和C的混合物对我来说效果很好。 您希望您的消息尽可能具体(这样可以不言自明),但是您仍然需要一定的概括性。

例如:假设您正在使用参与者作为键值存储。

您可以拥有一些通用的“获取/设置/删除”消息

public class Get {String key;}
public class Set<T> {String key; T value;}
public class Delete {String key;}

问题是您的“设置”消息。 它是参数类型。 一些序列化框架使您不那么容易。

因此,您可以将其更改为特定的集合:

public class SetA {String key; A value;}
public class SetB {String key; B value;}

而且,类型参数不见了。

但是您仍然需要第三个选项! Akka序列化要求您将序列化器绑定到一个类(最上层的类),并且在大多数情况下,您希望对所有消息使用单个序列化器,因此实现此目的的方法是空的接口:

public interface Message {}
public class Get implements Message {String key;}
public class SetA implements Message {String key; A value;}
public class SetB implements Message {String key; B value;}
public class Delete implements Message {String key;}

然后在您的配置文件中:

akka.actor{
  serializers {
    mySerializer = xxx
  }
  serialization-bindings {
    Message = mySerializer
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM