不同的消息队列产品在功能和特性方面是各有优劣的,但是我们在选择的时候应尽量保证一个通用的最低标准。
1.必须是开源的产品
开源很重要,如果在使用该产品时遇到了影响业务的bug,可以通过修改源代码来进行修复。否则就只能等待开发者发布下一个版本了。
2.必须是近年来比较流行且有一定社区活跃度的产品
流行的好处是我们遇到的bug会比较少,其次,流行的产品与周边生态系统会有比较好的集成和兼容。例如flink内置了kafka的data source,使用kafka很容易作为flink的数据源开发流计算应用。
3.必须包括几个重要的特性
对于消息队列来说,主要有两种模型:点对点队列模型和发布/订阅模型。二者的最大区别在于一份消息数据能否被消费多次的问题。
点对点队列模型
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iI9gCNxR-1667985459686)(./img/chp2-1.png)]](https://1000bd.com/contentImg/2024/04/26/ae6a9971b2146149.png)
发布/订阅模型
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bHbRkkhV-1667985459687)(./img/chp2-2.png)]](https://1000bd.com/contentImg/2024/04/26/4ba4bdbb4a971f16.png)
实际上在发布/订阅模型中,如果只有一个订阅者,那么它和队列模型基本是一样的。也就是说,发布/订阅模型在功能层面上是可以兼容队列模型的。
1.RabbitMQ
优点
Producer和Queue之间增加了一个Exchange模块(可以理解为交换机),可以自由实现路由规则,使得路由配置更加灵活;缺点
RabbitMQ使用的是队列模型,它通过配置Exchange模块来将消息投放到多个队列,来实现发布/订阅模式。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DpUJcyho-1667985459689)(./img/chp2-3.png)]](https://1000bd.com/contentImg/2024/04/26/c3e00f41864b938f.png)
2.RocketMQ
优点
缺点
RocketMQ使用的是发布/订阅模型,通过消费者组来实现对消息的重复消费。同一个消费者组中的消费者只能消费不同的队列,不同消费者组中的消费者可以消费同一队列。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kRAuzkDU-1667985459689)(./img/chp2-4.png)]](https://1000bd.com/contentImg/2024/04/26/7f9aa426393a9c53.png)
3.Kafka
优点
缺点
kafka同样使用发布/订阅模型,它同样通过消费者组实现重复消费,不过RocketMQ中的队列(Queue)在kafka中称为分区(Partition)。
4.Pulsar
新兴的开源消息队列,采用存储和计算分离的设计,成熟度还没有很高。
5.ActiveMQ
老一代消息队列,逐渐淘汰。