1 消息队列功能介绍
消息队列是分布式系统中重要的组件,主要解决分布式环境下各个服务同步调用、负载不均、应用耦合等问题。
消息队列的作用就是可以让各个服务可以异步处理、流量削峰、应用解耦
1.1 异步处理
以电商用户下单为例,用户创建订单后发送订单创建成功的短信。传统方式可以做成串行处理,先调用订单服务创建订单,订单创建成功后调用短信服务发送短信。
假设创建订单100ms,发送短信100ms,那么整个过程需要200ms
改进的方案是把调用短信服务发短信这个过程改为发送一条订单创建成功的消息,短信服务收到这条消息后发送短信。由于消息队列发送消息时间基本上可以忽略不计,那么用户下单这个过程在100ms就可以完成,时间缩短了一半。
1.2 流量削峰
每年双十一,天猫、淘宝活动都在0点开始,假如说系统的QPS可达10000,应付平时的下单量绰绰有余,但是在双十一0点的时候用户下单QPS可能达到10w甚至更高,这个时候普通的RPC或REST接口很难承受这么高的并发。有人说没关系,可以加机器扩容,
当然,这个方案没问题。但是活动一过去流量又下来了,这个时候还得把多余的服务下限。当然,土豪随意。那么在流量高峰的时候我们可不可以通过别的方式来保障服务的稳定性呢?我们可以用消息队列做个缓冲,把一秒内的订单分散成一段时间处理,流量下来的时候可以处理堆积的消息
1.3 应用解耦
账户模块而维护了用户的基本信息,订单服务需要查询,短信服务需要查询,为了提高查询速度往往会做一个缓存。订单服务、短信服务查询用户信息之前先查询缓存,那么就需要有一个缓存清理机制。
传统的方法是账户模块修改用户信息后调用订单服务、短信服务接口清理缓存,这样账户模块一个基础服务严重地依赖了其他服务。更坑爹的是如果再有一个服务需要查询用户信息,那么还得调用清理缓存,增加了服务之间的耦合。
通过消息机制可以显著解决这个问题。账户模块儿修改了用户信息后发一个消息广播给各个服务,各个服务拿到消息后自己清理缓存,有效的解决了服务耦合的问题。