Akka演员和消息最佳实用

时间:2017-05-21 13:15:27

标签: java akka

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

讯息

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

    1. Actor可以获取meny消息类型,并相应地拆分业务逻辑
    2. .match(POJOA.class, message -> {

      ...

      .match(POJOB.class, message -> {

      ...

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

      1. Actor只接收一种消息类型,并根据消息中的某些ENUM /参数执行所有不同的业务逻辑
      2. if (POJO.getPhase().equals("start"))

        ...

        else ...

        使用的常见做法是什么? 在性能,代码可维护性等方面有什么好处。

1 个答案:

答案 0 :(得分:0)

到目前为止,A,B和C的混合物对我来说非常有效。您希望您的消息尽可能具体(因此它们不言自明),但您仍需要一些通用性。

例如:假设您将actor用作键值存储。

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

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;}

然后bam,类型参数消失了。

但第三种选择是你仍然需要的东西! Akka序列化要求您将序列化程序绑定到类(顶级一级),并且在大多数情况下,您希望为所有消息使用单个序列化程序,因此实现此目的的方法是空的interace:

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
  }
}