消息队列的在各种场景下如何选型?

137 阅读5分钟

优先级队列

队列设置最大的优先级,之后每条消息设置对应的优先级,队列根据消息优

先级进行消费,(在有可能队列堆积的情况才有意义);应用场景:不同业务消息推送。

延迟队列:

消息发送后,并不想让消费者立即拿到消息,等待特定的事件后,消费者才能

拿到并消费;应用场景:订单系统中订单支付 30 分钟内没有支付成功,那么将这个订单

进行异常处理;远程操作智能设备在指定时间进行工作等。(rabbit 中没有延迟队列,但

可以借助死信队 列与 TTL 设置来完成)

死信队列:

当消息在一个队列中变成死信之后,它能被重新被发送到另一个交换器(DLX

交换器)中,绑定 DLX 的队列就称为死信队列。

重试队列:

消费端,一直不回传消费的结果,rocketmq 认为消息没收到,consumer 下

一次拉取,broker 依然会发送该消息(有次数限制)。重试队列其实可以看成是一种回

退队列,具体指消费端消费消息失败时,为防止消息无故丢失而重新将消息回滚到

Broker 中。

消费模式:

推模式:对于 kafka 而言,由 Broker 主动推送消息至消费端,实时性较好,

不过需要一定的流 制机制来确保服务端推送过来的消息不会压垮消费端。拉模式:对于

kafka 而言,消费端主动向 Broker 端请求拉取(一般是定时或者定量)消息,实时性较推模

式差,但是可以根据自身的处理能力而控制拉取的消息量。

消息回溯:

重置消息 offset(如:kafka、rokcetMq) 一般消息在消费完成之后就被处

理了,之后再也不能消费到该条消息。消息回溯正好相反,是指消息在消费完成之后,还

能消费到之前被消费掉的消息。对于消息而言,经常面临的问题是“消息丢失”,至于是

真正由于消息中间件的缺陷丢失还是由于使用方的误用而丢失一般很难追查,如果消息中

间件本身具备消息回溯功能的话,可以通过回溯消费复现“丢失的”消息 进而查出问题的

源头之所在。消息回溯的作用远不止与此,比如还有索引恢复、本地缓存重建,有些业务

补偿方案也可以采用回溯的方式来实现。

消息堆积:

流量削峰是消息中间件的一个非常重要的功能,而这个功能其实得益于其消息

堆积能力。从某种意义上来讲,如果一个消息中间件不具备消息堆积的能力,那么就不能

把它看做是一个合格的消息中间件。消息堆积分内存式堆积和磁盘式堆积。

消息持久化:

持久化确保 MQ 的使用不只是一个部分场景的辅助工具,而是让 MQ 能像

数据库一样存储核心的数据。有些功能是默认不开启的,需要进行配置。

多租户:

也可以称为多重租赁技术,是一种软件架构技术,主要用来实现多用户的环境下

公用相同的系统或程序组件,并且仍可以确保各用户间数据的隔离性。RabbitMQ 就能够

支持多租户技术,每一个租户表示为一个 vhost,其本质上是一个独立的小型 RabbitMQ

服务器,又有自己独立 的队列、交换器及绑定关系等,并且它拥有自己独立的权限。

vhost 就像是物理机中的虚拟机 一样,它们在各个实例间提供逻辑上的分离,为不同程序

安全保密地允许数据,它既能将同一 个 RabbitMQ 中的众多客户区分开,又可以避免队

列和交换器等命名冲突.

跨语言支持:

对很多公司而言,其技术栈体系中会有多种编程语言,如 C/C++、JAVA、

Go、PHP 等,消息 中间件本身具备应用解耦的特性,如果能够进一步的支持多客户端语

言,那么就可以将此特性 的效能扩大。跨语言的支持力度也可以从侧面反映出一个消息中

间件的流行程度。

消息顺序消息:

先进先出、 逐条进行消费顾名思义,消息顺序性是指保证消息有序。这个

功能有个很常见的应用场景就是 CDC(Change Data Chapture),以 MySQL 为例,如

果其传输的 binlog 的顺序出错,比如原本是先对一条数据加 1,然后再乘以 2,发送错序

之后就变成了先乘以 2 后加 1 了,造成了数据不一致。

安全机制:

在 Kafka 0.9 版本之后就开始增加了身份认证和权限控制两种安全机制。身份

认证是指客户端与服务端连接进行身份认证,包括客户端与 Broker 之间、Broker 与

Broker 之间、Broker 与 ZooKeeper 之间的连接认证,目前支持 SSL、SASL 等认证机

制。权限控制是指对客户端的读写操作进行权限控制,包括对消息或 Kafka 集群操作权限

控制。权限控制是可插拔的,并支持与外部的授权服务进行集成。对于 RabbitMQ 而

言,其同样提供身份认证(TLS/SSL、SASL)和 权限控制(读写操作)的安全机制。

事务支持:

事务本身是一个并不陌生的词汇,事务是由事务开始(Begin Transaction)

和事务结束(End Transaction)之间执行的全体操作组成。支持事务的消息中间件并不

在少数,Kafka 和 RabbitMQ 都支持,不过此两者的事务是指生产者发生消息的事务,要

么发送成功,要么发送失败。消息中间件可以作为用来实现分布式事务的一种手段,但其

本身并不提供全局分布式事务的功能。