同步和异步处理
处理一般可以分为同步和异步两种。同步的处理就像我们生活中打电话,打电话的双方都需要做即时的响应处理,如果一方没有即时响应,另一方可能就觉得对方是不是出现断线之类的故障了。异步的处理就像我们生活中邮寄东西,我们把东西交给快递后,就可以不用再特意关注了,只需要在收件人收到快递后给我们一个反馈即可。
在计算机的世界中,同步和异步处理各有各的优点,分别适应不同的业务场景。同步处理适合那些需要即时反馈,实时性很高的业务。同步处理有以下几个特点:
1、同步处理时,调用方必须同步等待被调用方处理完成,其间不能进行任何操作。
2、同步处理一般都是一对一的,处理的性能不会超过性能最差的节点的性能。
3、同步处理时,如果被调用方出现了问题,那调用方也会出问题,故障会从被调用方传递到调用方。
对于需要强一致性的业务,同步处理可能是更好的选择。
异步处理适应的业务场景更广泛,异步处理有以下几个特点:
1、异步处理时,调用方不需要同步等待被调用方处理完成就可以返回做其它事情,所有事情可以并发处理。
2、异步处理时 ,被调用方可以根据调用方的调用请求的实际情况,对一些操作同一资源的调用请求进行合并或者优化处理,减少整体处理量,从而提高处理性能。如多个调用方对同一个资源进行更新时,可以对这些更新操作合并处理,只进行最后一次更新即可。异步处理的最大优势也在于此,可以让系统以最少的资源实现最大的处理能力。
对于只需要最终一致性的业务,异步处理可能是更好的选择。
异步处理的模式
异步处理整个流程涉及几个角色:
1、调用者:发起异步处理请求的一方。
2、被调用者:提供请求处理能力的一方。
3、任务调度者:接收调用方的异步处理请求,并对这些请求进行合并或者删减处理,并把处理后的请求提供给被调用方执行。
任务调度者是异步处理的核心单元,它跟被调用者有两种主要的交互方式:
第一种方式是任务调度者管理所有的被调用者的列表,并且清楚每个被调用者的职责是什么,能力有多大。这种方式最大的问题是,当被调用者发生故障或者需要扩容时,都需要去更新自己维护的被调用者的列表,并且还需要清楚地知道每个被调用者是否还活着以及它们各自的通讯方式。
第二种方式是任务调度者不清楚有哪些被调用者,它把异步处理请求进行合并或者删减处理后,就把规整后的请求通过消息的发布订阅的方式告诉被调用者。被调用者只需要订阅对应的异步处理消息即可。这种方式最大的问题是,如果发布的异步处理消息必须遵循一定的处理先后顺序的话,管理起来就比较复杂了。
从整体来看,推荐使用第二种方式,它更能使得服务和服务之间通过消息总线的方式进行解藕,服务之间根本不感知对方是否存在。
消息丢失
在异步处理时,系统可能会因为某些bug使得异步处理的任务没有触发,比如消息丢失。这个时候需要有一种机制能够保证异步处理的任务一定会触发,以下几个点可以做参考。
1、可以要求被调用方在处理完任务后,给调用方发送处理完成的消息,调用房接收到这个消息就说明任务以已经处理完成。
2、另外,调用方也不能死等着被调用方的处理完成消息,比如被调用方挂了的情况下。这时候,调用方可以启动一个定时任务去定期查看任务是否处理成功,如果在任务处理的超时时间里,都没有收到任务处理完成的消息,可以重新发送任务处理请求。当然,这就要求被调用方必须支持幂等性处理。
3、如果几个请求在业务上组成了一个事务,也就是说在业务上必须得同时成功或者失败。那在某个请求重试了几次都无法成功的情况下,调用方应该发起回滚操作。
4、从运维上来看,系统需要实时监控异步处理请求的积压情况,能够做到快速地扩容或者其它的限流、降级、熔断等处理。
网友评论