美文网首页
[翻译]squbs官网之13 消息指南

[翻译]squbs官网之13 消息指南

作者: 乐言笔记 | 来源:发表于2017-10-22 10:13 被阅读11次

    消息指南

    Akka actor通过不可变的消息通信。可以在代码的任何地方定义。当squbs处理跨cube的消息通信时,这些消息必须定义在消息项目(或jar包),这些是这些消息发送者和接收者的依赖。这些消息项目通常在单个包中具有单个文件。

    消息必须定义为不可变的样例类(在你的样例类定义中不要使用变量)或样例对象。消息通常非常简单,不包含逻辑。多个消息样例类或样例对象在一个特别的Scala文件中定义。

    消息jar包不应当有其他依赖。理想情况下,它们都是自包含的。这些消息的发送者和/或接收者不应受到消息引入的额外依赖。

    构建消息

    遵循 Scala 样例类和样例对象模式, 消息的构造非常简单, 不需要对构造函数进行显式调用。样例类隐式产生一个相关的工厂对象,带有适当的apply和unapply方法,这样它们进行模式匹配时非常简单。对于结合Java和Scala实现的工程,推荐使用Scala的样例类申明消息。

    当将消息与数据库对象或其他依赖的基础结构集成时, 通常可以直接从这些类提供消息构造。然而, 我们不能声明关联工厂对象来提供apply方法来构造来自数据库对象的消息。这样做会将消息 jar包 置于此类数据库基础结构的依赖关系之上。因此, 使用该消息的所有其他cube都将受此数据库基础结构的依赖。

    用于消息构造的常见模式是使用数据库 (或其他) 基础结构的cube或包内提供 "Message" 对象。此消息对象提供了一组apply方法, actors将使用它们来构造消息, 例如从可变数据对象。为了从这样的对象构造消息,调用者仅需调用

    targetActorRef ! Message(myDBObject)
    

    这样, 依赖于基础结构的消息的构造将包含在生成此类消息的cube中。此类依赖关系不会泄漏给消息的使用者。

    处理大型、复杂的消息

    在某些情况下, 特别是在数据对象中, 这些对象具有一个类层次结构和重量级构造函数, 在一个简单的样例中不易处理。大量的字段可能远远超过样例类可能的情况,使其不具有字段模式匹配的吸引力。像采购订单、发票这样的复杂消息,通常属于这一类。这些限制仅适用于 Scala 样例类, 而不是 Java bean。

    处理这些复杂对象的策略是提供消息作为声明所有字段的特质。如果存在类层次结构, 子类型也应表示为特质(从适当的超类型继承)。这是在消息项目或 jar 中完成的。

    然后, 原始cube中的消息对象通常会申明这些消息的具体 (或抽象) 实现,从可变数据对象使用合适的构造函数。重要的是确保具体或抽象的实现不提供任何功能, 并且不应声明其他字段 ,除了支持构造的私有字段。实质上,它只实现创建继承特质对象的构造器。

    如果在特质中定义或者继承于特质的字段,在构造器实现中由其它字段派生它的值,这些字段应当设为惰性,以避免初始化时NullPointerException。这是因为特质会尝试在构造时初始化所有字段。派生的字段会引用尚未设置的字段。惰性初始化使这些字段在第一次使用时引用其他字段, 这通常在对象构造之后。

    遵循这个模式,消息仍然是不可变的,并且没有增加对数据库或者其它基础结构的依赖,这些依赖可能会传播到消息的消费者。

    相关文章

      网友评论

          本文标题:[翻译]squbs官网之13 消息指南

          本文链接:https://www.haomeiwen.com/subject/hqhguxtx.html