RabbitMQ 简介和使用

RabbitMQ

  • 一、RabbitMQ概述
    • 1、什么是消息队列
    • 2、为什么要使用消息队列
    • 3、RabbitMQ特点
  • 二、RabbitMQ安装
    • 1、安装前准备
        • 1.1 依赖包安装
        • 1.2 安装Erlang
    • 2、安装
    • 3、常用命令
        • 3.1. 启动和关闭
        • 3.2. 插件管理
        • 3.3. 用户管理
        • 3.4. 权限管理
        • 3.5. vhost管理
  • 三、RabbitMQ消息发送和接收
    • 1、 RabbitMQ的消息发送和接收机制
    • 2、Exchange类型
    • 3、RabbitMQ发送消息
  • 四、SpringBoot集成RabbitMQ
  • 五、RabbitMQ集群

一、RabbitMQ概述

1、什么是消息队列

消息(Message) 是指在应用间传递的数据。消息可以非常简单,比如只包含文本字符串,也可以很复杂,可能包含嵌入对象。

消息队列(Message Queue) 是一种应用间的通信方式,消息发送后可以立即返回,由消息系统来确保消息的可靠传递。消息发布者只管把消息发布到 MQ 中而不用管谁来取,消息使用者只管从 MQ 中取消息而不管是谁发布的。这样发布者和使用者都不用知道对方的存在。

2、为什么要使用消息队列

从上面的描述中可以看出消息队列是一种应用间的异步协调机制,那什么时候需要使用MQ呢?

以常见的订单系统为例,用户点击【下单】按钮之后的业务逻辑可能包括:扣减库存、生成响应单据、发红包、发短信通知。在业务发展初期这些逻辑可能放在一起同步执行,随着业务的发展订单量增长,需要提升系统服务的性能,这是可以将一些不需要立即生效的操作拆分出来异步执行,比如发送红包、发短信通知等。这种场景下就可以用MQ,在下单的主流程(比如扣减库存、生成响应单据)完成之后发送一条消息到MQ让主流程快速完成,而由另外的单独线程拉去MQ的消息(或由MQ推送消息),当发现MQ中有发红包或发短信之类的消息时,执行响应的业务逻辑。
在这里插入图片描述
以上是用于业务结偶的情况,其他常见场景包括最终一致性广播错峰流控等等。

强一致性:比如上面四个操作要么全部执行成功,要么全部不执行。
最终一致性:比如上面四个操作,主操作先执行,最后另外两个操作最终也执行完即可,不必同时完成。
广播:比如消息推送。
错峰流控:比如流量太大的时候,超过一定量的时候,再来访问就排队,防止服务器被整垮。

3、RabbitMQ特点

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

AMQP:Advanced Message Queue,高级消息队列协议。应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制。

RabbitMQ 最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。具体特点包括:

  1. 可靠性(Reliability)
    RabbitMQ 使用一些机制来保证可靠性,如持久化、传输确认、发布确认。
  2. 灵活的路由(Flexible Routing)
    在消息进入队列之前,通过 Exchange 来路由消息的。对于典型的路由功能,RabbitMQ 已经提供了一些内置的 Exchange 来实现。针对更复杂的路由功能,可以将多个 Exchange 绑定在一起,也通过插件机制实现自己的 Exchange 。
  3. 消息集群(Clustering)
    多个 RabbitMQ 服务器可以组成一个集群,形成一个逻辑 Broker 。
  4. 高可用(Highly Available Queues)
    队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列仍然可用。
  5. 多种协议(Multi-protocol)
    RabbitMQ 支持多种消息队列协议,比如 STOMP、MQTT 等等。
  6. 多语言客户端(Many Clients)
    RabbitMQ 几乎支持所有常用语言,比如 Java、.NET、Ruby 等等。
  7. 管理界面(Management UI)
    RabbitMQ 提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker 的许多方面。
  8. 跟踪机制(Tracing)
    如果消息异常,RabbitMQ 提供了消息跟踪机制,使用者可以找出发生了什么。

kafka效率高但是不安全,RabbitMQ效率没他高但是安全,使用的企业也多。

二、RabbitMQ安装

一般来说安装 RabbitMQ 之前要安装 Erlang ,可以去Erlang官网下载。接着去RabbitMQ官网下载安装包,之后解压缩即可。

Erlang官方下载地址:https://www.erlang.org/downloads

RabbitMQ官方下载地址:https://www.rabbitmq.com/download.html

1、安装前准备

1.1 依赖包安装

安装RabbitMQ之前必须要先安装所需要的依赖包可以使用下面的一次性安装命令

yum install gcc glibc-devel make ncurses-devel openssl-devel xmlto

1.2 安装Erlang

  1. 将Erlang源代码包otp_src_19.3.tar.gz上传到Linux的/home目录下
  2. 解压erlang 源码包
tar -zxvf otp_src_19.3.tar.gz
  1. 手动创建erlang 的安装目录
mkdir /usr/local/erlang
  1. 进入erlang的解压目录
cd otp_src_19.3
  1. 配置erlang的安装信息
./configure --prefix=/usr/local/erlang --without-javac
  1. 编译并安装
make && make install
  1. 配置环境变量
vim /etc/profile
  1. 将这些配置填写到profile文件的最后
ERL_HOME=/usr/local/erlang
PATH=$ERL_HOME/bin:$PATH
export ERL_HOME PATH
  1. 启动环境变量配置文件
source /etc/profile
  1. 查看
erl -version

2、安装

1、 将RabbitMQ安装包 rabbitmq-server-3.7.2-1.el7.noarch.rpm 上传到 /home 目录

2、安装RabbitMQ(rpm文件相当于windows中的exe文件)

rpm -ivh --nodeps rabbitmq-server-3.7.2-1.el7.noarch.rpm

3、常用命令

3.1. 启动和关闭

  1. 启动RabbitMQ
rabbitmq-server start

注意:这里可能会出现错误,错误原因是/var/lib/rabbitmq/.erlang.cookie文件权限不够。

解决方案对这个文件授权:

chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookiechmod 400 /var/lib/rabbitmq/.erlang.cookie
  1. 停止服务
rabbitmqctl stop
  1. 查看启动后的进程
ps -ef | grep rabbitmq

3.2. 插件管理

  1. 添加插件
rabbitmq-plugins enable {插件名}
  1. 删除插件
rabbitmq-plugins disable {插件名} 
注意:RabbitMQ启动以后可以使用浏览器进入管控台但是默认情况RabbitMQ不允许直接使用浏览器浏览器进行访问因此必须添加插件
rabbitmq-plugins enable rabbitmq_management
  1. 使用浏览器访问管控台 http://RabbitMQ服务器IP:15672
http://192.168.71.128:15672

在这里插入图片描述
在这里插入图片描述

3.3. 用户管理

RabbitMQ安装成功后使用默认用户名guest登录:

账号:guest
密码:guest

注意:这里guest只允许本机登录访问

需要创建用户并授权远程访问命令如下:

  1. 添加用户:rabbitmqctl add_user {username} {password}

  2. 删除用户:rabbitmqctl delete_user {username}

  3. 修改密码:rabbitmqctl change_password {username} {newpassword}

  4. 设置用户角色:rabbitmqctl set_user_tags {username} {tag}
    tag用户角色取值为:management, monitoring, policymaker, administrator

各角色详解:

management:
用户可以通过AMQP做的任何事外加:
列出自己可以通过AMQP登入的virtual hosts
查看自己的virtual hosts中的queues, exchanges 和 bindings
查看和关闭自己的channels 和 connections
查看有关自己的virtual hosts的“全局”的统计信息,包含其他用户在这些virtual hosts中的活动。

policymaker :
management可以做的任何事外加:
查看、创建和删除自己的virtual hosts所属的policies和parameters

monitoring :
management可以做的任何事外加:
列出所有virtual hosts,包括他们不能登录的virtual hosts
查看其他用户的connections和channels
查看节点级别的数据如clustering和memory使用情况
查看真正的关于所有virtual hosts的全局的统计信息

administrator:
policymaker和monitoring可以做的任何事外加:
创建和删除virtual hosts
查看、创建和删除users
查看创建和删除permissions
关闭其他用户的connections

3.4. 权限管理

  1. 授权命令:rabbitmqctl set_permissions [-p vhostpath] {user} {conf} {write} {read}-p vhostpath
    用于指定一个资源的命名空间,例如 –p / 表示根路径命名空间

user:用于指定要为哪个用户授权填写用户名
conf:一个正则表达式match哪些配置资源能够被该用户配置。
write:一个正则表达式match哪些配置资源能够被该用户读。
read:一个正则表达式match哪些配置资源能够被该用户访问。
例如:rabbitmqctl set_permissions -p / root “.” “.” “.*”
用于设置root用户拥有对所有资源的 读写配置权限

  1. 查看用户权限 rabbitmqctl list_permissions [vhostpath]

例如查看根径经下的所有用户权限: rabbitmqctl list_permissions
查看指定命名空间下的所有用户权限: rabbitmqctl list_permissions /abc

  1. 查看指定用户下的权限rabbitmqctl list_user_permissions {username}

例如查看root用户下的权限 rabbitmqctl list_user_permissions root

  1. 清除用户权限rabbitmqctl clear_permissions {username}

例如:清除root用户的权限 rabbitmqctl clear_permissions root

3.5. vhost管理

vhost是RabbitMQ中的一个命名空间,可以限制消息的存放位置利用这个命名空间可以进行权限的控制有点类似Windows中的文件夹一样,在不同的文件夹中存放不同的文件。

  1. 添加vhost: rabbitmqctl add vhost {name}

例如 rabbitmqctl add vhost bjpowernode

  1. 删除vhost:rabbitmqctl delete vhost {name}

例如 rabbitmqctl delete vhost bjpowernode

三、RabbitMQ消息发送和接收

1、 RabbitMQ的消息发送和接收机制

MQ的基本抽象模型:
在这里插入图片描述
RabbitMQ的内部接收:
在这里插入图片描述
举例说明:

在这里插入图片描述在这里插入图片描述

2、Exchange类型

  1. direct
    消息中的路由键(routing key)如果和 Binding 中的 binding key 一致, 交换器就将消息发到对应的队列中。它是完全匹配单播的模式。
    在这里插入图片描述
  2. fanout
    每个发到 fanout 类型交换器的消息都会分到所有绑定的队列上去。fanout 类型是一种广播模式,转发消息是最快的
    在这里插入图片描述
    这种模式就和我们收看电视直播一样,需要提前在消费者中监听队列,否则如果消息先发送了,那么消费者可能永远接收不到,就错过了。这种模式的交换机适合适合使用在一些消息数据不是很重要的应用中,用户接收到和接收不到都无所谓。例如:手机app的消息推送。
  3. topic
    topic 交换器通过模式匹配分配消息的路由键属性,将路由键和某个模式进行匹配,此时队列需要绑定到一个模式上。它有两个通配符:符号“#”和符号“*”。#匹配0个或多个单词,*匹配不多不少一个单词。
    在这里插入图片描述
    他也会丢失消息,也应该先启动消费者监听队列。

3、RabbitMQ发送消息

创建maven工程

  1. 添加依赖:
<dependencies>
<dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.1.1</version>
</dependency>
</dependencies>
  1. 编写Send类
public class Send{public static void main(String[] args) throws IOException, TimeoutException {//创建链接工厂对象ConnectionFactory factory=new ConnectionFactory();//设置RabbitMQ连接相关信息factory.setHost("192.168.171.143");//设置RabbitMQ的主机IPfactory.setPort(5672);//设置RabbitMQ的端口号factory.setUsername("root");//设置访问用户名factory.setPassword("root");//设置访问密码Connection connection=null;//定义链接对象Channel channel=null;//定义通道对象connection=factory.newConnection();//获取链接channel=connection.createChannel();//获取通道//指定Exchange的类型//参数1为 交换机名称//参数2为 交换机类型取值为 direct、fanout、topic、headers//参数3为 是否为持久化消息 true表示持久化消息 false表示非持久化channel.exchangeDeclare("myExchange", "direct", true);//发送消息到RabbitMQ//参数1 我们自定义的交换机名称//参数2 自定义的RoutingKey值//参数3 设置消息的属性,可以通过消息属性设置消息是否是持久化的//参数4 具体要发送的消息信息String message ="Hello World!3";channel.basicPublish("myExchange","myRoutingKey",null,message.getBytes("UTF-8"));System.out.println("消息发送成功: "+message);channel.close();connection.close();}
}

四、SpringBoot集成RabbitMQ

五、RabbitMQ集群

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

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

相关文章

Transformer哪家强?Google爸爸辨优良!

文&#xff1a;Zilong2017年Attention is all you need横空出世&#xff0c;Transformer横扫机器翻译&#xff0c;隔年诞生的BERT建立在层层堆叠的Transformer之上&#xff0c;凭借这个平平无奇的Attention点乘模型一举刷新了各种沉积许久的榜单&#xff0c;一夜间仿佛不懂Tran…

CCKS 2019 | 百度 CTO 王海峰详解知识图谱与语义理解

本文转载自公众号&#xff1a;机器之心。&#xff1b; 8 月 24 日至 27 日在杭州召开的 2019 年全国知识图谱与语义计算大会&#xff08;CCKS 2019&#xff09;上&#xff0c;百度 CTO 王海峰发表了题为《知识图谱与语义理解》的演讲。CCKS 2019 由中国中文信息学会语言与知识计…

LeetCode 145. 二叉树的后序遍历(后序遍历总结)

文章目录1. 题目信息2. 解法2.1 递归2.2 循环&#xff0c;必须掌握a. 单栈b. 双栈解法3. 前中后序总结1. 题目信息 给定一个二叉树&#xff0c;返回它的 后序 遍历。 示例:输入: [1,null,2,3] 1\2/3 输出: [3,2,1]进阶: 递归算法很简单&#xff0c;你可以通过迭代算法完成吗…

云原生之容器安全实践

概述 云原生&#xff08;Cloud Native&#xff09;是一套技术体系和方法论&#xff0c;它由2个词组成&#xff0c;云&#xff08;Cloud&#xff09;和原生&#xff08;Native&#xff09;。云&#xff08;Cloud&#xff09;表示应用程序位于云中&#xff0c;而不是传统的数据中…

领域应用 | HiTA知识图谱 “药品-适应证”图谱数据发布!

本文转载自公众号&#xff1a;OMAHA联盟。2019年8月&#xff0c;OMAHA对HiTA知识图谱服务平台&#xff08;kg.omaha.org.cn&#xff09;进行了更新&#xff0c;同步发布了医学知识图谱表达模型&#xff08;schema&#xff09;。2019年9月17日&#xff0c;首次发布了由OMAHA研发…

主题模型综述:短文本、细粒度、加入先验知识、作者写作偏好、主题内涵随时间的变迁、融入词嵌入特性、语言模型加持

原文链接&#xff1a;https://www.zhihu.com/question/34801598/answer/765580727 主题模型当然有用咯&#xff0c;谁用谁知道&#xff01;这次我来展示下它的7个“变种”(短文本、细粒度、加入先验知识、作者写作偏好、主题内涵随时间的变迁、融入词嵌入特性、语言模型加持)&a…

完全解析:使用Faiss进行海量特征的相似度匹配

文 | Gemfield源 | 知乎Faiss为稠密向量提供高效相似度搜索和聚类&#xff0c;支持十亿级别向量的搜索&#xff0c;是目前最为成熟的近似近邻搜索库。本文从最基本的特征比对开始讲解&#xff0c;中间详细讲解Faiss的环境配置以及使用步骤&#xff0c;最后落脚到为什么我们需要…

LeetCode 173. 二叉搜索树迭代器(中序遍历)

文章目录1. 题目信息2. 二叉树中序遍历1. 题目信息 实现一个二叉搜索树迭代器。你将使用二叉搜索树的根节点初始化迭代器。 调用 next() 将返回二叉搜索树中的下一个最小的数。 示例&#xff1a; BSTIterator iterator new BSTIterator(root); iterator.next(); // 返…

论文浅尝 | 面向时序知识图谱推理的循环事件网络

论文笔记整理&#xff1a;谭亦鸣&#xff0c;东南大学博士生&#xff0c;研究方向为知识库问答。来源&#xff1a;arXiv (short version accepted at ICLR 2019Workshop on Representation Learning on Graphs and Manifolds)链接&#xff1a;https://arxiv.org/abs/1904.05530…

Android实现炫酷的星空变幻效果

二话不说&#xff0c;先上效果图&#xff1a; 这个图是什么意思呢&#xff0c;有没有看到一直在变颜色啊&#xff0c;有没有很像星云变幻呢&#xff0c;有没有很炫&#xff0c;快来看看怎么实现的吧&#xff01; 这是我们要被处理的原图&#xff0c;实现方式就是通过不断的改变…

美团配送数据治理实践

大数据时代的到来&#xff0c;让越来越多的企业看到了数据资产的价值。将数据视为企业的重要资产&#xff0c;已经成为业界的一种共识&#xff0c;企业也在快速探索应用场景和商业模式&#xff0c;并开始建设技术平台。 但这里要特别强调一下&#xff0c;如果在大数据“拼图”中…

这可能是你近 2 年发论文最好机会!

几年前如果熟练使用TensorFlow&#xff0c;同时掌握基本的AI算法就可以很容易找到一份高薪的工作&#xff0c;但现在不一样了&#xff0c;AI岗位的要求越来越高&#xff0c;对知识的深度也提出了更高的要求。如果现在一个面试官让你从零推导SVM的Dual、从零实现CRF、推导LDA、设…

LeetCode 671. 二叉树中第二小的节点

文章目录1. 题目信息2. 解题2.1 递归查找2.2 改循环1. 题目信息 给定一个非空特殊的二叉树&#xff0c;每个节点都是正数&#xff0c;并且每个节点的子节点数量只能为 2 或 0。如果一个节点有两个子节点的话&#xff0c;那么这个节点的值不大于它的子节点的值。 给出这样的一…

论文浅尝 | 多标签分类中的元学习

论文笔记整理&#xff1a;叶群&#xff0c;浙江大学计算机学院&#xff0c;知识图谱、NLP方向。会议&#xff1a;EMNLP 2019链接&#xff1a;https://arxiv.org/abs/1909.04176Abstract这篇论文首次在多标签分类问题中提出了 meta-learning 的方法&#xff0c;学习weight polic…

从源码角度分析Android系统的异常捕获机制是如何运行的

我们在开发的时候经常会遇到各种异常&#xff0c;当程序遇到异常&#xff0c;便会将异常信息抛到LogCat中&#xff0c;那这个过程是怎么实现的呢&#xff1f; 我们以一个例子开始&#xff1a; import android.app.Activity; import android.os.Bundle;public class MainActivit…

法律规则鬼畜图解||全面易懂的旅游投诉赔偿标准

法律规则鬼畜图解||全面易懂的旅游投诉赔偿标准https://zhuanlan.zhihu.com/p/82878902 执笔人&#xff1a;张宗保律师&#xff08;联系方式&#xff1a;知乎私信&#xff09;执业地域&#xff1a;深圳市执业方向&#xff1a;民商事诉讼一、赔偿标准的适用前提只有在旅游者和旅…

美团技术十年:让我们感动的那些人那些事

时光荏苒&#xff0c;美团十岁了&#xff0c;美团技术团队也走过了十个春秋。 2010年3月4日美团网上线的时候&#xff0c;整个公司总共十来人&#xff0c;在一套三居室的民房里起步。其中技术团队只有5个人&#xff0c;现在有4位还在美团。 今天&#xff0c;美团是中国市值第三…

LeetCode 113. 路径总和 II(回溯)

文章目录1. 题目信息2. 解题1. 题目信息 给定一个二叉树和一个目标和&#xff0c;找到所有从根节点到叶子节点路径总和等于给定目标和的路径。 说明: 叶子节点是指没有子节点的节点。 示例: 给定如下二叉树&#xff0c;以及目标和 sum 22&#xff0c;5/ \4 8/ / \11 1…

开放开源 | DeepKE:基于深度学习的开源中文关系抽取工具

本文转载自公众号&#xff1a;浙大 KG。作者&#xff1a;余海阳机构&#xff1a;浙江大学代码地址: https://github.com/zjunlp/deepkeOpenKG 发布地址: http://openkg.cn/tool/deepke一、系统简介关系抽取是知识图谱构建的基本子任务之一&#xff0c;它主要面向非结构化的文本…

微前端在美团外卖的实践

背景 微前端是一种利用微件拆分来达到工程拆分治理的方案&#xff0c;可以解决工程膨胀、开发维护困难等问题。随着前端业务场景越来越复杂&#xff0c;微前端这个概念最近被提起得越来越多&#xff0c;业界也有很多团队开始探索实践并在业务中进行了落地。可以看到&#xff0c…