1. 背景

BOSS系统是中国移动的核心计费系统,中国移动12580业务,作为移动的一级业务,需要从一级BOSS,获取用户订退行为。BOSS系统发送指令给12580BOSS代理系统的方式,包括两种,实时和异步。对于实时的请求,BOSS可以实时根据12580BOSS代理系统返回的状态,来决定下一步操作。但是对于异步的请求,则需要12580BOSS代理系统自行保证各个请求的正常按序执行。由于指令的按序执行,对于业务状态的准确性至关重要,因此,如何通过技术手段保证这一功能,有重要意义。

2. 现状

系统改造前,对于后端接口异常的处理逻辑为:当后端接口异常时,先重试,如果重试三次均失败,则此次请求丢弃。这种简单的处理逻辑,可以应对接口短暂的异常,但是对于持续时间较长的接口异常状态,直接丢弃,会影响用户实际状态的一致性。比如 ,当前用户状态是业务订购状态,当收到退订的指令时。如果请求失败,指令丢弃,则用户的状态就会保持为订购状态,与用户真实的订购状态不一致。

当出现这种异常时,需要人工把出错的数据找出来,然后手工再调用一次。由于涉及指令较多,且每次都需要人工处理,出错概率高。因此急需对此系统进行改造。

3. 系统改造

3.1. 基本思路

设置两个标志位,一个是接口连续成功次数,这个标志位是确保接口持续稳定时才正常处理,防止接口时好时不好的,影响接口正常使用。另一个标志位是当前的异常状态,这个状态是为了确定,当接口是正常的时候,是否要进行异常处理。

通过队列的方式来实现指令信息排队缓存的功能。通过对现有的第一方组件的测评,使用经典的Redis来实现。引入队列主要解决三个问题,一个是把当前不能处理的指令按先进先出的方式存储起来,第二个是可以提高并发处理能力,第三个是保持指令按请求时的顺序执行,保证不乱序。通过对用户手机号+业务编码组合后HASH的方式,把指令放入指定队列组合中的其中一个。这样,一方面保证了同一用户同一业务指令的按序执行,另一方面也为多线程多进程并发处理提供了基础。

3.2. 系统结构

改造后的系统共分为两部分,一部分为生产者进程,另一部分为消费者进程。生产者进程负责把异常请求根据规则放入队列。消费者负责把队列中的请求重新消费,直到队列消费完成,最后把异常状态标志置为正常。

3.3. 生产者处理流程

每次收到一个指令,要进行路由转发时,均首先调用接口,验证当前接口是否正常。能实施这一步的前提是,多次调用一个序列的接口,不影响接口才可以。如果当前的异常状态为真,且用户和当前业务所组成的key在队列中,则不管当前接口是否异常,均把该请求放入队列中。当后端接口出现异常时,置当前状态异常Flag为真,然后把请求放入一个缓冲队列中。放入缓冲队列时的算法采用HASH算法来实现。




OS调用SMBIOS 调用boss接口失败_按序执行

生产者进程处理流程图



3.4. 消费者处理进程

只有当异常状态变为正常,且连接成功次数大于100时,才开始启动消费者处理进程。此时,如果队列为空,则置异常状态为正常,连接成功次数置为0 。如果列表不空,则持续消费此队列。消费的时候,根据队列的个数,启动与队列个数匹配的线程数,实现并发消费。




OS调用SMBIOS 调用boss接口失败_端接_02

消费者进程处理流程



4. 改造效果

系统改造后,系统在多个方面得到了改善。主要体现在系统稳定性,异常处理的响应速度和吞吐量,这三个指标上。

4.1. 系统稳定性

系统稳定性得到了大幅的提升,对后端接口的依赖和关联度降低。

4.2. 异常处理响应速度和吞吐量

遇到异常时,系统及时响应,同时当遇到大的异常流量时,也能在较短的时间内处理完成。