Akka 设计Reactive System架构指南(A-Z翻译系列)Part4

第四部分:Akka集群与事件溯源,CQRS,发布/订阅,分布式数据

群集分片是一种重要的强大工具,用于维护actor系统之间的状态。但是让我们进一步考虑加入数据持久化和存储的场景,这时就需引入事件溯源和CQRS(命令查询与职责分离)。随着近来分布式系统使用率的提高,这些特性越来越受欢迎,在Akka中,同样通过持久化和微服务以另一种方式提供了这些特性。

事件溯源和CQRS

figure21.png

继续集群分片的例子,在上图中,Akka持久化用于确保如果我们丢失了节点且必须重建actor的时候,可以使用某种持久的存储来恢复状态。Akka持久化使用事件溯源(通过事件日志)来实现。
当一个命令进入,根据实体ID,通过集群分片,被路由到实现了Akka持久化的Actor。让我们还是来看看银行账户的例子,这种场景需要强一致性:在Akka持久化模式中,有一个负责持久化的(单元),我们只需告诉它:"这里有个存款"即可。
命令是请求做某事,发生在将来。而事件是已经发生的事情。存储的则是事实,已经完成的事情-这个账户接受存款,另外某个账户提取金额(转账的场景)。一旦事件已经持久化在事件日志中,实体再更新状态,增加或减少账户余额。

figure22.png

在图22中,使用了另一个称为Akka持久化查询的功能,它被视作CQRS的查询职责--另一种视角是写入侧和读取侧。写入侧是事件日志,读取侧是可查询的数据存储的地方。因为事件日志本身并不方便查询,所以事件会从事件日志被传播到读取侧。这个过程是非事务的,意味着没有单独的数据库事务来处理,因此需要某些操作来保证事件不会丢失。这个重要的功能内建在Akka持久化查询中了,读取侧会从事件日志中拉取事件,而不是由事件日志端推送事件到读取侧。

发布和订阅

Akka内置了发布和订阅功能来确保命令和事件被正确的处理。在这种情形下,涉及到更多的actor,包括中介actor,发布actor和订阅actor。


figure23.png

如图23,集群中每个节点都有一个中介Actor,有N个订阅actor注册了某个感兴趣的事件。然后由发布Actor来发布事件(例如发送消息). 发布者仅仅发送消息到本地的中介actor。中介actor知道集群在哪,也知道集群中其他节点的中介Actor在哪。
首先收到消息的中介Actor通知集群中其他同行:"这里发布了一个事件,需要人来处理它"。和集群分片中描述的轮询方式一样,每个中介Actor将消息发送给订阅者。这些处理由一系列集群内的消息通知,以及为订阅和发布设计的actor组成。开发者无需担心这些细节,因为本地的中介actor知道如何处理。

分布式数据

Akka持久化关注维护状态以实现强一致性,而Akka分布式数据实现了从集群任意节点的actor上发送最终一致性消息,且无需太多的协作。这是通过无冲突复制数据类型(CRDR)的概念来实现的。对counter,set,map和register这样的数据结构很有用,它们需要低延迟的高读取和写入可用性(分区容差)。


figure24.png

Akka分布式数据对于数据类型有一些限制。例如在最终一致性系统中读取操作可能返回过时的数据。Akka使用分布在集群的其他类型的actor来处理此类问题。在图24中,集群中每个节点都创建了复制actor(Replicator)。
图示中,有一个actor负责在集群中复制K值(K1, K2, K3),节点2还有一个负责更新的Actor。如果负责更新的Actor想要知道K3的值,它将发送一个消息给复制actor。负责更新的Actor不知道环境中的其他任何信息,只是发送消息给本地的复制actor。复制actor从K3得到值然后再回消息给负责更新的Actor。

figure25.png

图25中,情况有所变化,负责更新的Actor请求修改K3的值,但K3的新值必须复制到集群中的所有K3实例。负责更新的Actor发消息给负责复制的actor,而负责复制的actor知道集群内其他节点的同行,所以它转发更新消息给其他同行,由它们各自负责修改本地的K3值。
从开发人员的角度看,只需简单发送一个消息给本地的复制actor;剩下的事情会通过其他一些actor的动作自动完成,不需要额外手动编写代码。

总结

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

推荐阅读更多精彩内容