高并发之消息队列

简单模型

高并发之消息队列
比如一个接口处理短信发送,如果没处理完就可以放入消息队列;然后等待接口处理,如果接口处理短信发送失败则可以再次放入消息队列,减少尝试的次数和占用的线程,再次进行处理。

消息队列的特性

  • 业务无关:只做消息分发
  • FIFO:先投递先到达
  • 容灾:节点的动态增删和消息的持久化
  • 性能:吞吐量提升,系统内部通信效率提高

为什么需要消息队列

  • 【生产】和【消费】的速度或稳定性等因素不一致

举几个例子

  1. 业务系统触发短信发送申请,但短信发送模块速度跟不上,需要将来不及处理的消息暂存一下,缓冲压力。就可以把短信发送申请丢到消息队列,直接返回用户成功,短信发送模块再可以慢慢去消息队列中取消息进行处理。
  2. 调远程系统下订单成本较高,且因为网络等因素,不稳定,攒一批一起发送。调远程系统下订单成本较高,且因为网络等因素,不稳定,攒一批一起发送。
  3. 任务处理类的系统,先把用户发起的任务请求接收过来存到消息队列中,然后后端开启多个应用程序从队列中取任务进行处理。任务处理类的系统,先把用户发起的任务请求接收过来存到消息队列中,然后后端开启多个应用程序从队列中取任务进行处理。

消息队列的好处

  • 业务解耦
    简单讲就是一个事务只关心核心的流程,而需要其它系统但不是那么重要的事情有通知即可,无需等待结果。基于消息模型,关心的是通知,而不是处理。
  • 最终一致性
    要么都成功,要么都失败。比如银行转账,A扣钱,B加钱,如果A成功B失败,A失败B成功,则都会全部回滚。
  • 广播
    如果没有消息队列;每次接入,我们都要联调一次新接口;有了消息队列,我们只需要关系消息是否送达消息队列,新接入的接口订阅相关的消息,自己做处理就可以了。
  • 错峰与流控
    上下游对于事物的处理能力是不同的。前端和后端数据库,数据库的性能肯定不能追上前端,前端上千万并发量,数据库是承受不住的。利用中间系统转储中间内容,在下游又能力处理的时候进行处理是一套比较通用的方式。

Kafka和RabbitMQ

Kafka
kafka讲解详细见本人博客的分类kafka笔记
高并发之消息队列

RabbitMQ

  • RabbitMQ讲解详细见本人博客的分类RabbitMQ笔记(待整理)
    高并发之消息队列