文章目录
🍰有几个原因可以解释为什么要选择 RabbitMQ:
- 灵活性和可靠性:RabbitMQ 提供了丰富的消息传递模型和功能,使开发者能够设计出灵活而复杂的消息路由机制。它还提供了可靠的消息传递机制,包括消息确认、持久化等,确保消息的可靠传递。
- 可扩展性和高性能:RabbitMQ 具备良好的水平扩展能力,可以轻松处理大量的并发连接和高吞吐量。它的性能表现稳定,并且在大规模部署中经得起考验。
- 协议支持和跨平台兼容性:RabbitMQ 基于 AMQP(Advanced Message Queuing Protocol)标准,并支持多种编程语言和平台。这意味着您可以使用多种语言和技术栈来与 RabbitMQ 进行交互,从而方便地集成到您的现有系统中。
- 社区支持和稳定性:RabbitMQ 是一个广受欢迎的开源项目,拥有活跃的社区支持和持续的更新。它已经经过多年的稳定运行和广泛应用,在很多大型企业和组织中被广泛信赖。
- 丰富的功能和插件:RabbitMQ 提供了许多有用的功能和插件,如消息优先级、延迟队列、RPC(Remote Procedure Call)等。这些功能可以根据具体需求进行配置和扩展,使得 RabbitMQ 更加灵活且适用于各种场景。
- 管理和监控:RabbitMQ 提供了直观的管理界面,方便您管理队列、交换机、绑定等,并监控关键性能指标和健康状态。这使您能够方便地查看和管理消息传递的整个过程。
- 总而言之,选择 RabbitMQ 的原因是它提供了一个可靠、灵活且功能强大的消息传递解决方案。它广泛应用于企业集成、异步任务处理、实时数据流处理等各种场景。
- 当然,在选择消息队列解决方案时,您还需要考虑其他因素,如团队经验、技术栈兼容性等。但基于其特点和广泛的应用,RabbitMQ 是一个值得考虑且常见的选择。
- 当涉及到消息队列(Message Queue,简称 MQ)时,RabbitMQ 是其中一个广为人知且流行的解决方案。以下是 RabbitMQ 和其他 MQ 解决方案之间的一些比较:
🥩mq之间的对比
几种常见MQ的对比:
RabbitMQActiveMQRocketMQ****Kafka公司/社区RabbitApache阿里Apache开发语言ErlangJavaJavaScala&Java协议支持AMQP,XMPP,SMTP,STOMPOpenWire,STOMP,REST,XMPP,AMQP自定义协议自定义协议可用性高一般高高单机吞吐量一般差高非常高消息延迟微秒级毫秒级毫秒级毫秒以内消息可靠性高一般高一般
追求可用性:Kafka、 RocketMQ 、RabbitMQ
追求可靠性:RabbitMQ、RocketMQ
追求吞吐能力:RocketMQ、Kafka
追求消息低延迟:RabbitMQ、Kafka
🌽RabbitMQ vs Apache Kafka
- 消息模型:RabbitMQ 使用点对点和发布/订阅模型,而 Kafka 则是一个高吞吐量的分布式消息系统,适用于流处理、事件驱动和日志传输。
- 可靠性:RabbitMQ 提供了丰富的可靠性机制,如消息确认和持久化。而 Kafka 通过数据复制和分区副本保障消息的持久性和容错性。
- 延迟:RabbitMQ 在低延迟的场景下表现更好,适合需要实时处理的应用程序。Kafka 更适合大规模的实时数据流处理,但相对有较高的延迟。
- 扩展性:Kafka 具备更好的水平扩展能力,可以轻松处理大量的并发连接和高吞吐量。
- 使用场景:RabbitMQ 适用于传统的企业应用集成、任务调度等场景;Kafka 更适用于大规模的数据管道、日志聚合和实时流处理。
🌽RabbitMQ vs ActiveMQ
- 协议支持:RabbitMQ 实现了 AMQP 协议,而 ActiveMQ 支持多种协议,包括 AMQP、STOMP、OpenWire 等。
- 性能:RabbitMQ 在吞吐量方面表现更优,尤其在高并发和大规模消息交换的场景下。ActiveMQ 相对较慢,但对于中小型应用仍然具备足够的性能。
- 可靠性:RabbitMQ 提供了丰富的可靠性机制,如消息确认和持久化。ActiveMQ 也提供了持久化、事务等机制来保证消息的可靠传递。
- 功能和插件:RabbitMQ 提供了更多的功能和插件,例如消息优先级、RPC、延迟队列等。ActiveMQ 也有类似的功能,但相对较少一些。
🌽RabbitMQ vs RocketMQ
RabbitMQ和RocketMQ是两个流行的消息系统,用于构建分布式和可扩展的应用程序。虽然它们有相似的目标,但在它们之间存在几个区别,可以帮助您决定哪个更适合您特定的使用场景。
1. 开源性: RabbitMQ是用Erlang编写的开源消息代理,而RocketMQ也是由阿里巴巴集团开发的开源分布式消息系统,使用Java编写。这两个项目都有活跃的社区,并定期进行更新。
2. 语言支持: RabbitMQ为多种编程语言提供官方客户端库,包括Java、Python、Ruby、.NET等。另一方面,RocketMQ本地支持Java客户端,但也有由社区支持的其他语言(如Go、Python和C++)的客户端库。
3. 消息模式: RabbitMQ主要专注于支持AMQP(高级消息队列协议),并支持广泛的消息模式,如发布/订阅、请求/回复和工作队列。RocketMQ设计用于高吞吐量、低延迟的场景,并针对流式处理和事件驱动架构进行了优化。它支持发布/订阅、点对点和请求/回复消息模式。
4. 可扩展性和性能: RabbitMQ和RocketMQ都具有高度的可扩展性,但RocketMQ专门设计用于处理大量低延迟的消息。它通过消息批处理、消息压缩和分布式架构等功能实现这一点。如果您需要高性能的大规模消息传递,RocketMQ可能更合适。
5. 数据持久化: RabbitMQ默认将消息存储在磁盘上,即使代理重新启动也能确保持久性。相比之下,RocketMQ依靠预写日志和副本来实现容错和数据持久化。
6. 社区和生态系统: 作为一个流行的消息系统,RabbitMQ拥有成熟的社区和丰富的插件和集成生态系统。RocketMQ拥有不断增长的社区,并在中国市场上更常见,重点在于阿里巴巴的生态系统。
最终,在RabbitMQ和RocketMQ之间的选择取决于您的具体需求。如果您需要强大的语言支持、丰富的生态系统和灵活的消息模式,请选择RabbitMQ。另一方面,如果您优先考虑高吞吐量、低延迟和原生Java集成,请选择RocketMQ。
🌽RabbitMQ vs Redis
- 数据类型:Redis 是一个内存数据库,具有键值存储、列表、集合等数据结构,同时也支持发布/订阅模式。RabbitMQ 则专注于消息队列的功能。
- 消息传递模型:RabbitMQ 提供了丰富的消息传递模型,更适合复杂的消息路由和消费者管理。Redis 的发布/订阅模式更适合简单的发布和订阅场景。
- 持久化:RabbitMQ 提供了可靠的消息持久化机制,适用于需要持久化的消息传递。Redis 也可以通过持久化机制来保留数据,但主要关注于内存数据库的性能。
- 性能:Redis 是一个非常快速的内存数据库,适用于低延迟和高吞吐量的场景。RabbitMQ 的性能也很好,但相对 Redis 来说稍慢一些。
这些比较提供了一些关键区别,但选择合适的 MQ 解决方案还应基于具体的使用案例、需求和性能要求。每个解决方案都有其优势和适用场景,因此您可能需要根据自己的情况进行评估和选择。
在 Redis 中,订阅和发布是一种基于发布/订阅模式的消息传递机制。通过使用 Redis 提供的PUBLISH
命令进行消息发布,以及使用
SUBSCRIBE
命令进行消息订阅,您可以实现简单而强大的消息传递功能。以下是 Redis 订阅和发布的详细步骤:
🥩linux docker 部署 rabbitmq
docker怎么拉镜像已经写过很多遍了,还是不清楚可以看之前的例子https://blog.csdn.net/qq_39017153/article/details/131976173?spm=1001.2014.3001.5501
🌽拉去镜像
docker pull rabbitmq
15672(UI页面通信口,浏览器界面)、5672(client端通信口,最常用到的)、25672(server间内部通信口)、61613(stomp 消息传输)、1883(MQTT消息队列遥测传输)
🌽创建挂载目录
mkdir-p /data/apps/rabbitmq/data
mkdir-p /data/apps/rabbitmq/conf
mkdir-p /data/apps/rabbitmq/log
还是一样给你创建文件授权 我这里怕麻烦直接给的最大
chmod-R777 /data/apps/rabbitmq
🌽运行镜像
docker run \-p5672:5672 -p15672:15672 \--name rabbitmq \--hostname my-rabbit \-v /data/apps/rabbitmq/data:/var/lib/rabbitmq \-v /data/apps/rabbitmq/conf:/etc/rabbitmq \-v /data/apps/rabbitmq/log:/var/log/rabbitmq \-eRABBITMQ_DEFAULT_USER=admin \-eRABBITMQ_DEFAULT_PASS=admin \-d rabbitmq:latest
🌽安装可视化界面插件 : 进入容器
dockerexec-it rabbitmq bash
进入容器后执行安装插件命令 ,执行完成 访问
ip+15672
即可访问
rabbitmq-plugins enable rabbitmq_management
🥩Springboot AMQP RabbitMQ发送消息示例
SpringAMQP是基于RabbitMQ封装的一套模板,并且还利用SpringBoot对其实现了自动装配,使用起来非常方便。
SpringAmqp的官方地址:https://spring.io/projects/spring-amqp
SpringAMQP提供了三个功能:
自动声明队列、交换机及其绑定关系
基于注解的监听器模式,异步接收消息
封装了RabbitTemplate工具,用于发送消息
🌽Basic Queue 简单队列模型
下面是一个使用Spring Boot和RabbitMQ的基本示例:
首先,确保你已经在项目中引入了Spring Boot和RabbitMQ的依赖。
<!-- pom.xml --><dependencies><!-- Spring Boot Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!-- RabbitMQ Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency></dependencies>
🌽消息发送
接下来,配置RabbitMQ连接和相关属性。
# application.ymlspring:rabbitmq:host: 192.168.xxx.xxx # 主机名port:5672# 端口virtual-host: / # 虚拟主机username: itcast # 用户名password:123321# 密码listener:simple:prefetch:1# 每次只能获取一条消息,处理完成才能获取下一个消息
创建发送消息的生产者。
importorg.springframework.amqp.rabbit.core.RabbitTemplate;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Component;@ComponentpublicclassMessageProducer{privatefinalRabbitTemplate rabbitTemplate;@AutowiredpublicMessageProducer(RabbitTemplate rabbitTemplate){this.rabbitTemplate = rabbitTemplate;}publicvoidsendMessage(String message){
rabbitTemplate.convertAndSend("my-queue", message);}}
🌽消息接收
创建消息队列
@ConfigurationpublicclassFanoutConfig{// itcast.fanout@BeanpublicQueuefanoutQueue1(){returnnewQueue("my-queue");}}
创建接收消息的消费者。
importorg.springframework.amqp.rabbit.annotation.RabbitListener;importorg.springframework.stereotype.Component;@ComponentpublicclassMessageConsumer{@RabbitListener(queues ="my-queue")publicvoidreceiveMessage(String message){System.out.println("Received message: "+ message);}}
最后,在启动类上添加注解@EnableRabbit,以启用RabbitMQ相关功能。
importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.context.annotation.ComponentScan;importorg.springframework.scheduling.annotation.EnableScheduling;@SpringBootApplication@EnableRabbitpublicclassRabbitMQDemoApplication{publicstaticvoidmain(String[] args){SpringApplication.run(RabbitMQDemoApplication.class, args);}}
通过以上示例,你已经完成了一个简单的Spring Boot和RabbitMQ集成的应用程序。当调用
MessageProducer
的
sendMessage()
方法时,消息将会发送到名为"my-queue"的队列中,并被
MessageConsumer
的
receiveMessage()
方法接收和处理。
🌽添加消息对象序列化
为需要重写序列化对象,因为默认使用的是JDK对象序列化,性能差,有安全漏洞,所以推荐使用JSON序列化
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency>
@BeanpublicMessageConvertermessageConverter(){returnnewJackson2JsonMessageConverter();}
🌽使用对象发送消息
@Testpublicvoidtest(){String queueName ="object.queue";Map<String,Object> msg =newHashMap<>();
msg.put("name","柳岩");
msg.put("age","18");
rabbitTemplate.convertAndSend(queueName,msg);}
@RabbitListener(queues ="object.queue")publicvoidlistenObjectQueue(Map<String,Object> msg){System.out.println("接收到object.queue的消息:"+ msg);}
到mq界面上可以看到我们的柳岩了
🥩在使用MQ(消息队列)时,需要注意以下几个问题
🌽1. 消息丢失:
- 解决方案: - 开启消息持久化:将消息保存到持久化存储介质(如磁盘)中,以确保即使在系统故障或重启后,消息也能够被恢复。- 设置合适的消息超时时间:根据业务需求,合理设置消息的过期时间,避免长期滞留的消息占用资源。- 使用备份和冗余机制:在分布式环境下,可以使用主备架构、多副本复制等机制来保障消息的可靠性。
🌽2. 消息顺序:
- 解决方案: - 使用单一消息队列:为了确保消息的有序处理,可以使用单一消息队列,使消息按照先后顺序进行处理。- 对消息进行分区:如果需要水平扩展,可以将消息划分为多个分区,并根据分区进行顺序处理。
🌽3. 幂等性:
- 解决方案: - 唯一标识符:为每条消息生成唯一的标识符,在消息处理前检查该标识符是否已经处理过,避免重复消费。- 幂等性校验:记录已处理的消息ID或内容,并在每次接收到消息时进行查重,确保同一消息不会被处理多次。- 事务性处理:将消息的处理逻辑与更新数据库、缓存等操作放在同一个事务中,并通过回滚事务来避免重复处理。
🌽4. 性能和吞吐量:
- 解决方案: - 优化代码逻辑:合理设计消息生产者和消费者的代码逻辑,减少不必要的网络通信或资源占用。- 合理配置MQ参数:根据系统需求,调整MQ的配置参数,如队列长度、批量发送等,以提高性能和吞吐量。- 水平扩展:通过增加消息队列的实例或增加消费者线程数等方式,实现水平扩展,提升处理能力。
🌽5. 容错性和可靠性:
- 解决方案: - 主备架构:使用主备模式,当主节点故障时,自动切换到备份节点,确保消息服务的高可用性。- 多副本复制:将消息队列的内容复制到多个节点上,实现数据的冗余备份,确保数据的安全性和可靠性。
🌽6. 监控和调优:
- 解决方案: - 实时监控:配置监控系统,实时监测消息的发送和消费情况,及时发现异常并进行处理。- 性能调优:定期进行性能分析和调优,根据监控数据调整配置参数,提升系统的性能和吞吐量。
综上所述,针对MQ使用中需要注意的问题,我们提供了相应的解决方案。根据具体的业务需求和系统环境,可以结合这些解决方案来确保消息队列的稳定运行和可靠性。
版权归原作者 孟德爱吃香菜 所有, 如有侵权,请联系我们删除。