消息队列

综合问题

为什么使用消息队列

  • 异步
  • 解耦
  • 削峰

有哪些消息队列

  • ActiveMQ 老牌产品
  • RabbitMQ 流行,ERLang编写,成熟稳定,自带的管理界面较好用
  • RocketMQ 阿里出品,java编写,成熟度上不如RabbitMQ
  • kafka 吞吐量大,一般用作大数据处理,比如日志处理

RabbitMQ

基本概念

  • exchange 路由,消息是发送给某一个路由
  • queue 队列,实际存储数据,读数据是从某一个队列读取
  • binding 把路由和queue绑定出来,按一定规则作分发
  • routing key 一个关键字,按照key来作不同的分发
  • channel 信道

分发模式

  • direct 点对点,按routing key完全匹配来分发
  • fanout 广播模式,不需要 routing key,直接复制
  • topic 按routing 模糊匹配来分发 * 一个单词,# 号零个或多个单词
  • headers 根据消息本身的header来匹配

高可用

  • 单机模式
  • 普通集群模式,queue只放在一个实例上,其它实例同步queue的元信息,需要时再去取
  • 镜像集群模式,同步queue的元信息和数据信息

问题

  • 保证消息有序
    • 拆分多个queue,每个queue一个consumer
    • 只有一个queue和一个consumer,consumer再通过内部队列作有序处理
  • 保证消息不重复
    • 业务层需要幂等
  • 保证消息不丢失
    • 发送成功:开启发送确认模式
    • 存储时不丢失:开启持久化
    • 消费成功:开启消息的确认模式
  • 消息大量积压如何处理
    • 加快消费:扩容consumer
    • 临时导出:把队列数据临时导出来,等资源不紧张了再处理
    • 丢弃数据:高峰过去后,想办法让发送方再触发一次

kafka

选型

首先看是否是用于大数据量传输,是否有大量堆积。比如大批量的日志传输、大批量的机器信息采集。如果是则采用kafka,单机吞吐量在10万级。缺点是有部署起来稍微复杂,需要zookeeper,其次功能相对简单,延迟性不如RabbitMq

如果是传统的消息队列,不需要做二次开发,一般选用 rabbitMq,成熟稳定功能丰富,同时延迟也是最低的。如果需要二次开发,则选用阿里出品的RocketMq


发布于 2020/08/12 浏览