Graph + AI 中国峰会火热报名中,点击探索图分析更多可能! 了解详情
写点什么

数据是实现微服务的难点

2016 年 9 月 04 日

企业在创建和开发微服务的过程中,最困难的问题之一就是他们的数据。如果我们采用领域驱动设计(Domain-Driven Design,DDD)来分析业务领域并剖析数据所代表的含义,将会有助于实现微服务架构 Christian Posta 在一个关于微服务实现的系列博客文章中阐述了该理念。

Posta 是 Red Hat 的中间件主架构师,对于他来说,选择微服务架构的主要原因在于这种架构能够让负责系统不同组成部分的团队按照不同的进度来开展工作,并且能够让他们之间的相互干扰达到最小。当按照这种方式来组织团队的时候,系统架构能够反映出这种变化,并且会向微服务架构来演化。

但是,如何让团队之间的这种自治真正运转起来,这一点其实并不简单。在单体架构中,通常会使用事务并且只有一个数据库,如果每个服务都具有一个数据库,那么这会变成一项挑战,对于传统的企业来讲更是如此。

Posta 指出,在实现微服务方面,互联网公司和传统企业之间有着巨大的差异。互联网公司采用微服务的目的主要是解决大量数据和扩展性的问题,而传统企业要同时处理业务和扩展性方面的复杂性。播放影片或发送推文的复杂性要远远低于保险索赔系统的复杂性。

在为相对复杂的企业域构建微服务时,我们需要找到在这个域中不同责任的边界。在每个边界中,我们会创建领域模型,这个模型是针对业务责任所设计的,并反映了这种业务责任。针对每个边界的数据模型会由同一个边界中的领域模型来驱动。采用 DDD 的方式我们能够找到这些边界,并会为每个边界创建一个有界上下文(bounded context),每个上下文将会成为一个微服务。

在Posta 的经验中,开发人员在构建分布式系统时,会倾向于假设只有一个关系型数据库,并试图将网络的不稳定性抽象出来。跨多个服务所带来的分布式数据问题通常会通过二阶段提交来解决。与这种做法不同,Posta 相信,我们必须要寻找每个有界上下文中的事务性边界,并找到满足业务限制和不变量的最小原子单元,不要让事务传播到其他的上下文之中。

我们还需要有一种机制,能够让服务通知其他的服务发生了什么,针对这种需求,Posta 推荐使用事件。我们的服务会发布事件,描述在这个域中发生了什么,其他的服务会读取这些事件,调整它们自己的模型并将变更进行持久化。

关于这些理念的更深入描述,Posta 引用了Vaughn Vernon 发布的一系列博客文章,这些文章基于DDD 理念,描述了聚集、事务边界和有界上下文。

查看英文原文 Data is the Hard Part Working with Microservices

2016 年 9 月 04 日 19:002347

评论

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

Android开发:App点击跳转到网页的实现

三掌柜

8月日更

netty系列之:netty初探

程序那些事

Java 响应式编程 Netty nio 程序那些事

基于ECS快速搭建 Docker 环境

若尘

Docker 服务器 8月日更

多语言ASR?没有什么听不懂,15种语言我全都要

华为云开发者社区

语言 ASR 多语言ASR 单语模型 Conformer

手撸二叉树之对称二叉树

HelloWorld杰少

算法和数据结构 8月日更

kafka SpringBoot

Rubble

kafka springboot 8月日更

分布式性能测试框架用例方案设想(二)

FunTester

分布式 性能测试 接口测试 测试框架 测试开发

基于docker的分布式性能测试框架功能验证(二)

FunTester

分布式 性能测试 接口测试 测试框架 测试开发

Springboot 配置文件、隐私数据脱敏的最佳实践(原理+源码)

程序员内点事

Java springboot 数据安全 数据脱敏

Druid 通过 dsql 运行的时候提示错误 urllib2

HoneyMoose

百度爱番番移动端网页秒开实践

百度Geek说

前端 优化 网页加速 移动端

Rust从0到1-模式-可反驳性

rust 模式 Patterns Refutability 可反驳性

【Maven技术专题】如何使用Assembly插件实现自定义打包

李浩宇/Alex

maven assembly 8月日更

原来select语句在MySQL中是这样执行的!看完又涨见识了!这回我要碾压面试官!

冰河

MySQL 面试 精通MySQL SELECT查询流程 查询缓存

重磅 | 用友《数字化中台》震撼上市!数智化转型和商业创新实践的企业级经验!

博文视点Broadview

【设计模式】原型

Andy阿辉

C# 编程 后端 设计模式 8月日更

Python代码阅读(第1篇):列表映射后的平均值

Felix

Python 编程 Code Programing 阅读代码

十大排序算法--插入排序

阿粤Ayue

排序算法 8月日更

复杂多变场景下的Groovy脚本引擎实战

vivo互联网技术

敏捷开发 脚本语言

PostgreSQL 中如何控制行级安全和列级安全

Qunar技术沙龙

sql postgresql 运维 安全 权限

Python OpenCV 图像区域轮廓标记,可用于框选各种小纸条

梦想橡皮擦

8月日更

【Flutter 专题】132 图解 PaginatedDataTable 分页表格

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 8月日更

索信达控股:银行4.0的AI世界——开启算法力的时代

索信达控股

人工智能 金融科技 银行

Design for failure常见的12种设计思想

架构精进之路

降级 重试 容错 8月日更

Druid 从控制台(Druid console)从 SQL 脚本转换为 JSON 格式的方法

HoneyMoose

Druid 的几个查询实例

HoneyMoose

synchronized 优化手段之锁膨胀机制!

王磊

Java 并发 8月日更

一文带你搞定AOP切面

华为云开发者社区

spring aop 切面编程 面向切面编程 切面

鸿蒙内核之内存调测:动态内存池信息统计

华为云开发者社区

鸿蒙 内存 动态内存池 内存信息

docker入门:postgresql安装及可视化界面portainer使用

小黄鸡1992

8月日更

深度学习中的分布式训练

OPPO数智技术

人工智能 深度学习

数据是实现微服务的难点-InfoQ