防止断更 请务必加首发微信:1716143665
关闭
讲堂
客户端下载
兑换中心
企业版
渠道合作
推荐作者

43 | 互联网架构模板:“用户层”和“业务层”技术

2018-08-04 李运华(加微信:642945106 发送“赠送”领取赠送精品课程 发数字“2”获取众筹列表。)
从0开始学架构
进入课程

讲述:黄洲君

时长09:02大小4.14M

上一期,我从计算机网络层的角度谈了应对“高性能”和“高可用”的整体架构设计。今天,我将从“用户层”和“业务层”的角度谈谈常见的应用场景和关键技术

用户层技术

1. 用户管理

互联网业务的一个典型特征就是通过互联网将众多分散的用户连接起来,因此用户管理是互联网业务必不可少的一部分。

稍微大一点的互联网业务,肯定会涉及多个子系统,这些子系统不可能每个都管理这么庞大的用户,由此引申出用户管理的第一个目标:单点登录(SSO),又叫统一登录。单点登录的技术实现手段较多,例如 cookie、JSONP、token 等,目前最成熟的开源单点登录方案当属 CAS,其架构如下(https://apereo.github.io/cas/4.2.x/planning/Architecture.html

除此之外,当业务做大成为了平台后,开放成为了促进业务进一步发展的手段,需要允许第三方应用接入,由此引申出用户管理的第二个目标:授权登录。现在最流行的授权登录就是 OAuth 2.0 协议,基本上已经成为了事实上的标准,如果要做开放平台,则最好用这个协议,私有协议漏洞多,第三方接入也麻烦。

用户管理系统面临的主要问题是用户数巨大,一般至少千万级,QQ、微信、支付宝这种巨无霸应用都是亿级用户。不过也不要被这个数据给吓倒了,用户管理虽然数据量巨大,但实现起来并不难,原因是什么呢? 因为用户数据量虽然大,但是不同用户之间没有太强的业务关联,A 用户登录和 B 用户登录基本没有关系。因此虽然数据量巨大,但我们用一个简单的负载均衡架构就能轻松应对。

用户管理的基本架构如下:

2. 消息推送

消息推送根据不同的途径,分为短信、邮件、站内信、App 推送。除了 App,不同的途径基本上调用不同的 API 即可完成,技术上没有什么难度。例如,短信需要依赖运营商的短信接口,邮件需要依赖邮件服务商的邮件接口,站内信是系统提供的消息通知功能。

App 目前主要分为 iOS 和 Android 推送,iOS 系统比较规范和封闭,基本上只能使用苹果的 APNS;但 Android 就不一样了,在国外,用 GCM 和 APNS 差别不大;但是在国内,情况就复杂多了:首先是 GCM 不能用;其次是各个手机厂商都有自己的定制的 Android,消息推送实现也不完全一样。因此 Android 的消息推送就五花八门了,大部分有实力的大厂,都会自己实现一套消息推送机制,例如阿里云移动推送、腾讯信鸽推送、百度云推送;也有第三方公司提供商业推送服务,例如友盟推送、极光推送等。

通常情况下,对于中小公司,如果不涉及敏感数据,Android 系统上推荐使用第三方推送服务,因为毕竟是专业做推送服务的,消息到达率是有一定保证的。

如果涉及敏感数据,需要自己实现消息推送,这时就有一定的技术挑战了。消息推送主要包含 3 个功能:设备管理(唯一标识、注册、注销)、连接管理和消息管理,技术上面临的主要挑战有:

  • 海量设备和用户管理
    消息推送的设备数量众多,存储和管理这些设备是比较复杂的;同时,为了针对不同用户进行不同的业务推广,还需要收集用户的一些信息,简单来说就是将用户和设备关联起来,需要提取用户特征对用户进行分类或者打标签等。

  • 连接保活
    要想推送消息必须有连接通道,但是应用又不可能一直在前台运行,大部分设备为了省电省流量等原因都会限制应用后台运行,限制应用后台运行后连接通道可能就被中断了,导致消息无法及时的送达。连接保活是整个消息推送设计中细节和黑科技最多的地方,例如应用互相拉起、找手机厂商开白名单等。

  • 消息管理
    实际业务运营过程中,并不是每个消息都需要发送给每个用户,而是可能根据用户的特征,选择一些用户进行消息推送。由于用户特征变化很大,各种排列组合都有可能,将消息推送给哪些用户这部分的逻辑要设计得非常灵活,才能支撑花样繁多的业务需求,具体的设计方案可以采取规则引擎之类的微内核架构技术。

3. 存储云、图片云

互联网业务场景中,用户会上传多种类型的文件数据,例如微信用户发朋友圈时上传图片,微博用户发微博时上传图片、视频,优酷用户上传视频,淘宝卖家上传商品图片等,这些文件具备几个典型特点:

  • 数据量大:用户基数大,用户上传行为频繁,例如 2016 年的时候微信朋友圈每天上传图片就达到了 10 亿张(http://mi.techweb.com.cn/tmt/2016-05-25/2338330.shtml)。

  • 文件体积小:大部分图片是几百 KB 到几 MB,短视频播放时间也是在几分钟内。

  • 访问有时效性:大部分文件是刚上传的时候访问最多,随着时间的推移访问量越来越小。

为了满足用户的文件上传和存储需求,需要对用户提供文件存储和访问功能,这里就需要用到前面我在专栏第 40 期介绍“存储层”技术时提到的“小文件存储”技术。简单来说,存储云和图片云通常的实现都是“CDN + 小文件存储”,现在有了“云”之后,除非 BAT 级别,一般不建议自己再重复造轮子了,直接买云服务可能是最快也是最经济的方式。

既然存储云和图片云都是基于“CDN + 小文件存储”的技术,为何不统一一套系统,而将其拆分为两个系统呢?这是因为“图片”业务的复杂性导致的,普通的文件基本上提供存储和访问就够了,而图片涉及的业务会更多,包括裁剪、压缩、美化、审核、水印等处理,因此通常情况下图片云会拆分为独立的系统对用户提供服务。

业务层技术

互联网的业务千差万别,不同的业务分解下来有不同的系统,所以业务层没有办法提炼一些公共的系统或者组件。抛开业务上的差异,各个互联网业务发展最终面临的问题都是类似的:业务复杂度越来越高。也就是说,业务层面对的主要技术挑战是“复杂度”。

复杂度越来越高的一个主要原因就是系统越来越庞大,业务越来越多。幸运的是,面对业务层的技术挑战,我们有一把“屠龙宝刀”,不管什么业务难题,用上“屠龙宝刀”问题都能迎刃而解。这把“屠龙宝刀”就是“拆”,化整为零、分而治之,将整体复杂性分散到多个子业务或者子系统里面去。具体拆的方式你可以查看专栏前面可扩展架构模式部分的分层架构、微服务、微内核等。

我以一个简单的电商系统为例,如下图所示。

我这个模拟的电商系统经历了 3 个发展阶段:

  • 第一阶段:所有功能都在 1 个系统里面。

  • 第二阶段:将商品和订单拆分到 2 个子系统里面。

  • 第三阶段:商品子系统和订单子系统分别拆分成了更小的 6 个子系统。

上面只是个样例,实际上随着业务的发展,子系统会越来越多,据说淘宝内部大大小小的已经有成百上千的子系统了。

随着子系统数量越来越多,如果达到几百上千,另外一个复杂度问题又会凸显出来:子系统数量太多,已经没有人能够说清楚业务的调用流程了,出了问题排查也会特别复杂。此时应该怎么处理呢,总不可能又将子系统合成大系统吧?最终答案还是“合”,正所谓“合久必分、分久必合”,但合的方式不一样,此时采取的“合”的方式是按照“高内聚、低耦合”的原则,将职责关联比较强的子系统合成一个虚拟业务域,然后通过网关对外统一呈现,类似于设计模式中的 Facade 模式。同样以电商为样例,采用虚拟业务域后,其架构如下:

小结

今天我为你讲了互联网架构模板中的用户层技术和业务层技术,希望对你有所帮助。

这就是今天的全部内容,留一道思考题给你吧,虚拟业务域划分的粒度需要粗一些还是要细一些?你建议虚拟业务域的数量大概是多少,理由是什么?

欢迎你把答案写到留言区,和我一起讨论。相信经过深度思考的回答,也会让你对知识的理解更加深刻。(编辑乱入:精彩的留言有机会获得丰厚福利哦!)

© 加微信:642945106 发送“赠送”领取赠送精品课程 发数字“2”获取众筹列表。
上一篇
42 | 互联网架构模板:“网络层”技术
下一篇
44 | 互联网架构模板:“平台”技术
 写留言

精选留言(23)

  • LouisLimTJ
    2018-08-06
    14
    当然正确的话是要根据业务和团队来设计虚服务域。但是个人看法,粒度方面要粗一些,本来虚服务域就是来解决系统拆分过细的问题。
    至于具体多少个为好,我们可以仿照管理学关于一个一层管理团队的理想大小,其答案不一定,但一般是不要超过10个,我个人比较舒服的数目是3到7个。
    展开

    作者回复: 是的,5+-2的选择比较合理

  • feifei
    2018-08-10
    2
    这个肯定要粗一些,高内聚么,这样肯定功能类似的都被合并为一个了!我觉得控制在个位数吧!我觉得这是相对的一个平衡吧
    展开

    作者回复: 是的,粗一些比较好,5+-2原则比较合适

  • 小美
    2018-08-30
    1
    老师好 方便什么时候介绍下单点登录sso吗
    展开
  • darryking...
    2018-08-08
    1
    有几个知识盲点:
    1.facade模式,和工厂模式一个范畴?
    2,虚拟业务域中图片中的网关,是啥意思?相对于域名来调用服务?还是别的?在阿里的接口和域名访问,用户能感受到吗?或者作为学习者有验证的端倪吗?
    展开

    作者回复: 1. 设计模式里面有详细阐述
    2. 这个网关是内部的,可以是protobuf这种协议,也可以是HTTP协议,用户不可见

  • 张玮(大圣...
    2018-08-08
    1
    既然上升到虚拟域了,粒度粗一些会好很多,细的话容易淹没在业务中,理不清域之间边界了。

    从以前经历的一些项目得出的结论,10 个全是比较多了,再多的话就需要加入子域来说明了。

    最后,一起陪伴走过这么多专栏课时,运华兄辛苦!
    展开

    作者回复: 虚拟域粒度确实要粗一些。
    感谢你的鼓励,再辛苦也值得😄

  • 张玮(大圣...
    2018-08-08
    1
    既然上升到虚拟域了,粒度粗一些会好很多,细的话容易淹没在业务中,理不清域之间边界了。

    从以前经历的一些项目得出的结论,10 个全是比较多了,再多的话就需要加入子域来说明了。

    最后,一起陪伴走过这么多专栏课时,运华兄辛苦!
    展开
  • wuhulala
    2018-08-08
    1
    明白了 我们的子工程是单独提供服务的 子系统应该是老师说的那个虚拟域
  • wuhulala
    2018-08-07
    1
    我们现在比如说有一个a子系统里面有两个子工程b和c b和c单独提供服务 那么这样b和 c算是两个微服务 a算是虚拟业务域 如果是这样的话 我认为这样划分逻辑清晰 也无需多做什么工作 有何不可呢。期待答疑

    作者回复: 子工程不算微服务,微服务能独立部署和运行

  • l-m-a
    2018-08-06
    1
    个人觉得增加了facade层,服务器机器数量提升,另外服务之间的调用并没有减少反而还增加了,facade层的性能直接影响内部服务的能力。
    展开

    作者回复: 这也是代价,所以没有完美的解决方案
    回到这个方案,当需要引入facade层的时候,服务器数量已经不是问题。另外,服务之间的调用不会减少还会增加,但是整个系统的关系复杂度会降低

  • 探索无止境
    2018-08-04
    1
    不知不觉专栏就到尾声了,感谢老师的梳理,把我的整个知识体系理顺了,是否可以提供一些相关技术延伸的优质文章链接,老师是否有开新专栏的打算?
    展开

    作者回复: 1. 文章链接太多了,没法一一列出,掌握了架构思想后,可以分辨哪些是好的文章
    2. 没有,写专栏太累😀

  • 亚林
    2019-04-29
    前面提到的三个火枪手原则吧
    展开
  • wikili
    2019-01-24
    在同一个虚拟业务域下合并的两个业务子系统自我调用怎么实现的?比如A子系统需要调用B子系统

    作者回复: 微服务调用,需要服务注册发现

  • 风雨无阻
    2018-10-11
    虚拟域是不是有点像中台了
    展开

    作者回复: 不是中台,中台是不同业务的共性部分,虚拟域还是聚焦在本业务,当然,虚拟域可以依赖中台

  • 奋斗心
    2018-10-01
    这一个星期学到很多。感谢,纠正我不少理解
    DDD专栏名字叫什么,没找到

    作者回复: 是CSDN有DDD专栏,我记错了😀

  • 小美
    2018-08-30
    老师好 方便介绍下单点登录吗
    展开

    作者回复: 你需要什么程度的介绍呢?专栏已经简单介绍了😄

  • 文竹
    2018-08-26
    首先根据团队人数来决定业务域的数量,一个业务域可以由3个开发人员负责。如果有12个开发人员,那么就划分成4个业务域,再来看是用粗还是细粒度划分。
    展开

    作者回复: 12个人还远远不到划分业务域的时候,划分微服务就可以了

  • wuhulala
    2018-08-06
    不能连续回复 有点差评
    老师回复的那个虚拟域的概念是 我一直以为我这样划分算是微服务
    展开

    作者回复: 不是,虚拟业务域是微服务的合集

  • kyll
    2018-08-06
    虚拟业务域,有点类似服务聚合层?
    展开

    作者回复: 本质上都是类似,看看设计模式的facade模式的阐述,更深刻的了解其优缺点和应用场景

  • 凡凡
    2018-08-05
    关键因素是团队规模和组织架构,一个团队内部最多两个人一个虚拟业务域,再多就很容易出现频繁切换业务域,业务域没有足够备份的情况,出现弊大于利的状况。

    作者回复: 到了上虚拟业务域的时候,规模都会很大了

  • wuhulala
    2018-08-04
    我觉得还是看团队大小的 像我们这种只有十几个人一个产品 或者说是项目团队来说 每两到三个人负责一个系统还是可以的 我划分的时候 主要是按照主流程分几个子系统 然后周边系统根据其功能性 如展示系统、第三方对接系统
    展开

    作者回复: 你们团队还远远没到划分虚拟业务域的时候,微服务搞定😀