rabbitmq官网(Rabbitmq怎么知道消费者执行是否成功)

本文目录
- Rabbitmq怎么知道消费者执行是否成功
- RabbitMQ - 5种工作模式
- 一文带你了解RabbitMQ到底是个什么鬼!
- rabbitmq 修改用户密码怎么用java代码实现
- rabbitmq3.8.2安装步骤及集群配置
- rabbitmq官网中的php测试helloworld的代码是否有问题
- windows下安装rabbitmq出现如下问题
- rabbitMQ之安装和配置(一)
Rabbitmq怎么知道消费者执行是否成功
建议看一下rabbit官网的文档说明,其详细描述了关于消息的生命周期。
设定消息的ack机制:server发送给client时,会要求client主动调用代码发送ack,只要ack收到了才会删除消息,以确认消息被处理成功。
对于client端,需要收到消息并处理后,主动调用basic.ack方法。
RabbitMQ - 5种工作模式
RabbitMQ官网中介绍了6种工作模式,其中RPC不常用,本文主要介绍前5种。
最简单的一个模式,开发者定义一个命名队列,然后publisher向这个命名队列中发送消息。最后consumer可以通过这个命名队列获取待处理的消息。
Exchange,Queue以及消息均没做持久化设置。
consumer设置了自动回复ack。
exchange type为direct
数据流:
简单模式中,consumer的任务只是取出message,然后打印,这个过程非常快。 但现实场景任务往往是各种各样,任务变成例如将word转换成pdf这些cpu密集型的任务,处理速度就没那么快,而且1个consumer同时只能处理1条message,当生产message速度大于消费速度时,就会造成message堆积在queue,吞吐量下降。这时就要添加更多consumer并行消费message,而且consumer可以动态伸缩。
exchange type为direct
RabbitMQ默认采用轮询模式分发消息到各个consumer,例如有两个consumer,c1,c2,同时启动c1,c2从queue中获取任务,任务是按顺序依次分发到c1,c2,c1,c2... 有点类似是push模式。
轮询的分发方式其实不是恰当,例如有两个consumer,c1,c2,连接到RabbitMQ,如果采用轮询方式,c1只会接收编号为奇数的message,c2只会接收偶数的message,假如奇数message都是很重的任务,而偶数message都是很轻,那么很可能c1经常处于忙碌状态,而c2则经常处于空闲状态。 但RabbitMQ不知道各个consumer处理的情况,它只管第n条消息分发给第n个consumer。
为了解决这个问题,需要consumer告知RabbitMQ,在未处理完当前消息前,不要发新的消息发送过来。
相当于RabbitMQ不会假设第n条消息一定要发给第n个consumer,当某个consumer确认message处理完后,RabbitMQ才会把queue中最前面的消息取出并分发给这个consumer。
consumer处理message可能需要一定时间,如果在处理途中挂掉,那么message未处理完毕,就造成数据丢失。
RabbitMQ提供message 确认机制,consumer应该在确保自身处理完message后,再往RabbitMQ发送ack,这时RabbitMQ方可认为消息完成处理。 否则,一旦consumer死亡,例如断开了连接,channel关闭了,RabbitMQ会把当前分发给该consumer,但又未ack的message回收,重新分发给其他consumer。
这样即使consumer挂了,也不会造成message丢失。
虽然解决了message可能会丢失问题,但是当RabbitMQ关闭或者崩溃时,message依然会丢失。
所以需要对queue和message做持久化保存。
PS:RabbitMQ是不允许对已经存在的queue进行参数设置,例如hello queue在创建时,durable参数设置为false,就不能改为true。
PS:即使设置了持久化选项,在非发布订阅模式下,message也不是每秒都会调用fsync命令刷盘。
简单模式和work queues模式本质都是一样,只有1个queue。message发送给exchange后,exchange判断为direct模式后,直接就将message转发到绑定的queue。而且1条消息只能发送给1个consumer。假如1条消息要被多个consumer消费呢。
这就需要用到Publish/Subscribe模式,该模式下
exchange type为fanout,比起direct,exchange与queue从1对1binding,转变为1对多binding。
Publish/Subscribe模式下,exchange会把message全部发送给与其bind的queue。
不同queue如果想有选择地过滤message,在fanout模式下是做不到的。
例如日志系统,queueA只接收warning,error级别日志,queueB只接收fatal日志。
这就需要用到routing key了。
PS:fanout模式下,发布message和bind exchange时routing key参数是会被自动忽略。
exchange type使用direct取代fanout,多个consumer自行创建queue,并且设置routing key绑定到exchange。
如图:
如果多个consumer关注了同一个routing-key,那么实际就会表现如fanout模式。
routing-key为black的messag均会发送到Q1 Q2。
routing模式依然存在一些限制,例如无法支持routing key模糊匹配
像unix的一个工具 syslog,它的路由规则是基于 日志级别(info/warn/crit...) + 设备来源(auth/cron/kern...)。
例如某个consumer需要监控来自auth的info和error message,如果用routing模式,就需要绑定 auth.info 和 auth.error两个key,不方便。
这就需要更强的Topics模式,其实就是Routing模式之上支持模糊匹配。
发送到topic exchange的routing-key必须是有规则的字符串,例如以.分隔的,并且每个分隔符内的字符串带有特征,例如"stock.usd.nyse", "nyse.vmw", "quick.orange.rabbit"。 routing-key长度最大为255字节。
topic其实与direct模式很相似,对于binding keys,topic模式多了两个特征
例如routing-key为描述动物的,格式为 "《speed》.《colour》.《species》".
那么两个queue可被描述为:
Topic exchange 也可以表现得和direct和fanout模式一样
一文带你了解RabbitMQ到底是个什么鬼!
MQ全程为message queue,即消息队列。是一种跨进程、异步通信机制、用于上下游传递消息。RabbitMQ是由Erlang语言开发,基于 AMQP 协议(Advanced Message Queuing Protocol 高级消息队列协议)实现的消息队列,它是一种应用程序之间的通信方法,消息队列在实际开发应用中有着非常广泛的使用。下面主要介绍RabbitMQ的基础、架构以及在开发过程中遇到的一些常用问题,还有在面试过程中一些长问的问题。
RabbitMQ官网***隐藏网址***
2007年Rabbit公司基于AMQP标准协议开发的RabbitMQ1.0发布。AMQP的主要特性是面向消息、队列、路由、可靠性、安全。AMQP协议更多用在企业系统内,对数据一致性、稳定性和可靠性有着很高的要求场景,对性能和吞吐量的要求在其次。
RabbitMQ基础架构如下图:
来介绍下上图中一些名词相关的概念:
RabbitMQ内置了几种常用的exchange,包含direct、topic、fanout、headers,下面主要介绍几种常用的exchange类型。
直连交换机,完全匹配路由key,所有发送到direct exchange的消息会被转发到routeKey中指定的queue中。消息传递时,routeKey必须要完全匹配才会被队列接手,否则消息会被抛弃。
主题交换机,根据匹配路由规则来分发消息, # 匹配一个或多个词, * 匹配不多不少一个词。比如“log.#”能够匹配到“log.info.test”,“log.*”能够匹配到“log.err”。
广播交换机,不处理路由,只需要将队列绑定到交换机上,发送到交换机的消息会被转发到与该交换机绑定的所有的队列上。
RabbitMQ提供了三种模式,分别为单机模式、普通集群模式、镜像集群模式,下面分别介绍下这三种模式。
这个就是demo级别的,即单机情况不做集群,一般也就是你本地启动玩玩写写测试用的,没有人在生产用这种模式的。
多台机器上启动多个RabbitMQ实例,以两个节点(node-1,node-2)为例来进行说明。对于queue来说,消息实体只存在于其中一个节点node-1或者node-2,node-1和node-2两个节点仅有相同的元数据(即队列相关的结构)。当消息进入node-1后,consumer从node-2节点消费时,RabbitMQ会临时在node-1、node-2间进行消息传输,把A中的消息取出来并经过B在发送给consumer,所以consumer以ing改尽量连接每一个节点,从中获取消息。负责无论consumer连接node-1或者node-2,出口总在node-1,会产生瓶颈,如果当node-1节点故障后,node-2无法获取node-1的消息。如果做了持久化,那么必须要等到node-1恢复后,才能继续消费,如果消息没有做持久化,就会出小消息丢失的情况。
一般配合HAProxy配置为高可用集群,把需要的队列做成镜像队列,存在与多个节点属于 RabbitMQ的HA方案。该模式解决了普通模式中的问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在客户端取数据时临时拉取。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。所以在对可靠性要求较高的场合中适用。
完成镜像队列设置之后,每各队列会被复制到各个节点,各个节点状态保持一致。因为 RabbitMQ本身不提供负载均衡,需要搭建负载均衡器来提供负载转发,可以选择HAProxy 和Nginx。
采用 AMQP 高级消息队列协议的一种消息队列技术,最大的特点就是消费并不需要确保提供方存在,实现了服务之间的高度解耦。
消息持久化,当然前提是队列必须持久化。
在消息生产时,MQ内部针对每条生产者发送的消息生成一个 inner-msg-id ,作为去重的依据(消息投递失败并重传),避免重复的消息进入队列;在消息消费时,要求消息体中必须要有一个 bizId (对于同一业务全局唯一,如支付 ID、订单 ID、帖子 ID 等)作为去重的依据,避免同一条消息被重复消费。
将信道设置成 confirm 模式(发送方确认模式),则所有在信道上发布的消息都会被指派一个唯一的ID。
一旦消息被投递到目的队列后,或者消息被写入磁盘后(可持久化的消息),信道会发送一个确认给生产者(包含消息唯一 ID)。
如果RabbitMQ发生内部错误从而导致消息丢失,会发送一条 nack(notacknowledged,未确认)消息。
发送方确认模式是异步的,生产者应用程序在等待确认的同时,可以继续发送消息。当确认消息到达生产者应用程序,生产者应用程序的回调方法就会被触发来处理确认消息。
消费者接收每一条消息后都必须进行确认(消息接收和消息确认是两个不同操作)。只有消费者确认了消息,RabbitMQ才能安全地把消息从队列中删除。
这里并没有用到超时机制,RabbitMQ仅通过Consumer的连接中断来确认是否需要重新发送消息。也就是说,只要连接不中断,RabbitMQ给了Consumer足够长的时间来处理消息。保证数据的最终一致性;
下面列举几种特殊情况:
所以消息队列实际是一种非常复杂的架构,你引入它有很多好处,但是也得针对它带来的坏处做各种额外的技术方案和架构来规避掉,最好之后,你会发现,妈呀,系统复杂度提升了一个数量级,也许是复杂了10倍。但是关键时刻,用,还是得用的。最后希望这篇能给大家带来收获,喜欢加关注,后续持续更新!
rabbitmq 修改用户密码怎么用java代码实现
***隐藏网址***
2.安装完之后 启动rabbitmq, sudo rabbitmq-server
3.下载jar包
4.最简单的hello world的实现
rabbitmq3.8.2安装步骤及集群配置
***隐藏网址***
***隐藏网址***
提取码: gd8t这一步主要参考官网的步骤,具体如下:
创建 /etc/yum.repos.d/rabbitmq_erlang.repo 文件,内容如下:
安装erlang
2.2.1 导入mq签名
***隐藏网址***
),我这边服务器是centos7,故rabbitmq.repo写入如下内容:
2.2.3 安装rabbitmq服务
2.2.4 启动服务并设置开机自启动
2.2.5 开启管理界面
这一点 方便我们通过url访问查看运行情况,阿里云服务器安全里一定要开启15672端口
在此我们还需要新增一个用户作为管理员
添加用户 -用户名 密码自己定
修改用户角色为管理员- 把下面username改成自己的用户名
修改用户权限
自此 你可以通过ip:15672的方式访问RabbitMQ后台
目前我是有两台阿里云的,同一区的服务器,内网可访问。
2.3.1 修改hostname -服务器别名,方便我们后面两个mq服务连接
vi /etc/hosts 新增node1和node2 两个内网ip
原以为OK了,重启还是老样子,其实centos7 还提供了一步方法
直接修改成功了!
2.3.2 Erlang cookie设置,这里最坑,困了我好久,有必要总结一下
确保node1与node2两个服务器的.erlang.cookie保持一致
找到node1服务器的.erlang.cookie,位置如下:
/var/lib/rabbitmq/.erlang.cookie
然后复制内容到node2服务器对应的.erlang.cookie
修改好后,记得还原权限400
修改完后 一定要重启node1与node2服务器,这样修改才能生效。之前一直困扰我的node2连接不上node1的mq服务,一直提示cookie有问题,重启mq服务也没用,重启服务器 reboot后问题就可以解决,切莫少了这步。
出现的问题如下:
TCP connection succeeded but Erlang distribution failed
Authentication failed (rejected by the remote node), please check the Erlang cookie
那就执行重启命令吧!一切解决!
2.3.3 加入mq集群
node1 mq服务设置后台执行
可以查看目前 node1的mq状态
node2 加入node1的MQ集群,关键时刻了!
配置好MQ集群后,可以在 node1、node2服务器上任意执行 rabbitmqctl cluster_status 来查看MQ集群是否配置成功
如下图所示:
这里就彻底成功了!现在直接通过url访问看一下是否正常可以显示两个mq服务:
rabbitmq官网中的php测试helloworld的代码是否有问题
《?php
require_once __DIR__ . ’/vendor/autoload.php’;use PhpAmqpLib\Connection\AMQPConnection;use PhpAmqpLib\Message\AMQPMessage;
$connection = new AMQPConnection(’localhost’, 5672, ’guest’, ’guest’);$channel = $connection-》channel();
$channel-》queue_declare(’hello’, false, false, false, false);$msg = new AMQPMessage(’Hello World!’);
$channel-》basic_publish($msg, ’’, ’hello’);echo " Sent ’Hello World!’\n";
$channel-》close();
$connection-》close();
?》
receive.php
《?php
require_once __DIR__ . ’/vendor/autoload.php’;use PhpAmqpLib\Connection\AMQPConnection;$connection = new AMQPConnection(’localhost’, 5672, ’guest’, ’guest’);$channel = $connection-》channel();
$channel-》queue_declare(’hello’, false, false, false, false);echo ’ Waiting for messages. To exit press CTRL+C’, "\n";$callback = function($msg) {
echo " Received ", $msg-》body, "\n";
};
$channel-》basic_consume(’hello’, ’’, false, true, false, false, $callback);while(count($channel-》callbacks)) {
$channel-》wait();
}
$channel-》close();
$connection-》close();
?》
windows下安装rabbitmq出现如下问题
rabbitmq:rabbitmq-server-3.6.14
erlang:otp_win64_19.1(我开始装的20.1,不管怎么调试在后面启动rabbitmq时总会报错,降了一个版本就好了,具体版本对照可以参照rabbitmq官网)
erlang安装完之后需要自己手动添加环境变量,这个网上很多,不多做描述。
注:erlang有个很坑的地方,你的计算机主机名不能有中文,不是安装会有问题。会有如下报错:
Can’t set short node name!
Please check your configuration
rabbitMQ之安装和配置(一)
向/etc/yum.repos.d/下添加rabbitmq.repo文件
yum update -y
yum install -y make gcc gcc-c++ m4 openssl openssl-devel ncurses-devel unixODBC unixODBC-devel java java-devel
yum install socat logrotate -y
yum install erlang rabbitmq-server -y
systemctl start rabbitmq-server
RabbitMQ启动出错:- unable to connect to epmd on xxxx: timeout (timed out)
因为本机主机名到IP地址的解析对应不起来;
192.168.100.251 test-web2
保存退出,再次启动
设置RabbitMQ开机自启动:
systemctl enable rabbitmq-server
RabbitMQ其他操作:
rabbitmqctl status
rabbitmqctl stop
systemctl restart rabbitmq-server
/etc/rabbitmq/rabbitmq.conf
rabbitmqctl : rabbitmq的客户端,用来连接管理rabbitmq;
rabbitmq-env :配置环境变量的管理者;
rabbitmq-plugins:rabbitmq后台插件管理;
rabbitmq-server: rabbitmq守护进程;
查看状态信息
1.启用网页版后台管理插件:
rabbitmq-plugins enable rabbitmq_management
2.新建一个用户名为admin,密码为admin的管理员,并授予管理员(administrator)权限。
rabbitmqctl add_user admin admin
rabbitmqctl set_user_tags admin administrator
3.设置admin可以使用的虚机权限。
添加 admin 虚拟机
rabbitmqctl add_vhost admin
设置admin可以使用的虚机admin权限
rabbitmqctl set_permissions -p admin admin ". " ". " ". "
3.1用户管理
查看所有用户
rabbitmqctl list_users
添加一个用户
rabbitmqctl add_user zhaobl 123456
配置权限
rabbitmqctl set_permissions -p "/" zhaobl ". " ". " ". "
查看用户权限
rabbitmqctl list_user_permissions zhaobl
设置tag
rabbitmqctl set_user_tags zhaobl administrator
删除用户(安全起见,删除默认用户)
rabbitmqctl delete_user guest
4.插件管理:
插件列表:
rabbitmq-plugins list
启动插件:
rabbitmq-plugins enable XXX (XXX为插件名)
停用插件:
rabbitmq-plugins disable XXX
***隐藏网址***
7.其他配置
***隐藏网址***
使用Docker安装RabbitMQ
首先,我们得安装docker环境,docker环境的安装本站后面会有文章介绍,本文假设你的机器上已经安装好了docker环境。
先拉取RabbitMQ镜像:
docker pull rabbitmq:3.8.1-management
然后查看镜像:
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
rabbitmq 3.8.1-management 36ed80b6a1b1 5 weeks ago 180MB
然后运行容器:
docker run --name rabbitmq -d -p 5672:5672 -p 15672:15672 -v /data:/var/lib/rabbitmq rabbitmq:3.8.1-management
最后,使用docker ps查看运行的容器。
这样,一个RabbitMQ的docker环境就装好了。
RabbitMQ技术入门与实战
***隐藏网址***

更多文章:
avantage怎么设置为中文(Avantage安装丢失GIT)
2026年10月15日 03:00
activex控件未注册怎么办(登陆视频监控网页时提示activex控件未注册,怎么解决)
2026年10月14日 20:30
excel连接sql数据库教程(excel怎么连接sql数据库)
2026年10月14日 19:40






