消息队列能做什么
1.异步处理
用户使用信用卡支付时使用同步模式需要串行执行所有的服务,响应用户时间比较长,可以使用消息队列异步处理达到快速响应用户请求。
2.流量控制
在网关和后端服务之间使用消息队列实现流量控制,在使用消息队列后请求流程变为:
1.网关收到请求后把请求放到消息队列中。
2.后端服务在消息队列中获取app,请求并处理然后返回结果。
消息超时可以直接丢弃消息。
这种设计的优点是:能根据下游的处理能力自动调节流量,达到“削峰填谷”的作用。但这样做同样是有代价的:
1.上下游服务需要改变为异步交互方式复炸度较高。
2.服务调用链路变长整体延时变长。
令牌桶方案:
在单位时间生成一定数量的令牌,后端服务处理请求前获取令牌,如果没有获取到令牌则拒绝请求。这样就保证了单位时间内单位时间内处理的请求不会超过令牌数量,达到流量控制的效果。
可以简单的使用一个固定容量队列加令牌生成器服务实现,令牌生成器匀速生成令牌加入到队列中,如果令牌队列满了就丢弃令牌。网关调用后端服务前,获取令牌,调用后端服务,如果获取不到令牌则直接返回失败。
3.服务解耦
如电商的订单系统,很多下游服务需要实时订单信息,这些下游系统随着需求的变化不断的新增变化,每新增或变化需要修改订单系统,对核心订单系统来说是不可接受的。所以我们可以把订单系统生成的订单放入消息队列,下游系统需要订单数据可以订阅消息队列,实现服务间解耦。
以上就是消息队列经常使用的三个场景,当然还有其他的使用场景。
1.作为发布 / 订阅系统实现一个微服务级系统间的观察者模式。
2.连接流计算任务和数据。
3.用于将消息广播给大量接收者。
等等其他一些场景。
使用消息队列也带来了一些其他问题:
1.使用消息队列带来的延时问题
2.增加了系统复炸性
3.数据的一致性