不同的消息中间件的有不同的适应场景 对于Kafka和Rabbitmq来说在不同的场景下可按照以下的功能点进行划分:

1. 优先级队列: 对于存在于队列中的消息,优先级高的消息具有被优先被消费的特权。这种情况有一种限制就是:消费者的消费速度要慢于生成者速度。

2. 延迟队列:延迟队列存储的是对应的延迟消息,适用的场景就是:生产者在生产消息后,并不想让消费之直接拿到消息,而是等待一段时间再去消费。实现方式一般采用基于队列的延迟:就是设置不同延迟级别的队列,每个队列中的延迟时间都是相同的。

3.死信队列:由于消息无法保证被正确投递,为了保证消息不会被无故丢弃,一般将其置于一个特殊角色的队列。

5.重试队列:消费端消息失败时为了防止消息无故丢失而重新将消息回滚到broker结点中,重试队列分为多个重试等级(每个不同的等级会设置不同的重新投递的时延)投递次数越多,时延越大。

6.消费模式:消费模式主要有推(push)和拉(pull)两种模式。推模式:Broker主动推送消息至消费端  拉模式:指的是消费者主动去Broker端去拉取。

7.广播消费:  消息的传递方式有:点对点P2P模式和发布订阅模式。对于点对点(P2P)模式和发布订阅(Pub/Sub)模式  Rabbitmq是一种点对点模式。Kafka是一种发布订阅模式。发布订阅模式定义了如何向一个内容节点发布和订阅消息。这个内容节点称为主题(topic)。主题可认为是消息传递的中介。消息发布者将消息发布到某个主题。而订阅者从主题中订阅消息。同时rabbitmq可以设置交换器类从而达到广播消费的效果。 Kafka也能以点对点的形式消费。可以把消费组(consumer group)的看成队列的概念

8.消息回溯:一般消息在消费完成后就被处理了,然后不能消费该条消息。消息回溯正好相反。是指消息在消费完成后,还能消费到之前被消费的消息。

9.消息堆积和持久化:消息堆积的目的在于流量削峰。消息堆积可以分为内存式堆积和磁盘式堆积。RabbitMQ是一种内存式堆积,Kafka是一种磁盘式堆积。

10.消息的幂等性:对于消息的传输, 对于确保消息在生产者和消费者之间进行传输而言一般有三种传输保障:1.至多一次,消息可能会丢失,但绝对不会重复;2.至少一次,消息绝不会丢失,可能重复。 3.精确传输 。 Kafka自0.11版本引入幂等性和事务。Kafka的幂等性式是指单个生产者对于单分区单会话的幂等。

11.事务性消息:生产者发生消息的事务,要么发送成功,要么发送失败。

kafka 延迟 数据重平衡 kafka延迟消息队列_kafka 延迟 数据重平衡

kafka 延迟 数据重平衡 kafka延迟消息队列_点对点_02

 Rabbitmq单机的QPS在万级别之内,Kafka单机的QPS可以维持在十万级别。甚至达到百万级别。

 所以:RabbitMQ 在于 routing,而 Kafka 在于 streaming  也就是说在消息可靠性机制上RabbitMQ更为完善,而Kafka更加注重吞吐量。