Christian Posta谈如何处理微服务的数据

人们之所以会采用微服务架构,一个非常重要的原因就是这种架构允许不同的团队分工协作,各自推进,互不影响。那么怎样做才能实现微服务架构呢?最近Red Hat的首席中间件架构师、开源爱好者和Apache代码提交者Christian Posta在博客上发表了一篇文章分享了自己的看法,他认为单纯地使用Spring Boot、Dropwizard或者Docker并不意味着你已经走在了微服务的路上,要真正地实现微服务,必须要深入理解领域和数据。

对于数据,有人认为每一个微服务都应该拥有并控制自己的数据库,任意两个微服务都不应该共享同一个数据库,因为如果共享数据库就会有读、写竞争,数据模型冲突,协调难度大等问题;而统一的数据库则安全性更高,更便利,更容易理解和管理。那么在构建微服务的时候应该如何权衡、协调这些问题呢?Christian Posta认为对于一个正在构建微服务架构的企业,首先应该搞清楚下面四个问题:

领域是什么?实际情况是什么? 事务的边界在哪里? 微服务应该采用什么方式实现跨边界通信? 如果把数据库拿出来会怎样?
Christian Posta首先解释了什么是领域,他认为在构建微服务之前必须充分而深入的理解数据的含义、了解数据是如何产生与消费的。例如,如何给“书”下定义,如何用数据模型表示它:

书是带页码的东西?那报纸是书么(它也页码)?书有硬的封皮?书不是每天都出版?出版社可能会用一条记录表示某个作者的某本书,但是书店里面可能会有多本这样的书,如何表示这种关系呢?假如一本书太长必须分卷,应该如何处理?每一卷都是一本书,还是合到一起才算?

对于这种问题现实情况是没有万能的答案,关键是看“谁问的问题,上下文是什么”。不同的上下文对同一问题的理解可能不同,作为人类我们能很容易地理解“书”是什么,但是计算机不能,在构建软件和数据建模的时候必须使计算机对上下文清晰明了。为此领域驱动设计(DDD)能够帮助我们处理其中的复杂性,通过领域模型建立数据模型,然后在实体、值对象之间画出边界,这些边界或者边界里的组件可能就是最终的微服务。

在数据模型和边界确定之后就需要一些方式来协调不同模型使之保持数据的一致性,这就需要找出事务的边界在哪里。Christian Posta认为事务边界是业务不可变性的最小原子单元。无论是通过数据库的ACID特性还是通过两阶段提交来实现原子性,都无所谓,关键是要让事务的边界尽可能地小。例如,针对下面几个用例:

“允许客户搜索航班”  
“允许客户选择某个特定航班的座位”  
“允许客户预定某个航班”

可能会有三个有边界的上下文:搜索、预定和售票。搜索负责显示特定路线的航班以及给定时间范围内的旅游活动日程。预定通过客户的姓名、地址、经常乘坐的航班、座位喜好以及支付信息等安排预定流程。售票负责实际的订票和出票。这一阶段需要识别出每一个上下文中的事务边界从而实施约束/不可变性,保证不同上下文内的事务互不影响;但是此时并不需要100%的、严格的数据一致性,因此不需要考虑跨边界上下文的原子事务。例如,对于上面的场景:

预定流程可能会调用SeatAvailability服务让它在飞机上预留一个座位。这个座位预留的操作可能会实现为一个单独的事务(比如保留座位23A)并返回一个预留ID号。预定流程会关联该预留ID号并提交预定。无论是预留座位还是接受预定,它们各自都是一个单独的事务,可以独立处理,不需要借助于两阶段提交或者两阶段锁。

但是数据并不是孤立的,在某些情况下独立的事务需要组合到一起,那么微服务应该采用何种方式跨边界通信呢?Christian Posta认为微服务的价值在于自治,在于每一个系统都能够独立的变化,为了在实现自治的同时又保证业务需求,“事件机制”是非常好的选择。事件是不可变的数据结构,它会及时捕获与某个动作相关的信息,并被广播到其他节点,其他节点会监听它们感兴趣的事件,并根据事件的数据做出决策(存储数据、更新数据等)。例如,对于上面预定机票的场景:

当客户发起预定的时候,预定上下文会发布一个类似于“NewBookingCreated”的事件,售票上下文会消费该事件并与后端的票务系统交互。

使用事件的优点是:它能够避免边界之间昂贵的、不可能的事务模型;系统的各个部分能够独立变化,互不影响;系统的每个部分可以自己决定数据的更新周期,数据的存储方式,以及数据模式等;系统的可伸缩性、容错性和扩展性更好。当然,这种方式也有一些缺点:用户必须花费更多的精力研究CAP理论,了解存储或者队列的实现技术;调试的复杂度更高,实施的难度更高等。

最后,对于“微服务的数据应该存储到一个数据库中还是存储到不同的数据库中”,Christian Posta给出的答案是“没有具体的规则,这需要根据具体的场景进行权衡,标准是不要失去自治所带来的优点”。此外,Christian Posta还给出了一种通过Apache Samza构建事件流处理系统的思路,他认为这样做可以带来更多的好处:

可以将数据库看作是“当前状态”的记录,而不是真正的记录 可以引入新的应用程序,重新读取过去的事件并依据“已经发生的事情”检查它们的行为 可以自由地审计日志 可以引入新版本的应用,并通过回放事件对其进行非常完善的测试 可以非常容易地修改数据库的版本和模式,执行升级,只需要将事件在新数据库中重放即可 可以非常容易地迁移到全新的、不同类型的数据库

本文转自d1net(转载)

时间: 2024-10-29 12:02:19

Christian Posta谈如何处理微服务的数据的相关文章

从多租户隔离到高可用,谈DaoShip微服务架构演进

本文根据DCOS联盟第3期线上分享整理而成   讲师介绍姜冲 DaoCloud高级软件工程师   Docker Contributor,负责公有云构建服务.DaoShip的设计与研发. 对微服务架构设计与实现有着丰富的理论与实践经验.     大纲:   正确构建镜像的目标和所需资源,以及如何规划和构建服务: 基于优良的微服务架构设计及网络层优化,为数十万用户的服务使用提供稳定高速的构建能力: 不同运营需求下的技术架构演进: 微服务带给客户的价值.   DaoShip 作为 DaoCloud S

微服务架构设计(五):获取微服务数据, 生成报表

架构师在设计从多个微服务取数据, 而生成报表的架构设计方案时, 往往面临著需在边界上下文 (Bounded Context), 数据的时效性, 性能, 可靠性与开发的复杂度间作取舍. 从多个微服务取数据, 而生成报表的设计方案, 主要是参考: Enterprise Integration Patterns; Hohpe and Woolf. A. Database Pull Model (Shared DataIntegration Style): 直接至各微服务所拥有的数据库中获取数据, 并写

谈微服务架构(转)

时间 2016-03-22 11:38:33  人月神话的BLOG   原文  http://blog.sina.com.cn/s/blog_493a84550102w5x6.html 主题 微服务 其实在前面很多文章谈到SOA,特别是系统内的SOA和组件化的时候已经很多内容和微服务架构思想是相同的,对于微服务架构,既然出现了这个新名称,那就再谈下微服务架构本身的一些特点和特性. 从这个图可以看到微服务架构的第一个重点,即业务系统本身的组件化和服务化,原来开发一个业务系统本身虽然分了组件和模块,

通过Ruby on Rails和docker构建微服务架构之入门教程

说到时下的架构,免不了会涉及到微服务.而谈到微服务架构,又跟容器和Docker技术脱不了关系.虽然容器和Docker并不完全是一回事,但两者是密不可分的,而且二者之间也有共同之处:在大型复杂应用的构建和运营方面,二者都可以大大提高企业的效率.   微服务可不像一般的应用,可以通过apt-get工具进行安装,大家可能会问了:我们该如何才能像安装应用一样实现这种服务呢?在很大的程度上,这个问题的答案是否定的,我们无法轻松实现这种服务.更准确的说,至少目前我们还无法实现.在一个系统中,最难修改的就是架

微服务(Microservices)—Martin Flower【翻译】【转载】

本文转载自:http://www.cnblogs.com/liuning8023/p/4493156.html ---------------------------------------------------------------------------- 原文是 Martin Flower 于 2014 年 3 月 25 日写的<Microservices>. 本文内容 微服务 微服务风格的特性 组件化(Componentization )与服务(Services) 围绕业务功能的组

微服务框架和工具大全

在<Java微服务>一书中,我们使用 Spring Cloud,它提供使微服务非常容易地开发所需的所有工具和平台.Spring Cloud使用 Netflix开放源码软件( OSS).让我们探讨 Netflix OSS--一个完整的软件包. Netflix开放源码软件(OSS) Netflix开放源码软件中心是基于 Java的微服务开放源码项目最流行和最广泛使用的开放源码软件.世界上最成功的视频租赁服务依赖于它.Netflix已经有超过 4000万用户,他们在全球各地使用其服务.Netflix

微服务基础

微服务基础篇 1: service consumer -> Proxy Server ->Load Balance -> Service Discovery -> Target Service 2: Broser curl Other -> Zuul -> Ribbon -> Euraka -> Restful API zuul: 是边缘服务,用来提供动态路由,监控,授权,安全,调度等功能,将权限控制等一些业务逻辑抽离出来,单独放到Zuul里,使得服务组件更

正在考虑微服务架构的松耦合?小心这些陷阱!

本文讲的是正在考虑微服务架构的松耦合?小心这些陷阱![编者的话]本文阐述了作者在构建松耦合的微服务架构中遇到的一些挑战,并给出了相应的方法,包括:如何处理多个微服务间共享数据的场景,如何演进微服务API,如何处理微服务安全,以及如何组合微服务等. 微服务是一种新的架构,它使用简单.轻量.松耦合的服务来构建系统,这些服务彼此可以独立开发和发布. 如果你还不了解这些基础概念,请阅读Martin Fowler的文章.如果你想拿它和SOA进行比较,请看Don Ferguson的演讲.Martin Fow

微服务架构中模块划分和服务识别

最近在进行微服务架构的交流和讨论中,除了谈到微服务技术架构外,客户往往更加挂你微服务模块的划分粒度,已经具体的微服务API接口的识别和定义问题,因此这篇文章将重点谈下微服务架构实践过程中的微服务模块划分和服务识别. 首先我们还是再总结在在跨系统间的接口集成中服务的识别和定义方法,可以总结为: 1. 基于流程架构和业务架构,从跨系统交互流程出发,分析业务交互接口点,识别关键的业务服务能力. 2. 基于数据架构和主数据建模分析,识别关键的数据服务能力. 3. 基于技术架构和共性平台层技术组件的分析和