Below you will find pages that utilize the taxonomy term “RabbitMQ”
July 28, 2019
RabbitMQ常见面试题
"\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.rabbitmq.com/getstarted.html\"\u003eRabbitMq的消息类型(6种)\u003c/a\u003e、 \u003ca href=\"https://blog.haohtml.com/archives/15285\"\u003e消息确认机制\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRabbitMq中的概念及解释\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cul\u003e\n\u003cli\u003e \u003ccode\u003eServer(Broker)\u003c/code\u003e: 接收客户端连接,实现AMQP协议的消息队列和路由功能的进程;\u003c/li\u003e\n\u003cli\u003e \u003ccode\u003eVirtual Host\u003c/code\u003e:虚拟主机的概念,类似权限控制组,一个Virtual Host里可以有多个Exchange和Queue。\u003c/li\u003e\n\u003cli\u003e \u003ccode\u003eExchange\u003c/code\u003e: 交换机,接收生产者发送的消息,并根据Routing Key将消息路由到服务器中的队列Queue。\u003c/li\u003e\n\u003cli\u003e \u003ccode\u003eExchangeType\u003c/code\u003e: 交换机类型决定了路由消息行为,RabbitMQ中有四种类型Exchange,分别是\u003ccode\u003efanout\u003c/code\u003e、\u003ccode\u003edirect\u003c/code\u003e、\u003ccode\u003etopic\u003c/code\u003e 和 \u003ccode\u003eheaders\u003c/code\u003e;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eQueue\u003c/code\u003e:消息队列,用于存储还未被消费者消费的消息;\u003c/li\u003e\n\u003cli\u003e \u003ccode\u003eMessage\u003c/code\u003e:由Header和body组成,Header是由生产者添加的各种属性的集合,包括Message是否被持久化、优先级是多少、由哪个Message Queue接收等;body是真正需要发送的数据内容;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eBindingKey\u003c/code\u003e:绑定关键字,将一个特定的 \u003ccode\u003eExchange\u003c/code\u003e 和一个特定的 \u003ccode\u003eQueue\u003c/code\u003e 绑定起来。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e2. …\u003c/p\u003e"
July 28, 2019
rabbitmq消息队列的消息持久化机制
"\u003cp\u003e首先阅读这篇文章: \u003ca href=\"https://blog.csdn.net/yongche_shi/article/details/51500534\"\u003ehttps://blog.csdn.net/yongche_shi/article/details/51500534\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e之前其实已经写过一篇关于RabbitMQ持久化的 \u003ca href=\"http://jzhihui.iteye.com/blog/1642324\"\u003e文章\u003c/a\u003e ,但那篇文章侧重代码层面的写入流程,对于持久化操作何时发生以及什么时候会刷新到磁盘等问题其实都没有搞清楚,这篇文章着重于关注这些问题。\u003c/p\u003e\n\u003ch2 id=\"消息什么时候需要持久化\"\u003e消息什么时候需要持久化?\u003c/h2\u003e\n\u003cp\u003e根据 \u003ca href=\"http://www.rabbitmq.com/blog/2011/01/20/rabbitmq-backing-stores-databases-and-disks/\"\u003e官方博文\u003c/a\u003e 的介绍,RabbitMQ在两种情况下会将消息写入磁盘:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e消息本身在 \u003ccode\u003epublish\u003c/code\u003e 的时候就要求消息写入磁盘;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e内存紧张\u003c/code\u003e 需要将部分内存中的消息转移到磁盘;\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"消息什么时候会刷到磁盘\"\u003e消息什么时候会刷到磁盘?\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e写入文件前会有一个Buffer,大小为1M(1048576),数据在写入文件时,首先会写入到这个Buffer,如果Buffer已满,则会将Buffer写入到文件(未必刷到磁盘);\u003c/li\u003e\n\u003cli\u003e有个固定的刷盘时间:25ms,也就是不管Buffer满不满,每隔25ms,Buffer里的数据及未刷新到磁盘的文件内容必定会刷到磁盘;\u003c/li\u003e\n\u003cli\u003e每次消息写入后,如果没有后续写入请求,则会直接将已写入的消息刷到磁盘:使用Erlang的receive x after 0 …\u003c/li\u003e\u003c/ol\u003e"
March 28, 2015
用PHP尝试RabbitMQ(amqp扩展)实现消息的发送和接收
"\u003cp\u003e上篇文章我们介绍了 \u003ca href=\"http://blog.haohtml.com/archives/15484\"\u003eamqp扩展在windows下的安装方法\u003c/a\u003e,这里我们看一下用法。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e消费者:接收消息\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e逻辑:\n创建连接–\u0026gt;创建channel–\u0026gt;创建交换机–\u0026gt;创建队列–\u0026gt;绑定交换机/队列/路由键–\u0026gt;接收消息\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\u0026lt;?php\n/*************************************\n* PHP amqp(RabbitMQ) Demo - consumer\n* Author: Linvo\n* Date: 2012/7/30\n*************************************/\n//配置信息\n$conn_args = array(\n \u0026#39;host\u0026#39; =\u0026gt; \u0026#39;192.168.1.93\u0026#39;,\n \u0026#39;port\u0026#39; =\u0026gt; \u0026#39;5672\u0026#39;,\n \u0026#39;login\u0026#39; =\u0026gt; \u0026#39;guest\u0026#39;,\n \u0026#39;password\u0026#39; =\u0026gt; \u0026#39;guest\u0026#39;, …\u003c/code\u003e\u003c/pre\u003e"
March 28, 2015
windows下安装rabbitmq的php扩展amqp(原创)
"\u003cp\u003e从php官方下载相应的版本 \u003ca href=\"http://pecl.php.net/package/amqp\"\u003ehttp://pecl.php.net/package/amqp\u003c/a\u003e,我这里使用的是1.4.0版本( \u003ca href=\"http://pecl.php.net/package/amqp/1.4.0/windows\"\u003ehttp://pecl.php.net/package/amqp/1.4.0/windows\u003c/a\u003e)\n根据当前使用的php版本选择相应的扩展dll,下载后是一个压缩包,里面有两个dll扩展(php_amqp.dll和rabbitmq.1.dll)。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2015/03/php_amqp1.jpg\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/php_amqp1.jpg\" alt=\"php_amqp\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e我的环境是64位的,php5.5.12.所以使用的是 \u003ca href=\"http://windows.php.net/downloads/pecl/releases/amqp/1.4.0/php_amqp-1.4.0-5.5-ts-vc11-x64.zip\"\u003ehttp://windows.php.net/downloads/pecl/releases/amqp/1.4.0/php_amqp-1.4.0-5.5-ts-vc11-x64.zip\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e1.将php_amqp.dll放在php的ext目录里,然后修改php.ini文件,在文件的最后面添加两行\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e[amqp\\]\nextension=php_amqp.dll\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e2.将rabbitmq.1.dll文件放在php的根目录里(也就是ext目录的父级目录),然后修改apache的httpd.con文件,文件尾部添加一行\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eLoadFile …\u003c/code\u003e\u003c/pre\u003e"
August 2, 2014
RabbitMQ中的ack介绍
"\u003cp\u003eno_ack 的用途:确保 message 被 consumer “成功”处理了。这里“成功”的意思是,(在设置了 no_ack=false 的情况下)只要 consumer 手动应答了 Basic.Ack ,就算其“成功”处理了。\u003c/p\u003e\n\u003cp\u003e对于ack简单的说就是“消费者”先从queue里读取一条数据,然后去处理,等处理完了,再给queue一个 ack 回应,表示处理完了,这时queue就将这条数据从队列中删除。如果不回应给队列ack的话,则这条消息仍然存在在queue中(这个也属于一种应用场景)。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e在 no_ack=true 的情况下,RabbitMQ 认为 message 一旦被 deliver 出去了,就已被确认了,所以会立即将缓存中的 message 删除。所以在 consumer 异常时会导致消息丢失。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cem\u003e\u003cstrong\u003eno_ack=false\u003c/strong\u003e(此时为 \u003cstrong\u003e手动应答\u003c/strong\u003e)\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e在这种情况下,要求 consumer 在处理完接收到的 Basic.Deliver + Content-Header + Content-Body 之后才回复 Ack 。而这个 Ack 是 AMQP 协议中的 Basic.Ack …\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e"
August 1, 2014
认识 RabbitMQ 消息队列
"\u003ch1 id=\"rabbitmq架构图\"\u003eRabbitMQ架构图\u003c/h1\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2014/08/rabbitmq-struct.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/rabbitmq-struct.png\" alt=\"rabbitmq-struct\"\u003e\u003c/a\u003e rabbitmq 架构图\u003c/p\u003e\n\u003ch1 id=\"基本概念\"\u003e基本\u003cstrong\u003e概念\u003c/strong\u003e\u003c/h1\u003e\n\u003cp\u003e\u003ccode\u003eBroker\u003c/code\u003e:简单来说就是消息队列服务器实体。\n\u003ccode\u003eExchange\u003c/code\u003e:消息交换机,它指定消息按什么规则,路由到哪个队列。\n\u003ccode\u003eQueue\u003c/code\u003e:消息队列载体,每个消息都会被投入到一个或多个队列。\n\u003ccode\u003eBinding\u003c/code\u003e:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。\n\u003ccode\u003eRouting Key\u003c/code\u003e:路由关键字,exchange根据这个关键字进行消息投递。\n\u003ccode\u003evhost\u003c/code\u003e:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。\n\u003ccode\u003eproducer\u003c/code\u003e:消息生产者,就是投递消息的程序。\n\u003ccode\u003econsumer\u003c/code\u003e:消息消费者,就是接受消息的程序。\n\u003ccode\u003echannel\u003c/code\u003e:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。\u003c/p\u003e\n\u003ch1 id=\"操作流程\"\u003e操作流程\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003e(1)客户端连接到消息队列服务器,打开一个channel。\u003c/li\u003e\n\u003cli\u003e(2)客户端声明一个exchange,并设置相关属性。\u003c/li\u003e\n\u003cli\u003e(3)客户端声明一个queue,并设置相关属性。\u003c/li\u003e\n\u003cli\u003e(4)客户端使用routing key,在exchange和queue之间建立好绑定关系。\u003c/li\u003e\n\u003cli\u003e(5)客户 …\u003c/li\u003e\u003c/ul\u003e"
August 1, 2014
将rabbitmq 里的消息持久化
"\u003ch2 id=\"消息持久设置\"\u003e消息持久设置:\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e将交换机置为可持久;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e将通道置为可持久\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e消息发送时设置可持久。\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e当我们“生产”了一条可持久化的消息,尝试中断MQ服务,启动消费者获取消息,消息依然能够恢复。相反,则抛出异常。\u003c/p\u003e\n\u003cp\u003e上面三条必须全部设置,不然消息将无法持久化。\u003c/p\u003e"
August 1, 2014
rabbitmq 添加远程访问功能
"\u003cp\u003e刚刚安装过的rabbitmq 消息队列,并启用了插件管理功能,3.3.1版中,处于安全的考虑,guest这个默认的用户只能通过http://localhost:15672 来登录,其他的IP无法直接使用这个账号。 这对于服务器上没有安装桌面的情况是无法管理维护的,除非通过在前面添加一层代理向外提供服务,这个又有些麻烦了,这里通过配置文件来实现这个功能。\u003c/p\u003e\n\u003cp\u003e只要编辑 /etc/rabbitmq/rabbitmq.config 文件,添加以下配置就可以了。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[\n{rabbit, [{tcp_listeners, [5672]}, {loopback_users, [“asdf”]}]}\n].\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e现在添加了一个新授权用户asdf,可以通过外网使用这个用户名和密码访问.(记得要先用命令添加这个命令才行,#rabbitmqctl add_user asdf pwd123456)我是通过在管理平台里直接添加的用户和密码的,我的测试环境装有桌面的。\n参考文档: \u003ca href=\"http://www.rabbitmq.com/access-control.html\"\u003ehttp://www.rabbitmq.com/access-control.html\u003c/a\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# rabbitmqctl add_user …\u003c/code\u003e\u003c/pre\u003e"
June 21, 2011
centos下安装RabbitMQ消息队列
"\u003cp\u003e这里环境为centos7 64位.\n一。安装erlang\u003c/p\u003e\n\u003cp\u003e[shell]su -c ‘rpm -Uvh \u003ca href=\"http://download.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm\"\u003ehttp://download.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm\u003c/a\u003e’\nsudo yum install erlang[/shell]\u003c/p\u003e\n\u003cp\u003e二。安装rabbitmq\u003c/p\u003e\n\u003cp\u003e我们是用CentOS7(RHEL7也一样),可以从这里: \u003ca href=\"http://fedoraproject.org/wiki/EPEL/FAQ#howtouse\"\u003ehttp://fedoraproject.org/wiki/EPEL/FAQ#howtouse\u003c/a\u003e 找到安装有erlang的RHEL7(CentOS同)软件仓库并安装:\u003c/p\u003e\n\u003cp\u003e[shell]\nwget -c \u003ca href=\"http://www.rabbitmq.com/releases/rabbitmq-server/v3.5.0/rabbitmq-server-3.5.0-1.noarch.rpm\"\u003ehttp://www.rabbitmq.com/releases/rabbitmq-server/v3.5.0/rabbitmq-server-3.5.0-1.noarch.rpm\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003esudo rpm –import \u003ca href=\"http://www.rabbitmq.com/rabbitmq-signing-key-public.asc\"\u003ehttp://www.rabbitmq.com/rabbitmq-signing-key-public.asc\u003c/a\u003e\nsudo yum install …\u003c/p\u003e"