消息队列中间价都有哪些
先进先出
Kafka、Pulsar、RocketMQ、RabbitMQ、NSQ、ActiveMQ
架构
消费推拉模式
客户端消费者获取消息的方式,Kafka和RocketMQ是通过长轮询Pull的方式拉取消息,RabbitMQ、Pulsar、NSQ都是通过Push的方式。
- pull类型的消息队列更适合高吞吐量的场景,允许消费者自己进行流量控制,根据消费者实际的消费能力去获取消息。
- push类型的消息队列,实时性更好,但需要有一套良好的流控策略(backpressure)当消费者消费能力不足时,减少push的消费数量,避免压垮消费端。
延迟消息
RabbitMQ需要安装一个rabbitmq_delayed_message_exchange插件
RocketMQ开源版本延迟消息临时存储在一个内部主题中,不支持任意时间精度,支持特定的level,例如定时5s,10s,1m等。
Kafka不支持延迟消息。Pulsar支持秒级的延迟消息
NSQ通过内存中的优先级队列来保存延迟消息,支持秒级精度,最多2个小时延迟。
死信队列
由于某些原因消息无法被正确的投递,为了确保消息不会被无故的丢弃,一般将其置于一个特殊角色的队列,这个队列一般称之为死信队列
流量削峰
主流消息队列都具有流量削峰功能,并且支持持久化存储;
Rabbitmq不公平分发
消费端 的信道 channel.basicQos(1);
**指定分发/预取值**:给消费者指定消费多少条消息
prefetch大于1 就会触发预取值
channel.basicQos(prefetch);
Rabbitmq 持久化
生产端 需要同时设置队列持久化和消息持久化
Rabbitmq 发布确认
前提需要开启队列和消息的持久化
信道开启发布确认
三种发布确认
单个发布确认 发一条确认一条,同步的;
批量发布确认
异步发布确认 企业推荐使用
Rabbitmq交换机
一个消息只能被消费一次 希望消息被消费两次时,使用交换机转发到另外一个队列----发布订阅模式;
路由模式,主题模式,发布确认模式,发布订阅模式等等;
什么是交换机
Exchanges的类型
扇出finout 标题header 主题topic 直接direct
无名交换机 routingkey可以与队列名一样
其他交换机routingkey不能与队列名一样 需要制定routingkey
临时队列
没有持久化的队列,一旦断开链接就会被删除的队列;队列名称随机的;
绑定
交换机通过routingkey跟队列绑定