RabbitMQ 系列教程

一、RabbitMQ 部署及配置详解(集群部署)

二、RabbitMQ 部署及配置详解 (单机)

三、RabbitMQ 详解及实例(含错误信息处理)

四、RabbitMq死信队列及其处理方案

五、RabbitMQ Java开发教程—官方原版 

六、RabbitMQ Java开发教程(二)—官方原版

七、RabbitMQ Java开发教程(三)—官方原版_

 

 

一、RabbitMQ 核心概念

1. 生产者和消费者

Producer: 消息的生产者,用于发布消息;

Consumer: 消息的消费者,用于从队列中获取消息.消费者只需关注队列即可,不需要关注交换机和路由键。消费者可以通过basicConsume(订阅模式可以从队列中一直持续的自动的接收消息)或者basicGet(先订阅消息,然后获取单条消息,再然后取消订阅。也就是说basicGet一次只能获取一条消息,如果还想再获取下一条还要再次调用basicGet)来从队列中获取消息。

2. RabbitMQ broker 服务器

RabbitMQ broker: 官方定义"RabbitMQ isn’t a food truck, it’s a delivery service",指明RabbitMQ是一种传输服务。

3. ExChange 交换机

Exchange: 生产者会将消息发送到交换机,然后交换机通过路由策略(规则)将消息路由到匹配的队列中去。ExchangeType决定了Exchange路由消息的行为,在RabbitMQ中,ExchangeType有direct、Fanout、Topic和Header 4种。Exchange 类似于数据通信网络中的交换机,提供消息路由策略。

在RabbitMQ 中,Producer 不是通过信道直接将消息发送给 Queue,而是先发送给 ExChange. 一个 ExChange 可以和多个 Queue 进行绑定,Producer 在传递消息的时候,会传递一个 ROUTING_KEY, ExChange 会根据这个 ROUTING_KEY 按照特定的路由算法,将消息路由给指定的 Message Queue。与 Queue 一样, ExChange 也可设置为持久化,临时或者自动删除。

4. Binding 绑定

所谓绑定就是将一个特定的 ExChange 和一个特定的 Queue 绑定起来,所以Binding不是一个概念,而是一种操作。RabbitMQ中通过绑定,以路由键作为桥梁将Exchange与Queue关联起来()Exchange—>Routing Key—>Queue,这样RabbitMQ就知道如何正确地将消息路由到指定的队列了,通过queueBind()方法将Exchange、Routing Key、Queue绑定起来.ExChange 和 Queue 的绑定可以是多对多的关系。

5. Binding Key 绑定键

Binding Key: 它表示的是Exchange与Message Queue是通过binding key进行绑定联系的,这个关系是固定的。初始化的时候,我们就会建立该队列。

6. Routing Key 路由键

Routing Key: 它是一个String值,用于定义路由规则。生产者在将消息发送给Exchange的时候,一般会指定一个routing key,来指定这个消息的路由规则。在队列绑定的时候需要指定路由键,在生产者发布消息的时候需要指定路由键,当消息的路由键和队列绑定的路由键匹配时,消息就会发送到该队列。

7. Message Queue 消息队列

用于存储消息的容器,可以看成一个有序的数组,生产者生产的消息会发送到交换机中,最终交换机将消息存储到某个或某些队列中。队列可被消费者订阅,消费者从订阅的队列中获取消息。

Message Queue: 消息队列,我们发送给RabbitMQ的消息最后都会到达各种queue,并且存储在其中(如果路由找不到相应的queue则数据会丢失),等待消费者来取.

消息队列提供了 FIFO 的处理机制,具有缓存消息的能力.在RabbitMQ 中,队列消息可以设置为持久化,临时或者自动删除.

设置为持久化的队列,Queue 中的消息会在 Server 本地硬盘存储一份,防止系统 Crash,数据丢失;

设置为临时的队列,Queue 中的数据在系统重启之后就会丢失;

设置为自动删除的队列,当没有用户连接到 Server,队列中的数据会被自动删除。

8. Virtual Host 虚拟主机

每一个RabbitMQ服务器都能创建多个虚拟消息服务器,我们称之为虚拟主机.每一个vhost本质上是一个mini版的RabbitMQ服务器,拥有自己的交换机、队列、绑定等,拥有自己的权限机制.vhost相对于RabbitMQ就像虚拟机之于物理机一样.他们通过在各个实例间提供逻辑上的分离,允许不同的应用程序安全保密的运行数据,这很有用,它既能将同一个Rabbit的众多客户区分开来,又可以避免队列和交换器的命名冲突.RabbitMQ提供了开箱即用的默认的虚拟主机“/”,如果不需要多个vhost可以直接使用这个默认的vhost,通过使用缺省的guest用户名和guest密码来访问默认的vhost.

vhost之间是相互独立的,这避免了各种命名的冲突,就像App中的沙盒的概念一样,每个沙盒是相互独立的,且只能访问自己的沙盒,以保证非法访问别的沙盒带来的安全隐患.

二、RabbitMQ部署

rabbitmq部署有三种模式:单机模式,普通集群模式,镜像集群模式

RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现

1、安装erlang环境

由于rabbitmq是基于erlang语言开发的,所以必须先安装erlang。

wget http://erlang.org/download/otp_src_20.0.tar.gz
tar -zxvf otp_src_20.0.tar.gz
cd otp_src_20.0
./configure --prefix=/usr/local/erlang --without-javac
make
make install

加入环境变量

vim /etc/profile
在最后添加:
export ERLANG_HOME=/usr/local/erlang
export PATH=$PATH:/usr/local/erlang/bin

运行以下命令,使环境变量立即生效

source /etc/profile

验证erl是否成功安装

erl

2、单机模式安装

安装 rabbitmq

可以去官网手动下载(Downloading and Installing RabbitMQ — RabbitMQ)也可以通过wget命令下载

cd /opt
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.11.6/rabbitmq-server-3.11.6.tar.xz
xz -d rabbitmq-server-generic-unix-3.11.6.tar.xz
tar -xvf rabbitmq-server-generic-unix-3.6.10.tar
cp -r /opt/rabbitmq_server-3.6.10 /usr/local/rabbitmq
注:该方式安装的RabbitMQ是没有配置文件的,如需要配置文件,需手动进行配置,文件置于自己Rabbitmq安装路径下的 /etc/rabbitmq/rabbitmq.conf 即可,再管理页面或者日志中都可以查看到路径位置
/usr/local/rabbitmq/sbin/rabbitmq-server -detached
echo "/usr/local/rabbitmq/sbin/rabbitmq-server -detached" >> /etc/rc.local      #添加开机自启动。

开启 web 管理界面

/usr/local/rabbitmq/sbin/rabbitmq-plugins enable rabbitmq_management

RabbitMQ默认的账号用户名和密码都是guest

rabbitmqctl delete_user guest

创建RabbitMQ管理员用户

#创建一个新用户
rabbitmqctl add_user <用户名> <密码>
#将创建的新用户设置为管理员
rabbitmqctl set_user_tags <用户名> administrator
#赋予新创建的用户所有权限
rabbitmqctl set_permissions -p / <用户名> ".*" ".*" ".*"

在本地主机中,使用浏览器访问Linux实例的公网IP:15672

显示如下页面,说明RabbitMQ安装成功。

3、普通集群模式

在多台机器上启动多个rabbitmq实例,每个机器启动一个。

但是你创建的queue,只会放在一个rabbtimq实例上,但是每个实例都同步queue的元数据(存放含queue数据的真正实例位置)。消费的时候,实际上如果连接到了另外一个实例,那么那个实例会从queue所在实例上拉取数据过来。

三、配置文件详解

所有​ ​受支持的RabbitMQ版本​​​ 的主配置文件都使用​ ​类似ini的sysctl配置文件格式​​。该文件通常命名为Rabbitmq.conf。

rabbitmq.conf

新样式格式(sysctl或类似ini的格式)

​主配置文件​​。应该用于大多数设置。对于人类来说,阅读和机器(部署工具)的生成更容易。并非所有设置都可以这种格式表示。

advanced.config

经典(Erlang术语)

不能以新样式配置格式表示的有限数量的设置,例如​ ​LDAP查询​​。仅在必要时使用。

rabbitmq-env.conf

环境变量对

用于在一处设置与RabbitMQ相关的​ ​环境变量​​。

 

 四、开发实例

 1、引入依赖,pom文件:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

2、基本配置文件:

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*rabbitMq基本配置*/
@Configuration
public class RabbitMqConfig {public final static String productExchange = "productExchange ";private String productQueue = "productQueue";public final static String ERROR_EXCHANGE = "le.error.exchange";private String topicExchangeName = "";@Beanpublic FanoutExchange productExchange() {return new FanoutExchange(productExchange);}public TopicExchange topicExchange() {return new TopicExchange(topicExchangeName);}@Beanpublic DirectExchange errorExchang() {return new DirectExchange(ERROR_EXCHANGE, true, false);}@Beanpublic Queue productQueue() {return new Queue(productQueue, true);}@Beanpublic Binding productBinding(Queue productQueue, FanoutExchange productExchange) {return BindingBuilder.bind(productQueue).to(productExchange);}
}

3、生产者:

@Component
public class ProductProducer {Logger logger = LoggerFactory.getLogger(ProductProducer.class);@AutowiredRabbitTemplate rabbitTemplate;@AutowiredGson gson;public void push(ProfitEntity profitEntity) {String json = gson.toJson("");logger.info("###消息发送者: json=" + json); rabbitTemplate.convertAndSend(RabbitmqConfig.Product_EXCHANGE, null, json);}}

4、消费者:

@Component
public class TransProductConsumer {Logger logger = LoggerFactory.getLogger(TransproductConsumer.class);@AutowiredRabbitTemplate rabbitTemplate;@AutowiredErrorProducer errorProducer;@AutowiredProductService productService;@RabbitHandler@RabbitListener(queues = RabbitmqConfig.productQueue )public void comsume(String json) {try {logger.info("##start##消费者:TransProductConsumer ,接收到消息:json=" + json);} catch (Exception e) {logger.error("计算消息队列出错 zf.Product.caculate.queue ", e);errorProducer.push(RabbitmqConfig.ERROR_PROFIT_CACULATE_QUEUE, json);}}
}

5、错误消息处理生产者:

@Component
public class ErrorProducer {Logger logger = LoggerFactory.getLogger(TransDetailProducer.class);@AutowiredRabbitTemplate rabbitTemplate;@AutowiredGson gson;public void push(String queueName, String errorJson) {logger.info("###异常消息发送者: queueName=" + queueName + " errorJson=" + errorJson);rabbitTemplate.convertAndSend(RabbitmqConfig.ERROR_EXCHANGE, queueName, errorJson);}public void push(String queueName, Object obj) {String errorJson = gson.toJson(obj);logger.info("###异常消息发送者: queueName=" + queueName + " errorJson=" + errorJson);rabbitTemplate.convertAndSend(RabbitmqConfig.ERROR_EXCHANGE, queueName, errorJson);}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/185938.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用POST请求在Linux之间传输文件(Python在Linux间传输文件)

背景 实际需求&#xff1a; 已通过iperf和dd命令测试过两台不同区域之间的Linux服务器带宽&#xff0c;均为1000Mb网络。但发送post请求传输文件至对象存储时&#xff0c;总是卡在14Mb/s。除了排查区域之间的防火墙&#xff0c;也应该尝试检查Linux&#xff08;KylinV10&…

linux的美化工具 oh-my-zsh的安装与使用 神器工具

目录 1 安装zsh的环境2 安装 Oh My Zsh3 主题设置重新启动终端:关闭连接 在重新链接一下附加 -插件管理案例讲解看效果 Oh My Zsh 是一款基于 Zsh 的开源命令行工具&#xff0c;它提供了丰富的主题和插件&#xff0c;可以帮助用户更加高效地使用终端。本文将详细介绍 Oh My Zsh…

Java 设计模式——访问者模式

目录 1.概述2.结构3.案例实现3.1.抽象访问者类3.2.抽象元素类3.3.具体元素类3.4.具体访问者类3.5.对象结构类3.6.测试 4.优缺点5.使用场景6.扩展6.1.分派6.2.动态分配6.3.静态分配6.4.双分派 1.概述 访问者模式 (Visitor Pattern) 是一种行为型设计模式&#xff0c;它用于将数…

springboot本地启动多个模块报错:Address already in use: JVM_Bind

目录 背景解决方法 背景 环境&#xff1a; jdk1.8 idea 2019.2.4idea本地启动多个模块联调时&#xff0c;提示报错&#xff1a; 错误: 代理抛出异常错误: java.rmi.server.ExportException: Port already in use: 9090; nested exception is: java.net.BindException: Addre…

vue+java实现语音转文字思路

思路&#xff1a; 前端录音生成wav文件后端去解析 技术&#xff1a; 后端&#xff1a; Vosk是一个离线开源语音识别工具。它可以识别16种语言&#xff0c;包括中文。 API接口&#xff0c;让您可以只用几行代码&#xff0c;即可迅速免费调用、体验功能。 目前支持 WAV声音文件…

基于8086家具门安全控制系统设计

**单片机设计介绍&#xff0c;基于8086家具门安全控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 # 8086家具门安全控制系统设计介绍 8086家具门安全控制系统是一种用于保护家具和保证室内安全的系统。该系统基于808…

小程序游戏对接广告收益微信小游戏抖音游戏软件

小程序游戏对接广告是一种常见的游戏开发模式&#xff0c;开发者可以通过在游戏中嵌入广告来获取收益。以下是一些与小程序游戏对接广告收益相关的关键信息&#xff1a; 小程序游戏广告平台选择&#xff1a; 选择适合你的小程序游戏的广告平台非常重要。不同的平台提供不同类型…

ubuntu18-recvfrom接收不到广播报文异常分析

目录 前言 一、UDP广播接收程序 二、异常原因分析 总结 前言 在ubuntu18.04系统中&#xff0c;编写udp接收程序发现接收不到广播报文&#xff0c;使用抓包工具tcpdump可以抓取到广播报文&#xff0c;在此对该现象分析解析如下文所示。 一、UDP广播接收程序 UDP广播接收程序如…

【解决方案】vue 项目 npm run dev 时报错:‘cross-env‘ 不是内部或外部命令,也不是可运行的程序

报错 cross-env 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! estate1.0.0 dev: cross-env webpack-dev-server --inline --progress --config build/webpack.dev.conf.js npm ERR! Exit status 1 np…

Go语言用Colly库编写的图像爬虫程序

下面是一个使用Colly库编写的Go语言图像爬虫程序&#xff0c;该程序会爬取news.qq上的图片&#xff0c;并使用proxy_host:duoip和proxy_port:8000的爬虫IP服务器进行抓取。 package mainimport ("fmt""net/http""github.com/crawlab-collective/go-co…

21 移动网络的前世今生

1、移动网络的发展历程 发展过程就是&#xff1a;2G,3G,4G,5G的过程&#xff0c;用2G看txt&#xff0c;用3G看jpg&#xff0c;用4G看avi。 2、2G网络 手机本来是用来打电话的&#xff0c;不是用来上网的&#xff0c;所以原来在2G时代&#xff0c;上网使用的不是IP网络&#…

论文阅读——What Can Human Sketches Do for Object Detection?(cvpr2023)

论文&#xff1a;https://openaccess.thecvf.com/content/CVPR2023/papers/Chowdhury_What_Can_Human_Sketches_Do_for_Object_Detection_CVPR_2023_paper.pdf 代码&#xff1a;What Can Human Sketches Do for Object Detection? (pinakinathc.me) 一、 Baseline SBIR Fram…

【Qt之QAssociativeIterable】使用

介绍 QAssociativeIterable类是QVariant中一个关联式容器的可迭代接口。这个类允许多种访问在QVariant中保存的关联式容器元素的方法。如果一个QVariant可以转换为QVariantHash或QVariantMap&#xff0c;那么QAssociativeIterable的实例可以从中提取出来。 QHash<int, QSt…

UPLOAD-LABS1

less1 (js验证) 我们上传PHP的发现不可以&#xff0c;只能是jpg&#xff0c;png&#xff0c;gif&#xff08;白名单限制了&#xff09; 我们可以直接去修改限制 在查看器中看到使用了onsubmit这个函数&#xff0c;触发了鼠标的单击事件&#xff0c;在表单提交后马上调用了re…

css排版—— 一篇优雅的文章(中英文) vs 聊天框的特别排版

文章 <div class"contentBox"><p>这是一篇范文——仅供测试使用</p><p>With the coming of national day, I have a one week holiday. I reallyexpect to it, because it want to have a short trip during these days. Iwill travel to Ji…

osgEarth之添加shp

目录 效果 代码 代码分析 加载模式 效果 代码 #include "stdafx.h" #include <osg/Notify> #include <osgGA/StateSetManipulator> #include <osgViewer/Viewer> #include <osgViewer/ViewerEventHandlers>#include <osgEarth/MapNo…

蓝桥杯练习

即约分数 题目 思路 遍历所有的x&#xff0c;y&#xff0c;判断x/y是不是即越约分数。 代码 #include <iostream> using namespace std; int gcd(int x,int y) {int r;while(y!0){rx%y;xy;yr;}return x; } int main() {// 请在此输入您的代码int sum4039;//1/y和x/1都…

火爆全网!用 Pyecharts 就能做出来“迁徙图“和“轮播图“

1.pyecharts知识点回顾 1&#xff09;知识回顾 前面我们已经讲述了&#xff0c;如何使用pyecharts进行图形的绘制&#xff0c;一共涉及到如下四步。我们今天就是按照下面这几步来进行迁徙图和轮播图的绘制。 ① 选择图表类型&#xff1b; ② 声明图形类并添加数据&#xff1…

学术论文的实证数据来源

一、引言 在当今的学术研究中&#xff0c;数据是至关重要的。无论是自然科学、社会科学还是人文科学&#xff0c;都需要借助数据来支撑和证明其研究假设和理论。然而&#xff0c;数据的来源却是多种多样的&#xff0c;而且不同的学科领域也有其特定的数据来源。本文旨在探讨论文…

开放智慧,助力学习——电大搜题,打开学无止境的新篇章

随着信息技术的迅猛发展&#xff0c;学习已经不再受时间和空间的限制。电大搜题微信公众号为广播电视大学和河南开放大学的学子们带来了便利和智慧&#xff0c;让学习变得更加高效和愉快。 电大搜题微信公众号作为一款专为电大学生而设计的学习助手&#xff0c;是学习中不可或…