RabbitMQ学习,详解,解决消息丢失问题,交换器类型,消息确认机制

14 篇文章 0 订阅

一、RabbitMQ相关概念:

支持的语言:

  • Java
  • Python
  • .NET (C#)
  • JavaScript (Node.js)
  • Ruby
  • PHP
  • Go
  • Erlang
  • Elixir
  • Rust

核心概念

  • 消息(Message):用于在应用程序之间传递的数据单元。
  • 生产者(Producer):发送消息的应用程序。
  • 消费者(Consumer):接收和处理消息的应用程序。
  • 队列(Queue):用于存储消息的缓冲区。
  • 交换器(Exchange):接收来自生产者的消息,并将其路由到队列。
  • 绑定(Binding):定义交换器和队列之间的关联规则。

工作流程:

  • 生产者将消息发送到交换器。
  • 交换器根据预定义的路由规则将消息路由到一个或多个队列。
  • 消费者订阅并从队列中接收消息。
  • 消费者处理消息并发送确认(ACK)给 RabbitMQ。
  • RabbitMQ 在收到确认后删除队列中的消息。

特点:

  • 可靠性:RabbitMQ 提供持久化消息、消息确认和消息重试等机制,确保消息的可靠传递。
  • 高扩展性:RabbitMQ 支持分布式部署,可以通过添加多个节点来实现高吞吐量和可用性。比如 STOMP、MQTT 等等。
  • 多种协议支持:RabbitMQ 支持多种消息传递协议,如 AMQP、STOMP、MQTT 等。
  • 灵活的分发消息策略。这应该是RabbitMQ的一大特点。在消息进入MQ前由Exchange(交换机)进行路由消息。分发消息策略有:简单模式、工作队列模式、发布订阅模式、路由模式、通配符模式。
  • 支持集群。多台RabbitMQ服务器可以组成一个集群,形成一个逻辑Broker。
  • 支持多种语言客户端。RabbitMQ几乎支持所有常用编程语言,包括 Java、.NET、Ruby 等等。
  • 可视化管理界面。RabbitMQ提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker。
  • 插件机制。RabbitMQ提供了许多插件,可以通过插件进行扩展,也可以编写自己的插件。

二、rabbitmq使用场景:

  1. 异步通信:RabbitMQ 可以作为消息队列在分布式系统中实现异步通信,将耗时的任务从主应用程序解耦出来,提高系统的吞吐量和响应性能。

  2. 应用解耦:通过使用 RabbitMQ,不同的应用程序可以通过消息传递进行通信,实现解耦和松耦合的架构。这样,一个应用程序的变更不会直接影响其他应用程序的运行。

  3. 负载均衡:多个消费者可以订阅同一个队列,并共享消息的处理负载。这样可以实现负载均衡和水平扩展,确保系统在高负载时仍然能够高效处理消息。

  4. 日志处理:RabbitMQ 可以用于日志收集和处理。应用程序可以将日志消息发送到 RabbitMQ 中的队列,然后由消费者进行处理、存储或者进一步处理。

  5. 微服务架构:RabbitMQ 可以作为微服务架构中的消息总线,用于实现不同微服务之间的通信和协调。

三、rabbitmq的消息确认机制:

消息确认机制是 RabbitMQ 提供的一种保证消息可靠传递的机制。当消费者从队列中接收到消息后,可以通过发送确认(ACK)的方式告知 RabbitMQ 消息已经被成功处理。如果消费者在处理消息时发生错误或失败,消息可以重新放回队列或者交由其他消费者处理,以确保消息不会丢失。

包括发送消息确认和消费消息确认;

RabbitMQ 提供了消息确认机制,用于确保消息在传递过程中的可靠性。这个机制包括两个关键概念:消息确认(ACK)和消息拒绝(NACK)。

当消费者从队列中接收到消息时,它可以向 RabbitMQ 发送确认消息(ACK),表示消息已经成功处理。RabbitMQ 在接收到确认消息后,会将该消息从队列中删除。这样可以确保消息不会被重复处理。

消息确认机制的工作流程如下:

  1. 消费者从队列中接收到消息。
  2. 消费者处理消息,确保消息被成功处理。
  3. 消费者向 RabbitMQ 发送确认消息(ACK)。
  4. RabbitMQ 收到确认消息后,将消息从队列中删除。

如果消费者在处理消息时发生错误或失败,可以选择拒绝消息。消费者可以向 RabbitMQ 发送拒绝消息(NACK)来表示消息处理失败。RabbitMQ 收到拒绝消息后,可以根据配置的策略将消息重新放回队列,或者将消息发送到备份交换器(备份交换器是一种配置在主交换器之后的交换器,用于处理被拒绝的消息)。

消息确认机制的优点包括:

  1. 可靠性:通过消息确认机制,消费者可以确保消息被成功处理,避免消息的丢失和重复处理。

  2. 顺序性:消息确认机制可以确保消息按照正确的顺序进行处理。当消费者确认一条消息后,RabbitMQ 才会将下一条消息发送给该消费者。

要使用消息确认机制,需要注意以下几点:

  1. 需要手动发送确认消息:在消费者代码中,需要显式地发送确认消息(ACK)或拒绝消息(NACK)给 RabbitMQ。这样可以确保消息的处理状态被正确反馈给 RabbitMQ。

  2. 手动确认模式和自动确认模式:RabbitMQ 提供了手动确认模式和自动确认模式两种选择。在手动确认模式下,消费者需要显式地发送确认消息;而在自动确认模式下,RabbitMQ 会自动将消息视为已确认,不需要消费者发送确认消息。在需要精确控制消息确认的情况下,手动确认模式更为常用。

四、消息丢失问题

消息丢失问题是指在消息传递过程中可能发生的消息丢失情况。为了尽量避免消息丢失,可以采取以下措施:

  1. 持久化:将消息和队列设置为持久化,以确保在 RabbitMQ 服务器出现故障时消息不会丢失。

  2. 消息确认:消费者在处理完消息后发送确认(ACK)给 RabbitMQ,告知消息已经成功处理,避免消息重复传递。

  3. 发送方重试:发送方可以在发送消息时实现重试机制,以确保消息能够成功到达 RabbitMQ。

  4. 正确的消息路由:通过合理的交换器和绑定规则,将消息正确地路由到目标队列,避免消息被丢弃或者传递到错误的位置。

尽管 RabbitMQ 提供了这些机制来尽量避免消息丢失,但在极端情况下,仍然存在消息丢失的可能性。因此,在设计应用程序时,需要综合考虑消息的可靠性要求,并采取适当的措施来最小化消息丢失的风险。

五、RabbitMQ交换器类型

RabbitMQ 提供了不同类型的交换器(Exchange),用于定义消息的路由规则和分发策略。下面是 RabbitMQ 中常见的交换器类型:

  1. 直连(定向)交换器(Direct Exchange):直连交换器是最简单的交换器类型。它根据消息的路由键(Routing Key)将消息直接发送到绑定了相同路由键的队列中。

  2. 主题交换器(Topic Exchange):主题交换器根据消息的路由键进行模式匹配,并将消息发送到符合匹配规则的队列中。主题交换器使用通配符进行匹配,可以实现更灵活的消息路由。

  3. 扇形(广播)交换器(Fanout Exchange):扇形交换器将消息广播到所有绑定到该交换器的队列中。它忽略了消息的路由键,只需关注交换器和队列的绑定关系。

  4. 头交换器(Headers Exchange):头交换器使用消息的头部属性(Header)进行匹配,并将消息发送到匹配成功的队列中。头交换器不依赖于路由键,而是根据消息头部属性的匹配情况进行路由。

  5. 扩展交换器(Custom Exchanges):RabbitMQ 还允许自定义交换器类型。通过自定义交换器类型,可以实现更加灵活和复杂的消息路由策略。

在创建交换器时,需要指定交换器的名称、类型和其他可选参数。然后,将交换器绑定到队列上,以建立消息的路由规则。消费者可以根据需要绑定到指定的交换器和队列上,以接收和处理消息。

交换器类型的选择取决于具体的应用场景和消息路由的需求。不同的交换器;

六、配置服务端

在RabbitMQ的gitHub项目中,下载window版本的服务端安装包。

接着到双击安装,一直点下一步安装即可,安装完成后,找到安装目录;

在此目录下打开cmd命令,输入rabbitmq-plugins enable rabbitmq_management命令安装管理页面的插件:

然后双击rabbitmq-server.bat启动脚本,然后打开服务管理可以看到RabbitMQ正在运行:

打开浏览器输入http://localhost:15672,账号密码默认是:guest/guest

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值