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

2016.8.17, 深圳, Ken Fang

架构师在设计从多个微服务取数据, 而生成报表的架构设计方案时, 往往面临著需在边界上下文 (Bounded Context), 数据的时效性, 性能, 可靠性与开发的复杂度间作取舍。

从多个微服务取数据, 而生成报表的设计方案, 主要是参考: Enterprise Integration Patterns; Hohpe and Woolf。

A.      Database Pull Model (Shared DataIntegration Style): 直接至各微服务所拥有的数据库中获取数据, 并写至负责生成报表的服务所拥有的数据库或数据仓储中。此设计方案主要的问题是: 破坏了原微服务的边界上下文 (Bounded Context), 使得原微服务无法独立自主的修改自身所拥有的数据表结构; 原微服务若有任何数据表结构上的修改, 将会影响到生成报表的服务所拥有的数据库或数据仓储。

B.      Http Pull Model (RPC IntegrationStyle): 负责生成报表的服务, 经由各微服务所提供的 REST API, 取得所需的数据, 并写至自身所拥有的数据库或数据仓储。此设计方案, 藉由 REST API, 维持了各微服务的边界上下文 (Bounded Context), 但, 却存在著其他的问题:

         1.    性能上的问题: 当负责生成报表的服务需同时向许多个 (上百个) 微服务获取数据时, 则就表示将会有上百个远程调用会发生。所以, 有可能负责生成报表的服务的某一个数据请求, 已经达到了 Time Out, 但有的微服务所提供的数据, 还尚未送至负责生成报表的服务。

         2.    数据量的问题: 当负责生成报表的服务向微服务获取大量的数据时; 例如: 整个月的股票买卖。则大量的数据将造成大量流量, 所以, 也有可能对负责生成报表的服务的某一个数据请求, 造成 Time Out。

C.      Batch Pull Upload (Shared DataIntegration Style): 在夜间执行批处理至各微服务所拥有的数据库中获取数据, 并写至负责生成报表的服务所拥有的数据库或数据仓储中。

此设计方案因为同样是属于 Shared Data IntegrationStyle, 所以, 也存在著破坏了原微服务的边界上下文 (Bounded Context) 的问题; 使得原微服务无法独立自主的修改自身所拥有的数据表结构。原微服务若有任何数据表结构上的修改, 将会影响到生成报表的服务所拥有的数据库或数据仓储。

当然, 此设计方案的另一个问题便是: 数据的时效性; 生成报表的服务所拥有的数据库或数据仓储, 将无法获得实时的各微服务所拥有的数据库中的数据。

D.      Event-Based Push Model (MessageBased Integration Style): 当各微服务所拥有的数据库发生变更时, 便会产生一个事件。此事件便会使得生成报表的服务去处理此事件; 至发生数据库变更的微服务获取所变更的数据, 并写入其所拥有的数据库或数据仓储中。

此设计方案不仅维持了各微服务的边界上下文 (Bounded Context), 更使得生成报表的服务所拥有的数据库或数据仓储, 获得实时的各微服务所拥有的数据库中的数据; 拥有数据的时效性。

比较这四种设计方案在边界上下文 (Bounded Context) 、数据的时效性上的优、劣:

边界上下文

数据的时效性

Database Pull Model

Http Pull Model

Batch Pull Upload

Event-Based Push Model

当然, 天下没有白吃的午餐; Event-Based Push Model 虽然维持了边界上下文 (Bounded Context) 并提供了数据的时效性。但, 却增加了产品架构的复杂度。使得微服务与生成报表的服务间产生某种程度上的耦合。也就是说, 生成报表的服务必需知道: 针对每一个微服务所拥有的数据库发生变更时所产生的事件,要如何做出相对应的动作, 以维护其所拥有的数据库或数据仓储中的数据的时效性; 这确实不是件容易的事。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java一日一条

Python爬虫爬取美剧网站

一直有爱看美剧的习惯,一方面锻炼一下英语听力,一方面打发一下时间。之前是能在视频网站上面在线看的,可是自从广电总局的限制令之后,进口的美剧英剧等貌似就不在像以前...

1342
来自专栏数据和云

DBA生存警示:系统级误删除案例及防范建议

编辑手记:对于资深的老DBA们,他们在漫长的职业生涯中养成了很多稀奇古怪的守则,以在复杂多变的环境中“幸存”,这源于无数血泪的教训,我曾经在《数据安全警示录》...

2844
来自专栏北京马哥教育

撤回的微信消息真的看不到?78行Python代码帮你看穿一切!

导读:Python曾经对我说:"时日不多,赶紧用Python"。于是看到了一个基于python的微信开源库:itchat,玩了一天,做了一个程序,把私聊撤回的信...

1110
来自专栏程序猿DD

极大提高工作效率的几十种神兵利器

来源:https://www.liutf.com/posts/3720794851.html

1683
来自专栏塔奇克马敲代码

Windows平台下源码分析工具

1583
来自专栏数据小魔方

R语言数据重塑及导出操作

今天跟大家简单介绍下几个常用的R数据操纵技巧——导入(xlsx)、导出及长宽转换! 数据导入(xlsx) 之前写过一篇关于R导入不同类型数据的方式,但是其中只涉...

2543
来自专栏吉浦迅科技

DAY64:阅读 Memory Model

我们正带领大家开始阅读英文的《CUDA C Programming Guide》,今天是第64天,我们正在讲解CUDA C语法,希望在接下来的36天里,您可以学...

663
来自专栏大数据挖掘DT机器学习

数据爬取、清洗到分析,如何徒手研究上海二手房房价

本文由作者:孙培培 原创投稿 声明:本文所公布代码及数据仅作学习用,若别有用途则后果自行承担。 提到上海,不得不提上海的高房价,最近一篇上海各市辖区均价的文章...

3166
来自专栏杨建荣的学习笔记

system表空间不足的问题分析(r6笔记第66天)

很多事情见多了也就有了麻木的感觉,报警短信就是如此,每天总能收到不少的报警短信,可能很多时候就扫一眼,如果没有严重的问题自己是不会情愿打开电脑处理的。 对于此,...

2594
来自专栏信安之路

我是如何通关信安之路巅峰挑战赛的

我滴个天啊。。。。。弱密码随意登陆。。。。。不好意思,这题我真是非预期解法,具体的预期解法,之前信安之路文章已发,就不仔细讲述啦!

1256

扫码关注云+社区