互联网架构,究竟为啥要做服务化?
最近留言问“微服务”的朋友颇多,找历史文章又找不到,故重新优化发布,希望大家有收获,不要被“微服务大潮”误导。
“微服务架构”的话题非常之火,很多朋友都在小窗我,说怎么做服务化?解答“怎么做”之前,先得了解“为什么做”。
画外音:做技术千万不能是这种思路,“别人都在做,所以我们也要搞”。
并不是所有的业务都适合“服务化”,互联网高可用架构,到底为什么要服务化?
服务化之前,高可用架构是什么样的?
在服务化之前,互联网的典型高可用架构如下:
(2)后端入口,高可用的反向代理nginx集群;
(3)站点应用,高可用的web-server集群;
(4)后端存储,高可用db集群;
可以看到,最初是没有服务层的,此时架构会碰到什么典型痛点呢?
架构痛点一:代码到处拷贝
举一个最常见的业务例子,用户数据访问,绝大部分公司都有一个数据库存储用户数据,各个业务都有访问用户数据的需求。
架构痛点二:复杂性扩散
随着并发量的越来越高,用户数据的访问数据库成了瓶颈,需要加入缓存来降低数据库的读压力,于是架构中引入了缓存,如果没有统一的服务层,各个业务线都需要关注缓存的引入导致的复杂性。
(1)先淘汰cache;
(2)再写db;
对于读请求,所有业务线也都要升级代码:
(1)先读cache,命中则返回;
(2)没命中则读db;
(3)再把数据放入cache;
这个复杂性是典型的“业务无关”的复杂性,业务方需要被迫升级。
随着数据量的越来越大,数据库需要进行水平拆分,于是架构中又引入了分库分表,如果没有统一的服务层,各个业务线都需要关注分库分表的引入导致的复杂性。
典型的耦合,还包括bug的修改,发现一个bug,多个地方都需要修改。
架构痛点三:库的复用与耦合
服务化并不是唯一的解决上述两痛点的方法,抽象出统一的“库”是最先容易想到的解决(1)代码拷贝;(2)复杂性扩散;的方法。
抽象出一个user.so,负责整个用户数据的存取,从而避免代码的拷贝。至于复杂性,也只有user.so这一个地方需要关注了。
解决了旧的问题,会引入新的问题,库的版本维护会导致业务线之间的耦合。
业务线A将user.so由版本1升级至版本2,如果不兼容业务线B的代码,会导致B业务出现问题。
业务线A如果通知了业务线B升级,则是的业务线B会无故做一些“自身业务无关”的升级,非常郁闷。当然,如果各个业务线都是拷贝了一份代码则不存在这个问题。
画外音:有时候拷贝代码也是有好处的。
架构痛点四:SQL质量无法保障,业务相互影响
业务线通过DAO访问数据库,本质上SQL语句还是各个业务线拼装的,资深的工程师写出高质量的SQL,经验没有这么丰富的工程师可能会写出一些低效的SQL。
假如业务线A写了一个全表扫描的SQL,导致数据库的CPU100%,影响的不只是一个业务线,而是所有的业务线都会受影响。
画外音:临时工程序员要背锅了。
架构痛点五:疯狂的DB耦合
业务线不只访问user数据,还会结合自己的业务访问自己的数据。
画外音:user_biz表,也是用uid做主键。
典型的,通过join数据表来实现各自业务线的一些业务逻辑。
业务线A的table-user与table-A耦合在了一起,业务线B的table-user与table-B耦合在了一起,业务线C的table-user与table-C耦合在了一起,结果就是:table-user,table-A,table-B,table-C都耦合在了一起。
随着数据量的越来越大,业务线ABC的数据库是无法垂直拆分开的,必须使用一个大库(疯了,一个大库300多个业务表 =_=)。
架构痛点六:…
服务化后,高可用架构如何?
互联网高可用分层架构演进的过程中,引入了“服务层”。
引入服务层有什么好处,到底解决什么问题呢?
好处一:调用方爽
有服务层之前,业务方访问用户数据,需要通过DAO拼装SQL访问。
有服务层之后,业务方通过RPC访问用户数据,就像调用一个本地函数一样,非常之爽:
User = UserService::GetUserById(uid);
传入一个uid,得到一个User实体,就像调用本地函数一样,不需要关心序列化,网络传输,后端执行,网络传输,范序列化等复杂性。
好处二:复用性,防止代码拷贝
所有user数据的存取,都通过user-service来进行,代码只此一份,不存在拷贝。
升级一处升级,bug修改一处修改。
好处三:专注性,屏蔽底层复杂度
好处四:SQL质量得到保障
有了服务层之后,所有的SQL都是服务层提供的,业务线不能再为所欲为了。底层服务对于稳定性的要求更好的话,可以由更资深的工程师维护,而不是像原来SQL难以收口,难以控制。
好处五:数据库解耦
好处六:提供有限接口,无限性能
在服务化之前,各业务线上游想怎么操纵数据库都行,遇到了性能瓶颈,各业务线容易扯皮,相互推诿。
服务化之后,服务只提供有限的通用接口,理论上服务集群能够提供无限性能,性能出现瓶颈,服务层一处集中优化。
好处七:…
服务化不能解决所有问题,如果没有碰到这些问题,架构未必需要服务化。
一切脱离业务的架构设计,都是耍流氓。
希望大家有收获。
原文发布时间为:2018-11-06
本文作者: 58沈剑

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
如何成为一名Android架构师,乃至高级架构师,文末有路线图
很多Android的小伙伴在做了多年的开发之后,始终搞不清楚达到Android架构师需要何种技能,我们对比着Android高级工程师来说明。 我们先来看一下Android高级工程师的招聘要求 职位描述: Responsibility Android平台功能模块的设计与开发 移动端开发框架的研究与设计 移动端技术规范的制定与推广 移动端技术培训 Requirements 重点高校本科及以上学历,计算机及相关专业毕业 精通java语言,熟悉面向对象设计原则。 有至少1年的Android开发经验,有app上线的优先考虑 具有较强的编程和解决问题的能力,具有较好的数据结构及算法基础功底 对移动互联网产品有浓厚的兴趣 其实简单点, 就是能够独立开发APP =有APP上线 APP有设计感 = 懂设计模式设计原则 项目经验丰富 = 较强的编程和解决问题的能力 内存和性能优化 = 具有较好的数据结构及算法基础功底 GitHub 开源项目 = 对移动互联网产品有浓厚的兴趣 在我看来 1.Android高级工程师 + 全局眼光 = 架构师 所以架构师必备的一项技能就是要放眼全局,做的设计要能够思虑长远,如...
- 下一篇
大数据分布式存储的部署模式:分离式or超融合
大数据分布式存储的部署模式:分离式or超融合数据中心内部系统的核心要求是“稳定可靠”,一是指系统在运行过程中有能力提供连续可靠的服务,长时间无故障运行;二是指当故障发生之后,有能力快速定位,及时排查,故障范围不蔓延。分离式部署的方式,使得系统与云平台系统相独立,避免了计算和存储争抢CPU/内存/网络等物理资源,一旦某一方资源需求骤升导致的另一方资源枯竭,从而影响性能并在整个基础架构中产生的涟漪效应;和在超融合部署方式在集群规模较大后,网络、硬盘、服务器发生故障的概率都会增大;以及数据重删、压缩、加密纠删码等功能、故障的自修复和数据功能实现都会消耗一定的系统资源,导致性能下降和抖动等问题。分离式部署相比超融合方式的优点: 如此观点如果不是出自某厂家或者供应商,也太偏颇了。我觉得简单看两种技术适合不同规模,中小规模(包括平台规模,也包括人力资源规模)下超融合优势明显,大规模分布式存储优势更大。良好的设计,恰当的平衡才是关键,没有一边倒的绝对优势。 建议采用超融合式部署模式。1、从成本上讲,超融合式每个服务器既可以做计算资源,又可以做存储资源,性价比最高。2、从性能上讲,分布式存系统,一般只...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS6,CentOS7官方镜像安装Oracle11G