【大数据】事件驱动的微服务架构

  • 时间:
  • 浏览:0

最近小编另4个劲在接微服务转型的咨询Case,有些企业肯能刚开始英文了了着手了,但中途发现从各个微服务的数据库中做跨表查询是个大疑问,尤其当数据库自动分表存储刚刚。嘴笨 从数据库设计的淬硬层 ,独立的数据库未必上能 更好地解耦微服务架构,但太难保证数据的一致性,但会 每个微服务治理团队时要维护人及的数据库,你這個备份、升级等等。相较而言,共享数据库上能 统一所有微服务的录入标准,不要再带来数据一致性疑问。

今天亲戚亲戚大伙儿讨论的都会 有一种,回到亲戚亲戚大伙儿设计数据库的初衷,肯能只有 记录每一笔交易,亲戚亲戚大伙儿时要有另另4个 数据库来记录数据的当前情况汇报,但现在亲戚亲戚大伙儿有了大数据平台和分布式的消息总线,亲戚亲戚大伙儿肯能有能力记录每条交易,通过简单的统计算法也上能 得到实时的统计数据,从前们还时要数据库么?



小编认为伴随着微服务的应用思维,微服务的数据思维也应该有有另另4个 质的提升,作为松耦合的服务,微服务具有以下有另另4个 特点:

独立部署

有买车人的数据架构(Schema)

数据只有通过买车人的微服务API接口访问

回到最初一句话题:肯里上能 将服务的事件删剪记录下来,从前们只时要存储事件就行了。



上图是有另另4个 微服务的数据存储模型,首先用户通过服务接口(一般是有另另4个 web图形界面)从前台交互操作;但会 前台将操作(比如按钮或文字输入)转化为指令传到数据写入端;写入端检查指令算不算符合业务逻辑,但会 生成事件(包括时间戳、事件ID,再打上去原始指令)并以键值对将事件计入事件存储;最后事件存储将键值对事件持久化保存到NoSQL的数据库(比如MongoDB,Cassandra)中,以备读取请求的调用。



在数据读取时,用户同样与UI界面交互,一般UI界面上会预定义有些常用的查询也上能 接收用户的自定义查询;但会 请求被转打上去标准的查询一句话/命令;最后整理到NoSQL数据库获取事件的统计信息。

以事件驱动来设计微服务的数据库有五个好处:

更易将领域驱动设计(Domain Driven Design,或DDD)付诸实施

DDD是10004年由著名建模专家Eric Evans提出的:任何软件开发都会 应只关注技术,业务领域才是软件开发更应关注的重点。肯能每条事件都被记录下来了,所以有业务之间的关联就能一目了然。比如一家医院的库房从数据库看有1000箱止痛药和10000箱消炎药,但不关注事件一句话永远真不知道1000%的消炎药是伴随止痛药一起出售的。

降低服务耦合度

当微服务间有调用或依赖关系的刚刚,某有另另4个 服务的失效会影响到子微服务。你這個服务1是有另另4个 订单系统,服务3是客户征信系统,当用户下单时,服务1会检查服务3该用户的征信标志位,但会 当服务3的API不可用时就会影响到服务1的下单。



在有一种情况汇报下,上能 将服务1的订单事件日志关联到服务3的征信日志,从事件存储中获取该标志位,肯能使用消息总线做事件的关联,就删剪解耦了应用层面的依赖项。



在实际应用中,有另另4个 单体购物系统上能 拆解为客户、订单、运输、退货、货品目录等多个微服务。每个微服务都与客户信息有关联,当客户系统的微服务有事件记录时,通过侦听(Reader)更新其余微服务人及的关联库就上能 了,从前即便客户系统断了,其余系统也依然上能 从现有关联库中获得客户信息,等客户系统上线了再恢复更新就行了。

打破了读写的性能瓶颈

有SQL经验的亲戚大伙儿都会知道,数据库的读写调优是无法一起完成的,在资源限定的情况汇报下,提升读取的性能一定是以牺牲写入性能为代价的。而在事件驱动的数据模型中,写入端会始终匹配读取端的时延,达到最终的一致性,在有消息总线的情况汇报下,事件会缓处于消息总线中。



提高请求并发量限制

同样的,传统数据库在防止高并发时,会将防止不过来的请求任务在应用端排队,但会 亲戚亲戚大伙儿往往上能 看后在每天上下午的高峰时刻,服务响应太快了 的情况汇报。



而每个事件肯能是键值对的形式传输的,只有 预定义的事务日志格式,但会 通常情况汇报下数据量非常小,在同样的时延和磁盘IO情况汇报下,提升了防止并发请求数的能力。当然有一种模式下同样上能 设立多个只读节点以提高数据读取的吞吐量。

复杂了复杂信息的传输

这点也是显而易见的,传统结构化数据库只接收定义好的字段及字段类型,时要接收新属性只有修改表结构,而键值对的录入形式更加灵活。