当前位置: 首页 > news >正文

RabbitMQ使用指南

    • 介绍
    • 主要特点
    • 常用插件
      • 使用RabbitMQ的插件
      • 常用插件列表
    • 应用场景
    • Kafka与RabbitMq的区别
    • 主要优缺点
    • 安装步骤
      • 插件安装步骤
    • 使用RabbitMq
    • Java代码示例
    • 拓展

介绍

RabbitMQ是由Erlang语言开发的,基于AMQP(高级消息队列协议)协议实现的开源消息代理软件。它是一个实现了消息队列的中间件,遵循FIFO原则,用于应用程序之间的通信。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。
RabbitMQ在分布式系统开发中应用非常广泛,可以提高系统响应速度、异步处理任务、服务解耦、消除峰值等。例如,将不需要同步处理的并且耗时长的操作由消息队列通知消息接收方进行异步处理,提高了应用程序的响应时间。

在这里插入图片描述

主要特点

RabbitMQ的主要特点包括:
可靠性 :RabbitMQ使用持久化、传输确认以及发布确认等机制来保证消息的可靠性。
灵活的路由 :在消息进入队列之前,通过交换机来路由信息,可以实现灵活的消息分发。
扩展性 :多个RabbitMQ可以组成一个集群,也可以根据业务情况动态地扩展集群中的节点。
多语言客户端 :RabbitMQ支持非常多的语言,如Java,Python,Ruby,PHP,C#,JavaScript等。
管理界面 :RabbitMQ提供了一个易于使用的用户界面,使得用户可以监控和管理消息和集群中的节点等。
插件机制 :RabbitMQ提供了许多插件,实现从多方面进行扩展,也可以编写自己的插件。

常用插件

使用RabbitMQ的插件

要使用RabbitMQ的插件列表,您可以按照以下步骤进行操作:

  1. 访问RabbitMQ的官方网站,并转到“插件”页面。您可以在该页面上找到所有可用的插件列表。
  2. 在插件列表中,您可以查找适合您需求的插件。插件通常根据其功能进行分类,例如消息持久化、消息确认、消息路由等。
  3. 找到适合的插件后,请按照插件页面上的说明进行安装。通常,这包括将插件文件复制到RabbitMQ服务器上的特定位置,并执行一些配置任务。
  4. 安装完成后,您需要重新启动RabbitMQ服务器以使插件生效。
  5. 一旦插件安装并启用,您可以使用RabbitMQ的管理界面或相关工具来配置和管理该插件。具体的配置方法取决于插件的具体功能和要求。

请注意,使用RabbitMQ的插件时,您需要确保了解其工作原理和配置要求,以确保正确使用和充分发挥其作用。如果您不确定如何使用某个插件,建议参考RabbitMQ的官方文档或寻求相关社区和论坛的帮助。

常用插件列表

RabbitMQ常用的插件有很多,比如以下几个:

1. rabbitmq_amqp1_0 :这是一个支持AMQP 1.0协议的插件,可以让RabbitMQ使用AMQP协议进行通信。
2. rabbitmq_delayed_message_exchange :这个插件可以设置消息的延迟时间,实现延迟消息的发送。
3. rabbitmq_federation:该插件可以实现RabbitMQ集群之间的消息联邦,使得消息可以在不同的集群之间进行传递。
4. rabbitmq_sharding :这是一个分片插件,用于实现消息的分布式处理。
5. rabbitmq_shovel :这个插件可以实现消息的静态路由,可以将消息路由到指定的队列。
6. rabbitmq_tracing :该插件可以实现对RabbitMQ消息的跟踪和监控。
7. rabbitmq_mqtt :这是一个MQTT插件,可以让RabbitMQ支持MQTT协议。
8. rabbitmq_web_mqtt :这是一个基于HTTP的MQTT插件,可以让MQTT客户端通过HTTP协议与RabbitMQ进行通信。
9. rabbitmq_stomp :这是一个STOMP插件,可以让RabbitMQ支持STOMP协议。
10. rabbitmq_web_stomp :这是一个基于HTTP的STOMP插件,可以让STOMP客户端通过HTTP协议与RabbitMQ进行通信。
11. rabbitmq_consistent_hash_exchange :这个插件可以实现一致性哈希交换,可以将消息根据key值进行路由,并发送到对应的队列。

应用场景

RabbitMQ在以下场景中具有广泛应用:
异步处理任务 :通过使用RabbitMQ,可以将任务异步发送到消息队列中,由消费者异步处理,从而实现系统解耦和高并发处理。例如,订单系统可以将订单数据发送到消息队列中,由库存系统和支付系统异步处理。
消息通知 :在分布式系统中,各个模块之间需要相互通信,例如用户注册、支付成功、物流状态等。通过使用 RabbitMQ,可以将消息发送到消息队列中,由消费者接收并处理,实现消息通知功能。
日志处理 :RabbitMQ可用于日志处理,例如日志收集、日志分析等。通过将日志消息发送到消息队列中,可以实现日志的异步处理,同时可以通过设置消息的属性、路由规则等来实现不同类型的日志处理。
应对大流量场景 :在商品秒杀、抢购等流量短时间内暴增场景中,为了防止后端应用被压垮,可在前后端系统间使用 RabbitMQ 消息队列传递请求。

Kafka与RabbitMq的区别

RabbitMQ和Kafka都是广泛使用的消息队列系统,它们在以下方面存在一些差异:

  1. 语言与开发:RabbitMQ是由Erlang语言开发的,主要用于实时且对可靠性要求较高的消息传递。而Kafka则是由Scala语言开发的,主要用于处理活跃的流式数据,特别是在大数据量的处理上。
  2. 架构与交互方式:RabbitMQ以broker为中心,包含Exchange、Binding和Queue等组成部分。而Kafka则以consumer为中心,无消息确认机制。在集群负载均衡方面,Kafka比RabbitMQ更具优势。
  3. 吞吐量与持久化:RabbitMQ支持消息的可靠传递,支持事务,不支持批量操作,基于存储的可靠性要求存储可以采用内存或硬盘,吞吐量相对较小。而Kafka内部采用消息的批量处理,数据的存储和获取是本地磁盘顺序批量操作,消息处理的效率高,吞吐量高。另外,Kafka的消息被消费后仍保存在磁盘中。
  4. 性能与扩展性:由于RabbitMQ使用AMQP协议,其性能相对较高,但扩展性相对较差。而Kafka使用Pull方式获取消息,客户端直接与Broker交互,使得其具有较好的扩展性。

RabbitMQ和Kafka在语言与开发、架构与交互方式、吞吐量与持久化、性能与扩展性等方面存在明显差异。选择使用哪个系统取决于具体的应用场景和需求。

主要优缺点

RabbitMQ是一款广泛使用的开源消息队列系统,它具有以下优点:

  1. 可靠性:RabbitMQ提供了高可靠性的消息传输,通过持久化机制和消息确认机制,保证了消息的可靠性和不丢失。
  2. 灵活性:RabbitMQ支持多种消息协议和数据格式,可以灵活地满足不同的业务需求。
  3. 可扩展性:RabbitMQ可以轻松地进行横向扩展,支持多个生产者和消费者,可以有效地提高系统的吞吐量和并发处理能力。
  4. 易用性:RabbitMQ具有友好的用户界面和丰富的客户端库支持,可以方便地进行管理和使用。

然而,RabbitMQ也存在一些缺点:

  1. 性能开销:引入RabbitMQ作为中间件,会增加系统的复杂度和性能开销。
  2. 适用场景有限:RabbitMQ对于需要高吞吐量和低延迟的应用场景可能不够适用。
  3. 消息一致性:在分布式环境中,确保消息的一致性是一个挑战。如果处理不当,可能会导致数据不一致的问题。
  4. 故障恢复:如果RabbitMQ服务器出现故障,需要一定的时间进行故障恢复,这期间可能会对系统可用性造成影响。

安装步骤

在Linux平台上安装RabbitMQ的详细步骤如下:

  1. 打开终端,使用root用户或者sudo权限的用户登录。
  2. 进入RabbitMQ的安装包所在目录。
  3. 执行以下命令解压安装包:
tar -xzf rabbitmq-server-generic-unix-3.11.0.tar.gz
  1. 进入解压后的目录:
cd rabbitmq_server-3.11.0
  1. 执行以下命令创建配置文件:
cp -r etc /usr/local/rabbitmq
  1. 进入RabbitMQ的安装目录:
cd /usr/local/rabbitmq
  1. 执行以下命令启动RabbitMQ服务:
rabbitmq-server start
  1. RabbitMQ服务启动后,可以运行以下命令进行测试:
rabbitmqctl status

如果看到输出中的"running"字样,说明安装成功。
9. 执行以下命令关闭RabbitMQ服务:

rabbitmqctl stop
  1. 如果需要设置开机启动,可以执行以下命令:
rabbitmq-service add /usr/local/rabbitmq/sbin/rabbitmq-server start /usr/local/rabbitmq/sbin/rabbitmqctl start /usr/local/rabbitmq/sbin/rabbitmqctl stop /usr/local/rabbitmq/sbin/rabbitmqctl restart /usr/local/rabbitmq/sbin/rabbitmqctl status /usr/local/rabbitmq/sbin/rabbitmqctl set_permissions -p / /guest:* //guest:* /mnesia:/ /log:/ /mnesia:/ /log:/ /mnesia:/ /log:/ /mnesia:/ /log:/ /mnesia:/ /log:/ /mnesia:/ /log:/ /mnesia:/ /log:/ /mnesia:/ /log:/ /mnesia:/ /log:/ /mnesia:/ /log:/ /mnesia:/ /log:/

插件安装步骤

RabbitMQ的插件安装步骤如下:

  1. 找到RabbitMQ的安装目录,进入plugins文件夹。
  2. 将需要安装的插件文件复制到plugins文件夹中。
  3. 打开RabbitMQ的管理界面,进入“Plugins”选项卡。
  4. 在列表中找到并选择需要安装的插件,点击“Enable”按钮。
  5. 等待插件安装完成,安装过程中请勿关闭窗口或断开网络连接。
  6. 安装完成后,重新启动RabbitMQ服务,使插件生效。

使用RabbitMq

RabbitMQ是一款广泛使用的开源消息队列系统,它支持多种消息协议和数据格式,可以灵活地满足不同的业务需求。以下是使用RabbitMQ的基本步骤:

  1. 配置RabbitMQ服务器:首先需要在服务器上安装RabbitMQ,并对其进行配置。可以按照默认配置进行安装和启动,也可以根据实际需求进行自定义配置。
  2. 创建交换器和队列:在RabbitMQ中,消息是通过交换器和队列进行路由的。可以根据实际需求创建不同的交换器和队列,例如TopicExchange、DirectExchange、FanoutExchange等不同类型的交换器和Queue。
  3. 绑定交换器和队列:创建好交换器和队列后,需要将它们绑定在一起,以便消息可以在它们之间传递。可以使用Binding类来绑定交换器和队列。
  4. 发送消息:在生产者端,可以使用RabbitMQ的Java客户端库或其他语言的客户端库来发送消息到指定的交换器和队列。需要指定消息的routingKey和消息体。
  5. 接收消息:在消费者端,可以使用RabbitMQ的Java客户端库或其他语言的客户端库来接收消息。需要指定要监听的队列,并实现消息接收逻辑。
  6. 处理消息:在消费者端接收到消息后,可以对消息进行处理,例如执行业务逻辑、存储数据等操作。处理完成后可以通过ack机制通知RabbitMQ服务器消息已经被消费。
  7. 监控和管理:可以使用RabbitMQ的管理界面来监控和管理RabbitMQ服务器和消息队列的状态、性能等指标。也可以通过其他工具或插件来实现更高级的管理和监控功能。

以上是使用RabbitMQ的基本步骤,需要根据实际业务场景和需求进行适当的配置和调整。同时还需要注意消息的可靠传输、消息的持久化和顺序等问题,以及处理异常情况和性能优化等方面的注意事项。

Java代码示例

以下是一个简单的Java代码示例,演示如何使用RabbitMQ发送和接收消息:

发送消息:

import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel;public class Send {private final static String QUEUE_NAME = "hello";public static void main(String[] argv) throws Exception {ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {channel.queueDeclare(QUEUE_NAME, false, false, false, null);String message = "Hello World!";channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));System.out.println(" [x] Sent '" + message + "'");}}
}

接收消息:

import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;public class Recv {private final static String QUEUE_NAME = "hello";public static void main(String[] argv) throws Exception {ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {channel.queueDeclare(QUEUE_NAME, false, false, false, null);System.out.println(" [*] Waiting for messages. To exit press CTRL+C");DeliverCallback deliverCallback = (consumerTag, delivery) -> {String message = new String(delivery.getBody(), "UTF-8");System.out.println(" [x] Received '" + message + "'");};channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });}}
}

在这个示例中,我们首先创建了一个名为“hello”的队列,然后使用basicPublish方法将一条消息发送到该队列中。在Recv类中,我们创建了一个名为“hello”的队列,并使用basicConsume方法开始从队列中接收消息。当接收到消息时,DeliverCallback回调函数将被调用,以便对消息进行处理。

拓展

RabbitMq中交换器(Exchange)类型详解

相关文章:

  • C++学习笔记—— C++内存管理方式:new和delete操作符进行动态内存管理
  • Java解决二进制矩阵中特殊位置问题
  • 101基于matlab的极限学习机ELM算法进行遥感图像分类
  • YOLO_embedded: YOLO算法快速嵌入式部署
  • QT 重定向qdebug输出到自绘界面
  • Docker资源控制
  • Theamleaf导出pdf模版编写(原始th/td编写表格)
  • vue3 引入Element Plus 组件库
  • WPS Office JS宏实现批量处理Word中的标题和正文的样式
  • Altair推出 Altair RapidMiner 2023 平台,提供生成式 AI 功能
  • Kotlin Flow 操作符
  • 微前端个人理解与简单总结
  • Android应用:SharedPreferences、MMKV和DataStore怎么选
  • AWS 日志分析工具
  • FFmpeg的AVInputFormat
  • (三)从jvm层面了解线程的启动和停止
  • 【刷算法】从上往下打印二叉树
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • Angular Elements 及其运作原理
  • CSS居中完全指南——构建CSS居中决策树
  • Java 内存分配及垃圾回收机制初探
  • js中的正则表达式入门
  • 马上搞懂 GeoJSON
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 如何解决微信端直接跳WAP端
  • 深度学习在携程攻略社区的应用
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 使用 QuickBI 搭建酷炫可视化分析
  • 数组大概知多少
  • 微信小程序填坑清单
  • AI算硅基生命吗,为什么?
  • $.ajax()方法详解
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (篇九)MySQL常用内置函数
  • (生成器)yield与(迭代器)generator
  • (实战篇)如何缓存数据
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • ***测试-HTTP方法
  • **CI中自动类加载的用法总结
  • .bat批处理(六):替换字符串中匹配的子串
  • .Net - 类的介绍
  • .NET 命令行参数包含应用程序路径吗?
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • /usr/bin/python: can't decompress data; zlib not available 的异常处理
  • :如何用SQL脚本保存存储过程返回的结果集
  • [1181]linux两台服务器之间传输文件和文件夹
  • [Android] 240204批量生成联系人,短信,通话记录的APK
  • [Android] 修改设备访问权限
  • [C/C++]数据结构 堆的详解
  • [CF226E]Noble Knight's Path
  • [Flex][问题笔记]TextArea滚动条问题
  • [FT]chatglm2微调
  • [Java][方法引用]构造方法的引用事例分析
  • [jQuery]10 Things I Learned from the jQuery Source
  • [JS] node.js 入门