主要是想了解两者根本的不同点
rabbitmq是消息队列,而kafka是分布式流式系统
可以把rabbitmq看做是一个消息排队的场地,消息会死掉,但kafka不会,他是顺序的、根据topics区分主题的、留存的场地,他把消息当做日志文件来看,消息本身无状态,不存在生命周期,不会死掉
死信交换器(DLX)
DLX的主要思路是根据合适的配置信息自动地把路由失败的消息发送到DLX,并且在交换器上根据规则来进一步的处理,比如异常重试,重试计数以及发送到“人为干预”的队列
rabbitmq
rabbitmq是目前使用最广泛的mq,主要的组成部分分为provider(生产者)、exchange(交换器)、routing(路由)、queue(队列)和consumer(消费者)。
在spring框架内使用时,需要使用配置类配置rabbitmq,定义交换器和队列,将队列和交换器绑定;定义生产者时,使用mqTemplate,包装同一个业务类型下的生产者类发送消息;定义消费者时,使用@rabbitmqlistener和@component将消费者注入spring。
根据不同的业务需求,消费者消费数据的方式不一样,分发消息的方式也不一样。目前支持的几种模式分为通信模式、工作模式、发布订阅模式、路由模式、主题模式。
当供需关系是1:1时,使用最简单的通信模式,一个生产者对应一个消费者,中间使用一个队列传输消息;
当需要加快消费速度时,使用工作模式,多个消费者监听一个队列,谁先抢到谁就消费,当并发量高后可能会出现消息重复消费的情况,此时需要在业务逻辑中做好幂等性,也可通过消息的ID设置全局锁,防止重复消费;
当有多个队列都想消费同一类消息时,可使用订阅模式,将需要接受消息的队列都绑定到交换器上,交换器会将消息发给每一个绑定上的队列中去,实现消息共享;
当生产者发送的消息越来越多,消息的类型变得比较杂,避免消息量过大使消费者一直接受消息,减少工作负担,将消息分类处理,此时可用路由模式,使用交换器,将不同的队列均绑定在一个交换器上面,生产者发送消息时需通过交换器指定路由,交换器根据路由将消息分发到指定的队列去;
当消息的分类变得庞大,路由变得多了起来,如果一味的扩充队列,会非常浪费资源,可能存在长时间不工作的队列,所以可将路由划分主题,使用主题模式,将同一类的队列使用通配符的方式合并起来,发送此主题的消息时,交换器会将消息根据通配符规则发给指定的队列。