RabbitMQ从初学到精通一

今天来学习一下RabbitMQ,从最起初的安装开始学习:

一、RabbitMQ 安装图
1 rabbitMQ下载
http://www.rabbitmq.com/download.html
下载文件rabbitmq-server-mac-standalone-3.7.4.tar.xz
注意,这里的文件是xz压缩文件,需要用xz -d rabbitmq-server-mac-standalone-3.7.4.tar.xz  解压,如果没有安装xzUtil,需要先安装xzutil
下载地址为:https://tukaani.org/xz/
tar文件解压缩:tar -xzvf rabbitmq-server-mac-standalone-3.7.4.tar
解压缩完之后,就可以直接启动了
2  启动
cd sbin/
先打开rabbitmq管理端:./rabbitmq-plugins enable rabbitmq_management
./rabbitmq-plugins enable rabbitmq_shovel rabbitmq_shovel_management
在启动:rabbitmq-server
启动起来了之后访问管理端界面:http://localhost:15672/
用户名:guest
密码:guest
二、工作原理
MQ全名Message Queue,是一种分布式应用程序的通讯方法,是消费-生产者模型的典型代表,producer不停地往消息队列中发送消息,而consumer在另一端接受或者订阅消息。RabbitMQ是MQ产品的典型代表,是一款基于AMQP协议可复用的企业消息系统。业务上可以实现消息提供者服务于消费者服务的解耦,实现高可用性的消息传输机制,下面简单介绍下Rabbit常用概念,基本框架以及通讯过程。
1 概念介绍:
连接(Connection):一个网络连接,比如TCP/IP套接字连接。
会话(Session):端点之间的命名对话。在一个会话上下文中,保证“恰好传递一次”。
信道(Channel):多路复用连接中的一条独立的双向数据流通道。为会话提供物理传输介质。
客户端(Client):AMQP连接或者会话的发起者。AMQP是非对称的,客户端生产和消费消息,服务器存储和路由这些消息。
服务器(Server):接受客户端连接,实现AMQP消息队列和路由功能的进程。也称为“消息代理”。
消息头(Header):描述消息数据属性的一种特殊段。
消息体(Body):包含应用程序数据的一种特殊段。消息体段对于服务器来说完全透明——服务器不能查看或者修改消息体。
消息内容(Content):包含在消息体段中的的消息数据。
交换器(Exchange):服务器中的实体,用来接收生产者发送的消息并将这些消息路由给服务器中的队列。
交换器类型(Exchange Type):基于不同路由语义的交换器类。
消息队列(Message Queue):一个命名实体,用来保存消息直到发送给消费者。
绑定器(Binding):消息队列和交换器之间的关联。
绑定器关键字(Binding Key):绑定的名称。一些交换器类型可能使用这个名称作为定义绑定器路由行为的模式。
路由关键字(Routing Key):一个消息头,交换器可以用这个消息头决定如何路由某条消息。
持久存储(Durable):一种服务器资源,当服务器重启时,保存的消息数据不会丢失。
临时存储(Transient):一种服务器资源,当服务器重启时,保存的消息数据会丢失。
持久化(Persistent):服务器将消息保存在可靠磁盘存储中,当服务器重启时,消息不会丢失。
非持久化(Non-Persistent):服务器将消息保存在内存中,当服务器重启时,消息可能丢失。
消费者(Consumer):一个从消息队列中请求消息的客户端应用程序。
生产者(Producer):一个向交换器发布消息的客户端应用程序。
虚拟主机(Virtual Host):一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。客户端应用程序在登录到服务器之后,可以选择一个虚拟主机。
2 系统架构

Rabbitmq系统最核心的组件是Exchange和Queue,下图是系统简单的示意图。Exchange和Queue是在rabbitmq server(又叫做broker)端,producer和consumer在应用端。

 

producer&Consumer

producer指的是消息生产者,consumer消息的消费者。

Queue

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

  1. 设置为持久化的队列,queue中的消息会在server本地硬盘存储一份,防止系统crash,数据丢失
  2. 设置为临时队列,queue中的数据在系统重启之后就会丢失
  3. 设置为自动删除的队列,当不存在用户连接到server,队列中的数据会被自动删除

Binding

所谓绑定就是将一个特定的 Exchange 和一个特定的 Queue 绑定起来。Exchange 和Queue的绑定可以是多对多的关系。

virtual host

在rabbitmq server上可以创建多个虚拟的message broker,又叫做virtual hosts (vhosts)。每一个vhost本质上是一个mini-rabbitmq server,分别管理各自的exchange,和bindings。vhost相当于物理的server,可以为不同app提供边界隔离,使得应用安全的运行在不同的vhost实例上,相互之间不会干扰。producer和consumer连接rabbit server需要指定一个vhost。

三、rabbitMq常用命令

net stop RabbitMQ && net start RabbitMQ:停止RabbitMQ后启动

rabbitmqctl list_queues:查看所有队列信息

rabbitmqctl stop_app:关闭应用(关闭当前启动的节点)

rabbitmqctl start_app:启动应用,和上述关闭命令配合使用,达到清空队列的目的

rabbitmqctl reset:从管理数据库中移除所有数据,例如配置过的用户和虚拟宿主, 删除所有持久化的消息(这个命令要在rabbitmqctl stop_app之后使用)

rabbitmqctl force_reset:作用和rabbitmqctl reset一样,区别是无条件重置节点,不管当前管理数据库状态以及集群的配置。如果数据库或者集群配置发生错误才使用这个最后的手段

rabbitmqctl status:节点状态

rabbitmqctl add_user username password:添加用户

rabbitmqctl list_users:列出所有用户

rabbitmqctl list_user_permissions username:列出用户权限

rabbitmqctl change_password username newpassword:修改密码

rabbitmqctl add_vhost vhostpath:创建虚拟主机

rabbitmqctl list_vhosts:列出所有虚拟主机s

rabbitmqctl set_permissions -p vhostpath username ".*" ".*" ".*":设置用户权限

rabbitmqctl list_permissions -p vhostpath:列出虚拟主机上的所有权限 

rabbitmqctl clear_permissions -p vhostpath username:清除用户权限

rabbitmqctl -p vhostpath purge_queue blue:清除队列里的消息

rabbitmqctl delete_user username:删除用户

rabbitmqctl delete_vhost vhostpath:删除虚拟主机

通信过程

假设P1和C1注册了相同的Broker,Exchange和Queue。P1发送的消息最终会被C1消费。基本的通信流程大概如下所示:

  1. P1生产消息,发送给服务器端的Exchange
  2. Exchange收到消息,根据ROUTINKEY,将消息转发给匹配的Queue1
  3. Queue1收到消息,将消息发送给订阅者C1
  4. C1收到消息,发送ACK给队列确认收到消息
  5. Queue1收到ACK,删除队列中缓存的此条消息

Consumer收到消息时需要显式的向rabbit broker发送basic.ack消息或者consumer订阅消息时设置auto_ack参数为true。在通信过程中,队列对ACK的处理有以下几种情况:

  1. 如果consumer接收了消息,发送ack,rabbitmq会删除队列中这个消息,发送另一条消息给consumer。
  2. 如果cosumer接受了消息, 但在发送ack之前断开连接,rabbitmq会认为这条消息没有被deliver,在consumer在次连接的时候,这条消息会被redeliver。
  3. 如果consumer接受了消息,但是程序中有bug,忘记了ack,rabbitmq不会重复发送消息。
  4. rabbitmq2.0.0和之后的版本支持consumer reject某条(类)消息,可以通过设置requeue参数中的reject为true达到目地,那么rabbitmq将会把消息发送给下一个注册的consumer。

 

四、遇到的问题

1  执行 rabbitmqctl list_queues  报错,

Error: unable to perform an operation on node 'rabbit@markfengdeMacBook-Pro'. Please see diagnostics information and suggestions below.

 

 

转载于:https://www.cnblogs.com/xiaozhenfeng/p/rabbitmq.html

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

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

相关文章

关于自动驾驶, Mobileye 的 14 个最新观点

来源:新智驾作者 :苏珊珊为了在2025年实现消费级别的自动驾驶,Mobileye都做了什么?Mobileye近日在CES 2021展会上进一步分享了其在ADAS及全自动驾驶领域的战略规划,并详细介绍了Mobileye为实现消费级别的全自动驾驶和“…

Leetcode--738. 单调递增的数字

给定一个非负整数 N&#xff0c;找出小于或等于 N 的最大的整数&#xff0c;同时这个整数需要满足其各个位数上的数字是单调递增。 &#xff08;当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。&#xff09; 示例 1: 输入: …

linux ps进程管理命令,Linux 进程管理命令之ps

这个命令会显示某一时刻系统的进程状态。ps是通过/proc接口&#xff0c;让管理员查看内核进程状态信息。为了响应一切皆文件&#xff0c;进程参数模拟成文件系统类型(文件)&#xff0c;参数路径模拟成目录/proc/# 每个进程都有一个进程ID号这个目录里存放的各种进程的状态信息启…

你必须搞清楚的String,StringBuilder,StringBuffer

String,StringBuilder 以及 StringBuffer 这三个类的关系与区别一直是 Java 的经典问题&#xff0c;这次就来讲一下关于这三个类的一些知识 一. 简单对比 String &#xff1a; 字符常量StringBuilder &#xff1a; 字符变量StringBuffer &#xff1a; 字符变量String 属于常量类…

2020年中国智慧城市发展值得关注的技术

文章来源&#xff1a;Gartner图片来源&#xff1a;网络每年Gartner发布的技术成熟度曲线&#xff08;The Hype Cycle&#xff09;报告都备受市场瞩目&#xff0c;也成为政府及企业做出重大投资决策的风向标。其原因在于&#xff0c;它不仅能够让CIO了解到年度最备受瞩目和极具商…

序列化,反序列化

今天看ArrayList的源代码&#xff0c;发现了里面的一个关键字transient 然后查了一下&#xff0c;发现这个关键字是用来防止序列化的 那什么是序列化呢&#xff1f;我又懵逼了 为什么需要序列化&#xff1f; 在当今的网络社会&#xff0c;我们需要在网络上传输各种类型的数…

腾讯研究院发布《2021数字科技前沿应用趋势》

来源 &#xff1a;腾讯研究院编辑&#xff1a; 陈近梅2021年1月9日&#xff0c;在腾讯研究院举办的“腾讯科技向善暨数字未来大会2021”上&#xff0c;《变量&#xff1a;2021数字科技前沿应用趋势》报告正式发布。该报告由腾讯研究院发起&#xff0c;先后访谈业界权威专家&…

linux导入pgsql日志目录,Centos下PostgreSQL安装及修改数据目录

记录下在Centos7.6 安装PostgreSQL数据库&#xff0c;版本10.12的过程&#xff0c;第一次装&#xff0c;遇到的坑太多了&#xff0c;网上教程坑也多&#xff0c;有的版本不一样方法不一样。花了半天时间…背景&#xff1a;内网服务器&#xff0c;搭了个sonarqube代码审计系统&a…

ArrayList的容量

ArrayList当容量放不下元素时&#xff0c;容量会自动扩大 那么如果把元素移除&#xff0c;容量会自动减小吗&#xff1f; package zhousai; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; public class test { public static void …

H3 BPM之流程包(流程Demo)导入导出

流程包是什么&#xff1f; 流程包指的是工作流从表单设计到流程设计产生的数据包&#xff0c;所有的表单逻辑和流程模型逻辑数据都包含在里面。由于各种厂商工作流软件运行机制不一样&#xff0c;流程包不支持在不同产品之间导入导出&#xff0c;只支持在同一款工作流软件里面导…

11大改革举措!国家自然科学基金2021年项目指南发布

来源&#xff1a;国家自然科学基金委员会网站编辑&#xff1a;宗华排版&#xff1a;李言1月15日&#xff0c;国家自然科学基金委员会网站更新了2021年度项目指南。点击链接进入&#xff1a;2021年项目指南未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体系&…

服务器win和linux系统安装教程,Win+linux双系统安装

导读如果你要安装linux系统&#xff0c;但是又不想换掉Win7的操作习惯&#xff0c;建议安装WinLinux双系统&#xff0c;随你个人喜好。下面介绍的是用U盘安装的方法。笔者使用的是华硕FX50J装的双系统&#xff0c;之前使用过Dell的游闸安装过&#xff0c;但是没有碰到那么多问题…

Servlet API

Servlet API:由两个软件包组成&#xff1a;对应于HTTP协议的软件包&#xff0c;对应于除HTTP协议以外的软件包 即Servlet API 可以适用于任何通信协议 我们学习的Servlet&#xff0c;是位于javax.servlet.http包中的类和接口&#xff0c;是基础HTTP协议 Servlet继承关系&…

hibernate框架学习之使用SQLQuery查询数据

SQLQuery对象的获取  Hibernate支持使用原生SQL语句进行查询&#xff0c;通过session对象获得SQLQuery对象进行&#xff0c;需要传入SQL语句  SQLQuery createSQLQuery(String sqlStr)  SQLQuery query session.createSQLQuery(“select * from tbl_user");sqlStr是…

Leetcode--135. 发糖果

老师想给孩子们分发糖果&#xff0c;有 N 个孩子站成了一条直线&#xff0c;老师会根据每个孩子的表现&#xff0c;预先给他们评分。 你需要按照以下要求&#xff0c;帮助老师给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。 相邻的孩子中&#xff0c;评分高的…

Linux下载cfg命令,Linux安装详解-配置ks.cfg实现自动安装过程

之前发过一篇关于通过PXE实现Linux批量无人值守自动安装的文章(可以参考http://www.linuxidc.com/Linux/2011-08/39949.htm)&#xff0c;不过写的只是具体的配置和操作&#xff0c;对于原理部分没有说明&#xff0c;最近通过一段时间的学习&#xff0c;把linux的启动安装过程深…

人类如何接近“宇宙无限”?微积分的力量无处不在

来源&#xff1a;遇见数学距离2021年高考还有不到两百天&#xff0c;当无数高中生还在为千军万马过独木桥儿紧锣密鼓准备之时&#xff0c;有部分初中生却已经一只脚踏入了清华大学的校门。2020年的最后一天&#xff0c;清华大学发布官方通知&#xff0c;将启动“丘成桐数学科学…

linux如何运行synaptic,Linux_Ubuntu 7.04 Synaptic软件包管理器功能,Ubuntu的新立得软件包管理器(Syn - phpStudy...

Ubuntu 7.04 Synaptic软件包管理器功能Ubuntu的新立得软件包管理器(Synaptic Package Manager)是APT(Advanced Package Tool)的图形界面&#xff0c;非常直观易用。但有时候是用文字模式远程登录到Ubuntu&#xff0c;或者安装的是Server版的Ubuntu&#xff0c;再或者有什么其它…

三层架构

1.三层架构 与MVC设计模式的目标一致&#xff0c;都是为了 解耦合&#xff0c;提高代码复用 区别&#xff1a;二者对项目理解的角度不同 2.三层组成&#xff1a; 表示层(USL,User Show Layer;视图层) 业务逻辑层(BLL,Business Logic Layer;Service层) 数据访问层(DAL,Dat…

这10个著名的思想实验,竟然是物理学家完成的

来源 &#xff1a; 知更社区在物理学中&#xff0c;有一类特殊的实验&#xff1a;它们不需要购置昂贵的仪器&#xff0c;不需要大量的人力物力&#xff0c;需要的只是有逻辑的大脑&#xff1b;而这种实验却可以挑战前人的结论&#xff0c;建立新的理论&#xff0c;甚至引发人们…