squbs-11. 消息指南

原文地址:Message Guidelines

Akka actor通过不可变消息交流。这些可以在代码的任何地方被定义。因为squbs跨cube处理消息交互,这些消息将被一个消息项目(或者jar)定义,这个项目是这些消息发送者和接受者的依赖。这些消息项目通常有一个单独的文件在单独的包中。

在Scala中,消息必须被不可变的case class或case object定义(不要在你的case class中使用var)。在Java中,消息必须被不可变的Java bean(带有构造函数、只有getter、无sertter)定义。消息通常非常简单并且不包含逻辑。在特定的Scala文件中声明多个消息case class或者case object。除非使用静态匿名内部类,Java类每个文件需要有一个消息类。

Message jar不需要其他依赖。理想情况下,他们都是自给自足的。这些消息的发送者或接受者不应受制于消息引入的附加依赖的影响。

构造消息

参照Scala的case class和case object模式,构造消息是非常简单的并且不需要显式调用构造函数。Case classes 隐式生成一个关联工厂对象通过apply和unapply方法,使他们可以很简单的进行模式转换。不可变的Java bean具备大多数Scala case class的属性。不过,他们的构造需要关键词new。此外,他们不含 equals()hashcode()的实现。 不过,他们不能使用Sclala的模式匹配和收到限制的Scala模式匹配。对于混合了Java和Scala的实际项目中,推荐Scala case classes(而不是case object) 声明消息。

每当与数据库对象和其他依赖工具与消息集成,通常直接从这些类中提供消息构造。至此,我们必须不能声明相关的工厂对象来提供apply方法来从数据库对象构造消息。这样做将消息会受制于依赖这些database基础(infrastructure)。所有其他使用消息的cube将被这些数据源基础设施依赖影响。

使用message构造的常见模式是使用数据基础设施(或其他)来提供一个 "Message"对象(在cube或package内)。Message对象提供一组apply方法,actor将用来其构造消息,例如从可变数据对象。调用者只需要调用即可从一个对象中构建消息。

Scala:

  targetActorRef ! Message(myDBObject)

Java:

  targetActorRef.tell(Message.apply(myDBObject), getSelf());

基于基础设置的消息的构造方式将被包含在cube生产这些消息内。这些依赖不会泄露给消息的消费者。

处理复杂的,大的消息

在某些例子中,尤其是处理数据对象,这些对象具有层次结构和重量级构造函数以至于难以存在于简单的case class中。字段的数量已远远超出case class中可能存在的数量,使得它不利于使用模式匹配。复杂消息诸如购买订单、发票可归为此类。这些限制只作用在Scala case class而不是Java bean。

处理这种复杂对象的策略是提供作为特性(trait)的消息来声明所有字段。如果有一个具有层次结构的,子类的类,也应该使用traits继承于父类型的参数类型来呈现。这个在消息项目或jar中完成。

于是,这个在源cube的消息对象将通常声明具体(或抽象)消息实现,通过可变对象中的可变函数。重要的是确保具体或抽象实现提供非功能性的和应该声明额外的字段,除非私有来支持构建。在本质上,它只实现构造函数来创建继承trait的对象。

如果trait或任何扩展trait中定义的字段从其他字段中产生,将被设置在构造实现中,这些字段需要被标记为lazy在初始化过程中避免NullPointerException。这是因为trait在构造中尝试初始化所有的字段。这些被产生的字段引用在构造中尚未被设置。懒加载在第一次使用时将这些字段引用到其他字段,在对象构造之后。

遵循这种模式,消息保持不可变并且消息项目不会添加任何依赖在数据源或其他基础设施,以传递到消息消费者依赖链。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容