10 月 23 - 25 日,QCon 上海站即将召开,现在购票,享9折优惠 了解详情
写点什么

Vaughn Vernon 使用反应式 DDD 对微服务中的不确定性建模

  • 2017-10-12
  • 本文字数:1135 字

    阅读完需:约 4 分钟

微服务和反应式模型虽然很强大,但也带来了不确定性。开发人员总是对消息驱动的系统持有疑问:

  • 有人接收到我发出的消息了吗?
  • 他们对消息做出回应了吗?
  • 消息的顺序会不会被打乱了?

Vaughn Vernon 在 DDD 探索大会的演讲中提到,DDD 是回答上述问题的基础。使用通用语言( Ubiquitous Language )来描述由边界上下文( Bounded Context )组成的系统可以降低分布式系统的复杂度。不确定性应该成为通用语言的一部分,比如边界上下文之间的交互问题。

Vernon 是“ Implement Domain Driven Design ”和“ Reactive Messaging Patterns with the Actor Model ”的作者,他认为为项目创建好上下文映射是至关重要的。从实际情况来看,业务的核心领域总会包含多个边界上下文,而上下文映射体现了边界上下文之间的关系。在建立上下文映射关系时,要专注在团队之间的关系上,而不是去关注技术细节,比如究竟是使用 REST 还是使用 RPC。Vernon 说,“集成对象比如何集成更加重要”。

Vernon 看到了反应式系统的发展趋势,反应式行为存在于微服务之中,同时又超越了微服务。这并非什么新概念,他说, Eric Evans 早就在业界推广事件模式。其核心思想就是对过去发生的事件作出反应,进而达到和谐的状态。

微服务和反应式行为带来了不确定性,包括事件顺序的不确定性和事件的重复性问题。Vernon 强调说,“就算你使用的是 Kafka,认为自己是在按顺序消费消息,但其实是在自欺欺人。如果任何一个消息可能出现乱序,那么所有消息都有可能出现乱序,你要为之做好应对准备”。

Vernon 认为这种不确定性是很难得到消除的,因为我们已经习惯于阻塞调用、数据库锁等事物,并总是期待事物是按照一定顺序进行的。在反应式系统里,一些长久以来的信念开始土崩瓦解。或许,开发者会本能地创建出门面(facade)来隐藏不确定性,写出传统的非反应式代码,但 Vernon 认为我们应该要反其道而行之。

Vernon 总结了自己处理不确定性的方式——“更少的查询,更多的事件”。事件告诉我们在过去某个时刻发生了什么。我们不知道系统现在处于什么状态,只知道事件发生时的状态以及在这一过程中发生了哪些变化。如何对这些事件作出反应式属于业务决策,包括如何处理乱序问题。Vernon 引用了 Pat Helland 的论文“ Life Beyond Distributed Transactions ”:“在一个不能依赖分布式事务的系统里,必须在业务层面管理不确定性”。

Vernon 列举了几中不同形式的不确定性,并提供了用于管理不确定性的简短代码。他强调这些代码只是业务决策的实现。业务必须拥抱不确定性,必须让业务决策者来对其进行建模,而不是在软件开发团队内部完成这件事情。不要通过创建门面来隐藏不确定性,而是尽你所能对不确定性进行建模。

查看英文原文: Vaughn Vernon Uses Reactive DDD to Model Uncertainty in Microservices

2017-10-12 19:001732
用户头像

发布了 322 篇内容, 共 154.9 次阅读, 收获喜欢 148 次。

关注

评论

发布
暂无评论
发现更多内容

UML实践-食堂就餐卡系统

shangyu

极客大学架构师训练营

小师妹学JVM之:JIT中的LogCompilation

程序那些事

JVM 小师妹 性能调优 JIT 签约计划第二季

如何写出高质量的代码?(浅谈代码规范、重构、单元测试的重要性)

Nick

单元测试 重构 代码重构 代码规范

互联网人的娱乐精神之28岁退休 & P8和生活助理的故事

码农神说

程序员 漫画 退休

加密与解密

返町

Cocoa 代码注释与文档生成

Edmond

ios CocoaPods 代码注释 Swift-Document iOS Document

还在埋头干活?给程序员的几个忠告

四猿外

Java 深度思考 程序员 随笔杂谈

面向对象设计课程小结

梅子黄时雨

极客大学架构师训练营

《零基础学 Java》 FAQ 之 17-怎么理解Java中的数组

臧萌

Java

SharePoint 往事之:一句话让 SharePoint 罢工

手艺人杨柳

SharePoint

当你输入get/set命令的时候,Redis做了什么

老胡爱分享

redis 源码分析

必知必会,程序员都应该会的Linux的50个知识点!

Java小咖秀

Linux 面试 运维 Shell 经验

跨云厂商部署 k3s 集群

硅基新手村

k3s wireguard

第二周学习总结

师哥

Flink on Zeppelin (5) 高级特性篇

Geek_8o1tcx

大数据 flink 流计算 Zeppelin

架构师训练营第三周

Melo

一种极致性能的缓冲队列

捉虫大师

Java 性能

英特尔宋继强:坚持科研的长期主义 推动AI向3.0时代跃迁

最新动态

思想不进化的人都是可怜人

Neco.W

提升认知 思考 进步 进化

架构师训练营作业 (第三周)

王海

极客大学架构师训练营

Android APP启动白屏优化

小菜鸟学php

android白屏

你真的了解敏捷吗?听马丁福勒聊敏捷

涛哥 数字产品和业务架构

敏捷 数字化转型

架构师训练营 - 第 3 课总结 -20200620- 软件设计

👑👑merlan

架构设计 软件设计 SOLID

新基建时代区块链应用场景进化

CECBC

新基建 区块链技术 去中心化 产业落地

架构师训练营第三周-总结

无心水

极客大学架构师训练营

架构师训练营第二周课后作业

赵凯

框架设计

重学 Java 设计模式:实战责任链模式「模拟618电商大促期间,项目上线流程多级负责人审批场景」

小傅哥

设计模式 小傅哥 重构 代码优化 责任链模式

请描述什么是依赖倒置原则,为什么有时候依赖倒置原则又被称为好莱坞原则?

一叶知秋

加入生财有术后,我获得了什么

Jay Wu

为什么Web开发人员在2020年不用最新的CSS功能

葡萄城技术团队

CSS

数据库如何弹性伸缩?

Aaron_涛

数据库 架构 云原生

Vaughn Vernon使用反应式DDD对微服务中的不确定性建模_语言 & 开发_Thomas Betts_InfoQ精选文章