【问题标题】:Akka actors and messages best practicAkka 演员和消息最佳实践
【发布时间】:2017-05-21 13:15:26
【问题描述】:

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

消息

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

常用的做法是什么? 在性能、代码可维护性等方面哪个更好。

【问题讨论】:

  • 这个问题对于 SO 的格式来说有点过于开放/基于意见。我仍然回答了它,但请考虑在未来遵循这些准则:stackoverflow.com/help/how-to-ask

标签: java akka


【解决方案1】:

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

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

你可以有一些通用的 Get/Set/Delete 消息

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

问题是您的 Set 消息。它是类型参数。一些序列化框架并没有让你那么容易。

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

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

然后bam,类型参数不见了。

但是您仍然需要第三个选项! 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
  }
}

【讨论】:

    猜你喜欢
    • 2018-09-29
    • 2014-12-02
    • 2013-11-29
    • 2012-10-09
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-07
    相关资源
    最近更新 更多