01、解耦、削峰、异步
01-1 同步异步的问题(串行)
串行方式:将订单信息写入数据库库成功后,发送注册邮件,再发送注册短信,以上三个任务完成后,返回给客户端。
代码:
1 | public void makeOrder(){ |
以上代码是一种自上而下的代码,即为串行,服务完成时间是非常长的。不能出现并行,如果要使用并行,不许使用多线程。。。
01-2 并行方式 异步线程池
并行方式: 将订单信息写入数据库成功后,发送注册邮件的同时,发送注册短信。以上三个任务完成后,返回给客户端。与串行的差别是,并行的方式可以提高处理的事件。
代码:
1 | public void makeOrder(){ |
存在问题:
- 耦合度高
- 需要自己写线程池,自己维护成本太高
- 出现了消息可能会丢失,需要自己做消息补偿
- 如何保证消息的可靠性需要自己写
- 如果服务承载不了,需要自己去写高可用
01-3 异步消息队列的方式
好处
- 完全解耦,用MQ建立桥接
- 有独立的线程池和运行模型
- 出现了消息可能会丢失,MQ有持久化功能
- 如何保证消息的可靠性,死信队列和消息转移等
- 如果服务器承载不了,你需要自己去写高可用,HA镜像模型高可用
按照以上约定,用户的响应时间相当于是订单信息写入数据库的时间,也就是50毫秒,注册邮件,发送短信写入消息队列后,直接返回,因此写入消息队列的速度很快,基本可以忽略,因此用户的响应时间可能是50毫秒,因此架构改变后,系统的吞吐量提高到美标20QPS。比串行提高了三倍,比并行提高了两倍。
代码
1 | public void makeOrder(){ |