原文链接:https://mp.weixin.qq.com/s/JNMwjTX7T-hsOknZ1XvBeg
三架马车是指微服务、消息队列和定时任务
服务有三个层次:
聚合业务服务:高层次的串起来整个流程的具有完整业务形态的业务服务。和基础业务服务不同的是,这里是在完整描述一方面的业务,这个业务往往是由各种基础业务拼装组合起来的。和不同外部合作方的不同合作形式,给用户提供的产品的不同服务形态,都决定了聚合业务服务会有业务流程上的差异化,如果把此类服务下放到基础业务服务中,那么基础业务服务会有各种if-else逻辑(根据产品类型、用户类型进行各种if-else),随着业务的合作不合作,需求变动,基础业务服务会腐化得很厉害,为了避免这个情况,我们把变动的多的聚合业务逻辑放到独立的业务服务中。一般而言,聚合业务服务因为代表了独立的业务流程,它们之间是不会进行相互调用的,但是它们一定会调用大量的各类基础业务服务。在第一点里说的标有蓝色字体的a~d这些服务都是此类服务。这个层次的服务的业务逻辑更多是在表达业务流程的复杂性和差异性,不会涉及到具体怎么处理账户信息、账务信息、用户信息,不会涉及到怎么处理具体的投资人和借款人的交易。比如对于预约这类业务形态,它关注的是先要预约资产,然后再由系统进行自动投资,底层完全依赖于投资人交易服务来做整个交易的过程。
基础业务服务:某一个领域业务相关的服务。此类服务之间是允许相互调用的,比如投资人交易服务和借款人交易服务免不了需要和用户服务、资产服务、账户账务服务进行通讯做相关的用户信息查询、标的信息查询、记账等业务操作。之所以投资人交易服务和借款人交易服务定位为基础业务服务是因为,它们处理的是还是某一个具体方面的业务,并不是全流程,在这个抽象层次上,业务不是那么容易变动的,对于复杂的各种业务形态(比如预约交易、自动复投交易、等额本息交易)会在这些服务之上形成聚合业务服务。在第一点里说的标有绿色字体的e~k这些服务都是此类服务。在这个层次的服务虽然拥有大量的业务逻辑,但是其实已经享受到了很大层度的公共基础服务的重用了,而且和自己业务耦合较弱的额外逻辑往往没有在本服务中堆积,由更多专职的基础业务服务来承担了这部分逻辑。
公共基础服务:负责某一个方面的基础业务(没有什么领域业务逻辑在里面),可以是自治的处理某一个方面的基础业务,也可以和外部通讯实现某一个方面的功能,服务之间是不会相互调用的,但是会被聚合业务服务和基础业务服务调用。在第一点里说的标有橙色字体的l~n这些服务都是此类服务。如果以后和外部的合作有变动,因为我们已经定义了对外的服务契约,可以轻易替换这个服务来更换合作的第三方,系统其余的地方几乎不需要修改。所有的三方对接都建议独立出公共基础服务,如果同一个业务对接多个三方渠道,比如推送对接了极光和个推,甚至公共基础服务还可以由一个抽象聚合的推送服务,下面再路由到具体的极光推送和个推推送服务。
1. 异步处理:类似于订单这样的流程一般可以定义出一个核心流程,这个流程用于处理核心订单的状态机,需要尽快同步落库完成,然后围绕订单会衍生出一系列和用户相关的库存相关的后续的业务处理,这些处理完全不需要卡在用户点击提交订单的那刹那进行处理。下单只是一个确认合法受理订单的过程,后续的很多事情都可以慢慢在几十个模块中进行流转,这个流转过程哪怕是消耗5分钟,用户也无需感受到。
2. 流量洪峰:互联网项目的一个特点是有的时候会做一些toC的促销,免不了有一些流量洪峰,如果我们引入了消息队列在模块之间作为缓冲,那么backend的服务可以以自己既有的舒服的频次来被动消耗数据,不会被强压的流量击垮。当然,做好监控是必不可少的,下面再细说一下监控。
3. 模块解耦:随着项目复杂度的上升,我们会有各种来源于项目内部和外部的事件(用户注册登陆、投资、提现事件等),这些重要事件可能不断有各种各样的模块(营销模块、活动模块)需要关心,核心业务系统去调用这些外部体系的模块,让整个系统在内部纠缠在一起显然是不合适的,这个时候通过MQ进行解耦,让各种各样的事件在系统中进行松耦合流转,模块之间各司其职也相互没有感知,这是比较适合的做法。
4. 消息群发:有一些消息是会有多个接收者的,接收者的数量还是动态的(类似指责链的性质也是可能的),在这个时候如果上下游进行一对多的耦合就会更麻烦,对于这种情况就更适用使用MQ进行解耦了。上游只管发消息说现在发生了什么事情,下游不管有多少人关心这个消息,上游都是没有感知的。
定时任务的需求有那么几类:
1. 如之前所说,跨服务调用,MQ通知难免会有不可达的问题,我们需要有一定的机制进行补偿。
2. 有一些业务是基于任务表进行驱动的,有关任务表的设计下面会详细说明。
3. 有一些业务是定时定期来进行处理的,根本不需要实时进行处理(比如通知用户红包即将过期,和银行进行日终对账,给用户出账单等)。和2的区别在于,这里的任务的执行时间和频次是五花八门的,2的话一般而言是固定频次的。