前言
简单的记录一下消息中间件的一些应用场景。
通过异步处理提高系统性能
如上图,在不使用消息队列服务器的时候,用户的请求数据直接写入数据库,在高并发的情况下数据库压力剧增,使得响应速度变慢。
但是在使用消息队列之后,用户的请求数据发送给消息队列之后立即 返回,再由消息队列的消费者进程从消息队列中获取数据,异步写入数据库。由于消息队列服务器处理速度快于数据库(消息队列也比数据库有更好的伸缩性),因此响应速度得到大幅改善。
但是如果后面写入出现错误怎么办??!前面已经回应了用户,这个时候如何保证消息与业务操作一致,不丢失?!?首先用户是在消息队列写入成功后得到的响应,所以只要保证写入消息队列中的消息能被成功消费即可。所以如果出列的消息执行失败是不会失效或者消失的。主流的MQ产品都具有持久化消息的功能。如果消费者宕机或者消费失败,都可以执行重试机制的。
应用解耦
简单来讲就是如果下单的操作,涉及到订单入库、商家发货等业务。一般的情况就是如下:
1 | public void Order(){ |
但是如果有新的业务逻辑,希望下单的时候再添加一个用户积分的操作,情况就如下:
1 | public void Order(){ |
每单有新的业务都要改变代码,对代码侵入太大。而且每个服务的耦合度太高,如果上面商家发货出现错误,会导致程序终止,积分操作执行失败。
引入消息中间件之后,对新增业务,只要对该类消息感兴趣,即可订阅该消息,对原有系统和业务没有任何影响,从而实现网站业务的可扩展性设计。
1 | public void Order(){ |
流量削峰
场景:秒杀活动,一般会因为流量过大,导致应用挂掉,为了解决这个问题,一般在应用前端加入消息队列。
可以控制活动人数,超过此一定阀值的订单直接丢弃
可以缓解短时间的高流量压垮应用(应用程序按自己的最大处理能力获取订单)
1.用户的请求,服务器收到之后,首先写入消息队列,加入消息队列长度超过最大值,则直接抛弃用户请求或跳转到错误页面.
2.秒杀业务根据消息队列中的请求信息,再做后续处理.