DDD 领域驱动设计学习(七)- 接口与集成

系统只有在被集成后才会实现业务价值,软件供应商一般而言都比较分散,即使在同一个企业内部的不同团队之间,也容易形成沟通壁垒。这些都会造成后期系统集成的困难。如何高效集成往往也是很多项目执行的痛点。

集成限界上下文(BC)

一个项目中会存在多个BC,业务需要对它们进行集成。有多种直接的方法进行集成。最简单的方式就是一个BC中暴露API,然后在另外一个BC中通过RPC进行调用。另外我们也可以通过消息机制进行集成,系统通过消息队列或者发布-订阅机制进行通讯。第三种方式是通过使用RESTful的方式进行集成。当然,还存在有其他的集成方式。

分布式系统的特征

分布式系统不同于本地的进程内服务调用,RPC的方式解决了远程服务调用和系统垂直扩展问题,但是由此带来的服务调用性能下降和分布式系统的复杂性也会提高很多。
在我们实际的业务中,也遇到过改造一个分布式业务系统的目标,为了赶进度和便于实现,开始阶段是直接把原来内部调用方式修改为了分布式调用方式。结果在项目上,系统整体性能出现了严重下降情况,数据库的性能也出现了严重问题,不得己又对不少接口做了重新设计和整合。
另外采用分布式系统的部署,运维和故障排查难度也大大增加。从单体应用向分布式应用的变化确实不是简单的改变调用方式。从领域设计到系统接口设计需要充分考虑分布式系统的特性。

推荐以下一些分布式计算的原则,网络是不可靠的,要基于这些原则去考虑分布式系统的设计和实现方案:
1. 网络是不可靠的
2. 总会存在时间延迟,有时甚至非常严重
3. 带宽是有限的
4. 不要假设网络是安全的
5. 网络拓扑结构将发生变化
6. 知识和政策在多个管理员之间传播
7. 网络传输是有成本的
8. 网络是异构的

跨系统的信息交换

系统间需要可以交换消息才能实现业务。信息需要能被系统所识别,大多数人会选择一些标准的信息数据结构。以参数或消息的形式传送的信息数据只是机器能读懂的数据接口。有多种方式都可以生成信息数据的结构,例如XML,JSON,或者其他特殊格式。

在使用这些中间格式的时候,我们希望所有这些接口和类的部署到所有的系统中,然后使用工具把这些中间格式转化为类型安全的对象。但是,部署这些接口和类也意味着如果出现了新版本的类和接口,系统双方需要重新编译以保证系统可用和兼容(类似于Dubbo的方式)。另外使用外部对象实际上也违背了DDD的设计原则。即使采用共享内核的方式,对共享对象的访问过于方便,也有可能适得其反。

可以考虑设计一种契约,该契约用于不同系统之间创建可交换的信息接口,消费方使用时候也并不需要反序列化为对象。这种契约便是某种形式的发布语言。这种契约框架一般会对应开放主机服务(OHS) 的关系。

实现方式可以采用流行的RESTful架构,通过REST集成BC,为了增强客户端的自治性,还可以通过定时器或者消息机制来实现暂时解耦。另外还可以在客户方可以采用防腐层(ACL)实现REST的实现的封装和值对象转化。

另外也可以通过消息集成BC,通过领域事件驱动,把消息发送到订阅方去。为了避免消息处理场景中的各种异常和复杂场景,服务端的方法应该尽量采用无状态和幂等的方式来实现。

基于消息的长事务处理

跨系统的集成不可避免会产生长事务的问题,采用消息集成的方式也会存在消息顺序的乱序执行的风险,另外消息传送可靠性也是问题,如何解决这个问题是一个有趣的话题。

以RocketMQ为例(RocketMQ支持事务消息),业务场景采用一个转帐的例子来说明:Bob向Smith转账100块,并且Bob和Smith的账户及余额信息不在同一台服务器上。Bob账户扣100元和Smith账户增加100元就会被拆成两个小事务。两个小事务通过异步消息来同步。

小事务+异步消息
执行本地事务(Bob账户扣款)和发送异步消息应该保证同时成功或者同时失败,也就是扣款成功了,发送消息一定要成功,如果扣款失败了,就不能再发送消息。这种情况下,无论是先发消息还是后发消息都可能存在一致性的问题。RocketMQ支持事务消息,采用新方案如下所示:
RocketMQ事务消息

RocketMQ第一阶段发送Prepared消息,并拿到消息的地址,第二阶段执行本地事物,第三阶段通过第一阶段拿到的地址去访问消息,并修改消息的状态。如果确认消息发送失败了怎么办?RocketMQ会定期扫描消息集群中的事物消息,如果发现了Prepared消息,它会向消息发送端(生产者)确认,Bob的钱到底是减了还是没减呢?如果减了是回滚还是继续发送确认消息呢?RocketMQ会根据发送端设置的策略来决定是回滚还是继续发送确认消息。这样就保证了消息发送与本地事务同时成功或同时失败

回到转账的例子,Bob的账户的余额已经减少,且消息已经发送成功,Smith端开始消费这条消息,这个时候也会出现消费失败和消费超时两个问题,解决超时问题的思路就是一直重试。不过也要考虑适当的限流和熔断机制,否则可能会出现雪崩效应。

但是如果消费失败怎么办?阿里提供给我们的解决方法是:人工解决

参考资料

REST简介

使用DDD来构建你的REST API,而不是CRUD

分布式开放消息系统(RocketMQ)的原理与实践

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,112评论 18 139
  • 第三章 数据库系统 3.1 数据库管理系统的类型 通常有多个分类标准。如按数据模型分类、按用户数分类、按数据库分布...
    步积阅读 2,589评论 0 7
  • 在埃及,遊客就像待宰的小羊一樣,是埃及人眼中的大肥肉。 民間小食店,小餅一個索價20大元,原來當地人只需付5小錢。...
    pannukakku阅读 305评论 1 2
  • 如果经历是伤 回忆都将是岁月里的温暖 1。 去年四月份的时候我和小姨妈(外号)、小敏,骑着共享单车,在环岛路上一边...
    陈大伯说阅读 262评论 0 4
  • 两人对酌山花开,一杯一杯复一杯,我醉欲眠卿且去,明朝有意抱琴来。浪漫诗仙李白,大白话也写的满蕴诗意。苏辛虽为豪放派...
    烛影摇红_阅读 192评论 0 0