RabbitMQ
下载与介绍
RabbitMQ是一个使用Erlang语言开发 开源的消息中间件项目(Message Broker),
采用Mozilla Public License(MPL)开源许可证。这意味着任何人都可以自由获取、使用、修改和分发RabbitMQ的源代码。
实现了高级消息队列协议(AMQP)并提供可靠的、异步的消息传递机制。
可以让你在不同的应用之间传递数据,用来实现分布式系统中的异步通信。
有很多优点,比如可靠性、灵活性、集群性、多协议支持等。
RabbitMQ由Pivotal Software公司进行开发和维护。
开发者可以在RabbitMQ的官方网站上找到相关的文档、示例代码、技术支持和社区讨论等资源,以帮助他们学习和使用RabbitMQ。
同时,由于是开源项目,任何人都可以参与到RabbitMQ的开发和贡献中。
RabbitMQ的主要特点和功能包括:
-
消息传递:RabbitMQ使用消息队列和发布/订阅模式来支持消息传递。它允许应用程序通过发送和接收消息来进行异步通信,并且可以确保消息的可靠性、顺序性和持久化。
-
多语言支持:RabbitMQ提供了多个编程语言的客户端API,如Java、Python、.NET、Ruby等,使得开发者可以使用自己熟悉的语言与RabbitMQ进行交互。这使得RabbitMQ具有广泛的可扩展性和互操作性。
-
消息确认和回退:RabbitMQ支持消息的确认机制,即在消息被消费之后,消费者可以向RabbitMQ发送确认消息。如果消息处理失败,消费者可以将消息退回到队列中,或者将其发送到死信队列。
-
路由和交换机:RabbitMQ通过路由和交换机的机制来决定消息的发送和接收方式。它支持不同类型的交换机,如直接交换机、主题交换机和扇出交换机,以满足不同的消息路由需求。
-
高可用性和可伸缩性:RabbitMQ支持集群部署和镜像队列,在多台服务器之间实现消息的复制和负载均衡。这使得RabbitMQ具有高可用性和可伸缩性,可以处理高并发和大规模的消息流量。
-
插件和扩展性:RabbitMQ提供了丰富的插件和扩展机制,可以实现各种定制化的功能和行为。开发者可以根据具体需求安装和配置插件,以扩展RabbitMQ的功能,如用户认证、消息转换等。
要使用RabbitMQ,你需要安装Erlang语言和RabbitMQ服务端,
然后在你的客户端程序中引入RabbitMQ的客户端库,
比如Java的spring-boot-starter-amqp。
你还需要了解一些RabbitMQ的基本概念,比如交换机、队列、绑定、路由键等
https://www.erlang.org/downloads
https://www.rabbitmq.com/install-windows.html
RabbitMQ中有一个重要的概念:
worker,也就是消费者,它是从队列中获取并处理消息的程序。
权限了解
RabbitMQ的用户角色分类:
none、management、policymaker、monitoring、administrator
RabbitMQ各类角色描述:
none
不能访问 management plugin
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
RabbitMQ用户的主题权限是指用户在发布或消费主题交换器上的消息时,需要满足的路由键的匹配规则 主题权限是在虚拟主机级别设置的,可以使用rabbitmqctl命令或HTTP API来配置
例如,下面的命令给用户tester在虚拟主机test_vhost上设置了主题权限,
只允许他使用以tester-开头的路由键来发布或消费amq.topic交换器上的消息]
dart
sudo rabbitmqctl set_topic_permissions -p /test_vhost tester amq.topic "^tester-.*" "^tester-.*"
消息状态
dart
- Ready 指的是队列中等待被消费的消息的数量,也就是说,这些消息已经被发布到队列中,但还没有被分配给消费者。
- Unacked 指的是队列中已经被分配给消费者,但还没有被确认的消息的数量,也就是说,这些消息已经被消费者接收,但还没有被消费者处理完毕或通知队列。
- Total 指的是队列中所有消息的数量,也就是 Ready 和 Unacked 的和,也就是说,这些消息包括了等待被消费和正在被消费的两种状态。
rabbitmqctl命令与操作配置
dart
使用rabbitmqctl命令行工具,它可以查询和管理RabbitMQ服务器的状态和配置。
ps:在 Windows 上,rabbitmqctl变为rabbitmqctl.bat并且 shell 转义会有所不同
rabbitmqctl status 来查看 RabbitMQ 的运行状态
使用 REST API 来调用 RabbitMQ 的管理接口
例如,你可以输入 curl -i -u guest:guest http://localhost:15672/api/overview
来查看 RabbitMQ 的概括信息
停止RabbitMQ应用
rabbitmqctl stop_app
rabbitmqctl reset
来重置RabbitMQ服务器
这样会清除所有的配置和队列,包括worker
rabbitmqctl start_app重新启动RabbitMQ应用。
注意:这种方法相当于重置RabbitMQ,请谨慎操作,可能会导致数据丢失。
添加用户
rabbitmqctl add_user 用户名 密码
列出用户
rabbitmqctl list_users
rabbitmqctl start_app
ps:一般只有一个guest用户
检查你的用户或密码是否正确,你可以使用
rabbitmqctl authenticate_user
来验证你的凭证
检查你的用户是否有足够的权限来连接rabbitmq,
可以使用rabbitmqctl list_permissions --vhost Godhost
来查看你的用户的权限
配置用户角色
rabbitmqctl set_user_tags 用户名 角色
(总共五种角色)
虚拟主机
rabbitmqctl add_vhost {vhost}
rabbitmqctl list_vhosts
rabbitmqctl delete_vhost /
用户标签
用户权限
配置权限
rabbitmqctl set_permissions -p / 用户名 ".*" ".*" ".*"
您的用户没有足够的权限访问交换机或队列。您可以尝试使用rabbitmqctl命令清除和设置权限,例如:
rabbitmqctl clear_permissions -p Godhost aming
rabbitmqctl set_permissions -p Godhost aming "." "." ".*"
这样您的用户aming就可以访问Godhost虚拟主机中的任何交换机或队列了。
查看队列中有多少消息
使用AMQP 0-9-1协议,通过queue.declare方法的返回值(queue.declare-ok)中的message_count字段。
使用RabbitMQ HTTP API。
查看队列中的消息数量和状态
rabbitmqctl list_queues
rabbitmqctl list_queues name messages
来查看队列的名称和消息数
可以使用 RabbitMQ 的管理界面来查看队列中的消息内容和人工发送消息内容
点击 queues,然后点击 Get Message(s) 来获取队列中的消息,
或者点击 Publish message 来发送消息
你也可以使用RabbitMQ管理插件,它提供了一个基于Web的用户界面,可以方便地监控和管理RabbitMQ服务器。
你可以在浏览器中访问http://<host>:15672来打开管理界面,
然后在Overview或者Queues页面中查看当前的消费者信息.
rabbitmq-plugins.bat enable rabbitmq_management
http://localhost:15672/,输入默认用户名和密码,都是guest
在Queues页面中选择任意一个队列,点击名称进入,滑动到最下面,可以看到有个Delete按钮,
点击即可删除该队列
这样会断开该队列上的所有worker的连接。
你需要对每个队列都进行这样的操作,才能清除所有的worker。这种方法比较繁琐,但是不会影响其他的配置和数据。
可以使用RabbitMQ客户端库提供的API,来编写自己的程序来清除所有的worker。
不同的语言和框架可能有不同的API,但一般都会提供一个方法来删除队列或者取消消费者。
例如,在Python中,你可以使用pika库来连接RabbitMQ服务器,
并使用channel.queue_delete方法来删除队列,
或者使用channel.basic_cancel方法来取消消费者。
你需要遍历所有的队列,并对每个队列执行这样的操作,才能清除所有的worker。
查看当前运行的worker
你可以使用rabbitmqctl命令行工具,它可以查询和管理RabbitMQ服务器的状态和配置。
rabbitmqctl list_consumers
查看当前所有的消费者信息,包括队列名、通道标识、消费者标签等。
使用RabbitMQ客户端库提供的API,来编写自己的程序来查询当前的消费者信息。
不同的语言和框架可能有不同的API,
但一般都会提供一个方法来获取队列的状态或者属性,其中包括消费者数量和消费者标签等信息。
例如,在Java中,你可以使用Channel类的queueDeclarePassive方法来获取一个已存在队列的属性。
rabbitmq.conf
命令行中使用 -l 或 --listen 参数。例如:
如果你想让 rabbitmq 服务器监听所有接口的 5672 端口(默认设置),
你可以在 rabbitmq.conf 文件中写:
listeners.tcp.default = 5672
如果你想让 rabbitmq 服务器监听 192.168.1.99 接口的 5672 端口,
你可以在 rabbitmq.conf 文件中写:
listeners.tcp.1 = 192.168.1.99:5672
如果你想让 rabbitmq 服务器监听多个接口和端口,
你可以在 rabbitmq.conf 文件中写:
listeners.tcp.1 = 192.168.1.99:5672
listeners.tcp.2 = [::1]:5673
如果你想在命令行中指定监听的接口和端口,
你可以使用 -l 或 --listen 参数,例如:
rabbitmq-server -l 192.168.1.99:5672
常见错误
用户缓存 替换
C:\Windows\System32\config\systemprofile
C:\Users\amingMM
.erlang.cookie
如果你的计算机名或者用户名是中文的,可能会导致RabbitMQ安装失败
rabbitmq-service.bat remove
rabbitmq-service.bat install
rabbitmq-service.bat start
常见问题
bash
rabbitmq queue 中使用的队列状态是 idle 的原因可能有以下几种
- 队列中没有消息,或者消息的数量很少,没有达到队列的容量限制。
- 队列中没有消费者,或者消费者的数量很少,没有达到队列的并发限制。
- 队列中的消息被设置了 TTL(生存时间),或者被设置了延迟投递,导致消息在一段时间内不可用。
- 队列中的消息被设置了优先级,或者被设置了公平分发,导致消息在一段时间内不被分配给消费者。
要解决这个问题,你可以尝试以下方法:
- 增加队列中的消息数量,或者减少队列的容量限制,让队列更快地达到饱和状态。
- 增加队列中的消费者数量,或者减少队列的并发限制,让队列更快地分配任务给消费者。
- 减少或取消队列中的消息 TTL 或延迟投递,让消息更快地可用。
- 减少或取消队列中的消息优先级或公平分发,让消息更均匀地分配给消费者。
amqp.exceptions.AccessRefused: (0, 0): (403) ACCESS_REFUSED - Login was refused using authentication mechanism PLAIN. For details see the broker logfile.
这个错误表明你的应用程序尝试使用的RabbitMQ的凭证是错误或缺失的
你需要检查你的连接工厂或配置文件中是否提供了正确的用户名和密码,以及是否指定了正确的虚拟主机。
如果你使用的是guest用户,你需要确保你是从本地主机连接,或者修改RabbitMQ的配置文件允许guest用户从远程主机连接
你也可以尝试创建一个新的用户并给予相应的权限
例如,下面的命令会创建一个名为RabbitUser的用户,并给予其在/虚拟主机上的完全访问权限:
rabbitmqctl add_user RabbitUser YOURPASSWORD
rabbitmqctl set_user_tags RabbitUser administrator
rabbitmqctl set_permissions -p / RabbitUser ".*" ".*" ".*"
日志
shell
查看broker日志文件的方法取决于你的rabbitmq的安装方式和配置。
一般来说,你可以在rabbitmq的日志文件中找到broker日志文件的位置
可以使用
rabbitmq-diagnostics -q log_location
命令来查看节点存储日志文件的位置
如果你使用docker运行rabbitmq,你可以使用docker logs命令来查看标准输出中的日志
rabbitmq-diagnostics tail_log
查看实时的日志输出。
rabbitmq-diagnostics -q log_location
确认你的节点是否真的输出到标准输出流中。
使用配置文件来设置日志文件的路径
可以在rabbitmq.conf文件中使用log.file这个键来指定日志文件的位置
使用环境变量来设置日志文件的路径。
在安装rabbitmq时设置RABBITMQ_LOGS这个环境变量的值
在rabbitmq-env.conf或rabbitmq-env-conf.bat文件中设置
可以使用RABBITMQ_LOGS这个环境变量来指定日志文件的路径
例如,你可以在文件中添加这样一行:
RABBITMQ_LOGS=/var/log/rabbitmq/rabbit.log
这样就会把日志输出到/var/log/rabbitmq/rabbit.log这个文件中。你也可以使用其他合法的文件路径
Windows
可以在文件管理器中找到日志文件的位置,然后用文本编辑器或其他工具打开它。
日志文件的位置取决于你安装或启动rabbitmq服务的用户。
一般来说,日志文件的路径是C:\Users\username\AppData\Roaming\RabbitMQ\log
poc-yaml-rabbitmq-default-password
| 348 | rabbitmq_default_passwd | Check the rabbitmq default password vuln
RabbitMQ 未授权访问(15672、15692、25672)
RabbitMQ是目前非常热门的一款消息中间件,基于AMQP协议的,可以在发布者和使用者之间交换异步消息。消息可以是人类可读的JSON,简单字符串或可以转换为JSON字符串的值列表。
默认账号密码都是guest