资损防控系列(1)-----同步异步

1,应用场景

  同步:所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回

  异步:异步概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。

实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。

  应用场景:交易结果异步通知、渠道处理异步通知、账单信息异步通知、异步事务触发、掉单查询异步处理等

 

2,同步异步防资损的checklist

【1】同步调用返回

同步请求信息校验、组装下游请求信息、响应信息处理、同步向上返回

    1.1 说明

    同步调用返回处理主要关于按照接口文档定义,同步的请求信息的组装和响应信息的处理。重点关注同步请求信息的组装和信息的校验、响应信息中敏感信息处理和引发的相关后续事务,处理不当都会引发资损。

    1,2 资损原因

     同步请求信息校验不完善,如金额没有校验,系统与系统之间的金额存储单位不一致,导致后面交易金额错误,对账信息未传正确导致出现长短款

     组装下游请求信息有误,如金额明细与总单金额不一致,敏感必填字段未控制并下游异常失败未做回退机制

     响应信息的敏感信息未处理

     引发的后续事务,处理不当,如状态、响应码、对账信息等和对应的触发事件,如该冲正的未冲正,不该冲正的冲正

    1.3 测试方法

     根据接口文档的请求和响应,覆盖各类的必填项、类型、长度和业务性场景

     重点关注各类返回的后续动作

     注意上下联调,保证一致性

【2】同步调用超时

处理中:掉单/重试、降级、失败

     2.1 说明

      同步请求时下游在规定时间内无返回,系统引发的才超时处理,一般记处理中、降级或失败。重点关注超时后状态的记录和后续引发的事务。

      记处理中,需要引发掉单、重试或冲正等事务,一般用于交易渠道等

      失败需要引发回退,一般对时间要求很高的功能,如收单、pos等

      降级,即超时后继续往下调用其他系统,一般用于非核心链路,可以不调它,不响应主要功能,如决策、风控等、

     2.2 资损原因

      超时后未处理好正确的状态和后续引发的事务。如超时简单的当做失败没有后续退款事务,掉单将无此交易当做失败(刚超时的记录进行掉单处理很容易返回无此交易)、重试没做好幂等控制、冲正不该冲正的冲正掉等。

     2.3 测试方法

      采用数据库锁表的操作,让下游迟迟未返回

     2.4 样例

      超时掉单处理时,下游系统数据库迟迟未处理完,未将记录插入渠道信息,当掉单时下游返回无此交易,交易处理成失败,等数据库处理完后,渠道处理为成功,引发用户扣了钱但系统认为没扣的情况,导致用户资损。

【3】同步调用失败

同步失败记失败做事务回退、同步失败落人工、同步失败做降级处理

      3.1 说明

       同步调用失败是指调用时出现异常,如系统挂了或报异常类错误等,不是有返回并返回信息状态为失败的情况。注重同步调用失败系统状态信息等的记录和相关引发的后续事务。

       同步失败后一般处理方法有如下几类:

       同步失败记失败做事务回退,如消费交易失败引发冲正

       同步失败落人工,如出金交易等,失败走人工调账或线下处理

       同步失败做降级处理(不影响核心功能),继续往下执行功能,如调决策、风控等

      3.2 资损原因

       同步调用失败信息的记录,如未做任何异常捕获、未引发冲正等

      3.3 测试方法

       调用系统未启动

       调用系统dubbo禁掉

       请求地址有配置项,修改成错误的请求地址

【4】同步重复调用

重复、并发(幂等控制)

      4.1 说明

       同步重复调用是指一个请求重复调用两次及以上,重点关注幂等,关注重复调用的控制和并发时是否会被击穿。

      4.2 资损原因

       如一个交易单同时支付两次成功,出现用户扣了两次钱,交易单成功一个,发货一次;

       如一个人每天领积分,今天领用再次领分,如果出现重复领分,导致资损

      4.3 测试方法

       重复调用需要并发测试

【5】异步处理

发送者组装的内容、形式、正确解析和消费

      5.1 说明

       异步处理,主要根据上下游异步消息交互定义,正确的发送消息和接收消息。重点关注发送者组装的内容、形式和接收者正确解析和消费

      5.2 资损原因

       如异步交易信息发送后消费失败,用户资金已经扣除,业务状态迟迟未成功,商户未发后,导致用户资损。

      5.3 测试方法

       上下游联调

       模拟发Q

【6】异步重复发送

重复、并发(幂等)

      6.1 说明

       异步重复发送消息是指发送消息时,一样的消息名称一种的消息内容重复发送,重点关注幂等,关注重复发送消息时的控制和并发是否会被击穿

      6.2 资损原因

       如渠道扣款后重复发送通知成功消息给上游,上游未做防重控制,导致该渠道扣款以后的指令重复执行或线程错乱等。

       如份额异步通知扣款,导致重复加减额。

      6.3 测试方法

       并发测试、模拟发Q

【7】异步发送顺序

 同种Q,不同Q(避免重复处理)

       7.1 说明

        异步发送顺序是消息的先后,可以不同消息名称也可以同一个消息名称,关注消息发送后“后发先至”的处理情况。

       7.2 资源原因

        如消息发出后,前一个消息由于消息积累未及时消费,后发的消息到了未做处理或做了处理后先发的消息到时的重复处理。

       7.3 测试方法

        模拟发Q

       7.4 样例

        交易信息通知功能,当交易先进行中,发上游告知信息通知为进行中;当交易成功后,发上游告知信息停止为成功。其中当出现第一个进行中的消息后到,导致先处理成功后在处理成进行中,用户已经扣款,业务状态为进行中,商户未发货,出现用户资损。

【8】异步消息类型用错

  queue、topic

       8.1 说明

        异步消息类型目前分Q和同topic,一般Q为一对一,topic为一对多。重点关注一个对多个其他系统和一个系统的多个服务器。

       8.2 资损原因

        当出现一个渠道结果通知信息采用了topic的方式并且同时让一个系统的多台服务器处理了,系统又未做相关幂等控制,导致资损。

       8.3 测试方法

        MQ平台内核对Q配置类型

        多台服务器场景测试

【9】异步比同步快

异步处理、同步处理(避免重复处理)

       9.1 说明

        当同步请求下游系统后,同步响应还未处理完成,下游异步消息已经返回。重点关注异步消息返回后的系统处理情况。

       9.2 资损原因

        当同步请求下游系统后,同步响应还未处理完成,下游异步消息已经返回,导致异步消息未处理或异步消息处理后同步响应返回后重复处理。

       9.3 测试方法

        人工模拟发Q,控制同步响应延迟,如锁数据库,开发代码改动等

       9.4 样例

        如消费-银行卡支付,当银行扣款同步请求返回进行中,其中出现下游异步比同步快时,系统先接受到成功消息后引发后续事务,下游又同步返回时又引发后续事务,导致后续事务多次执行引发资损。

【10】同步异步都返回

        10.1 说明

         同步异步都返回是指同样的信息同步异步都返回,需要重点关注上下游的约定。

        10.2 资损原因

          如未按照约定执行,如同步返回成功后引发后续事务,异步返回成功又引发后续事务,导致多次重复执行事务。一般按照约定,如约定为都按照异步消息处理,那就不处理同步请求信息;或约定为当同步返回成功后下游不需要再次返回异步消息等。

        10.3 测试方法

         同步成功后人工模拟发Q

        10.4 样例

          上下游预定同步返回成功后下游不再返回异步消息,但当下游异常时未按约定执行,导致上游系统出现重复执行或线程错乱,导致资损。

【11】其他

如何控制幂等

       1,悲观锁

        并发情况下,当第一条查询时,就把表加锁,等事务完成之后,再释放

        缺点:性能不好

       2,乐观锁

       并发情况下,每次执行事务时,都查询一下,是否只存在一条,如果不是则回滚

       缺陷:回滚事务太多,容易出错

      3,去重表

       并发情况下,每次执行时,都先在去重表中新增一条记录,永远只会执行一次

 

posted @ 2017-05-16 18:27  猫的天空之城  阅读(2485)  评论(1编辑  收藏  举报