rabbitMQ说明文档
rabbitMQ是什么
RabbitMQ 是由 LShift 提供的一个 Advanced Message Queuing Protocol (AMQP) 的开源实现,由以高性能、健壮以及可伸缩性出名的 Erlang 写成(因此也是继承了这些优点)。
首先介绍 AMQP 和一些基本概念:
当前各种应用大量使用异步消息模型,并随之产生众多消息中间件产品及协议,标准的不一致使应用与中间件之间的耦合限制产品的选择,并增加维护成本。 AMQP 是一个提供统一消息服务的应用层标准协议,基于此协议的客户端与消息中间件可传递消息,并不受客户端 / 中间件不同产品,不同开发语言等条件的限制。 当然这种降低耦合的机制是基于与上层产品,语言无关的协议。 AMQP 协议是一种二进制协议,提供客户端应用与消息中间件之间异步、安全、高效地交互。从整体来看, AMQP 协议可划分为三层。
这种分层架构类似于 OSI 网络协议,可替换各层实现而不影响与其它层的交互。 AMQP 定义了合适的服务器端域模型,用于规范服务器的行为 (AMQP 服务器端可称为 broker) 。
Model 层决定这些基本域模型所产生的行为,这种行为在 AMQP 中用 ”command” 表示,在后文中会着重来分析这些域模型。
Session 层定义客户端与 broker 之间的通信 ( 通信双方都是一个 peer ,可互称做 partner) ,为 command 的可靠传输提供保障。
Transport 层专注于数据传送,并与 Session 保持交互,接受上层的数据,组装成二进制流,传送到 receiver 后再解析数据,交付给 Session 层。 Session 层需要 Transport 层完成网络异常情况的汇报,顺序传送 command 等工作。
AMQP 当中有四个概念非常重要:虚拟主机( virtual host ),交换机( exchange ),队列( queue )和绑定( binding )。
虚拟主机( virtual host ):一个虚拟主机持有一组交换机、队列和绑定。为什么需要多个虚拟主机呢? RabbitMQ 当中,用户只能在虚拟主机的粒度进行权限控制。因此,如果需要禁止 A 组访问 B 组的交换机 / 队列 / 绑定,必须为 A 和 B 分别创建一个虚拟主机。每一个 RabbitMQ 服务器都有一个默认的虚拟主机 “/” 。
队列( Queue ):由消费者建立的,是 messages 的终点,可以理解成装消息的容器。消息一直存在队列里,直到有客户端或者称为 Consumer 消费者连接到这个队列并将 message 取走为止。队列可以有多个。
交换机( Exchange ):可以理解成具有路由表的路由程序。每个消息都有一个路由键( routing key ),就是一个简单的字符串。交换机中有一系列的绑定( binding ),即路由规则( routes )。交换机可以有多个。多个队列可以和同一个交换机绑定,同时多个交换机也可以和同一个队列绑定。(多对多的关系)
三种交换机:
1. Fanout Exchange (不处理路由键):一个发送到交换机上的消息都会被转发到与该交换机绑定的所有队列上。 Fanout 交换机发消息是最快的。
2. Direct Exchange (处理路由键):如果一个队列绑定到该交换机上,并且当前要求路由键为 X ,只有路由键是 X 的消息才会被这个队列转发。
3. Topic Exchange (将路由键和某模式进行匹配,可以理解成模糊处理):路由键的词由 “.” 隔开,符号 “#” 表示匹配 0 个或多个词,符号 “*” 表示匹配不多不少一个词。因此 “ audit.# ” 能够匹配到 “ audit.irs.corporate ” ,但是 “ audit.* ” 只会匹配到 “ audit.irs ”
具体例子可以看下图
持久化:队列和交换机有一个创建时候指定的标志durable,直译叫做坚固的。durable的唯一含义就是具有这个标志的队列和交换机会在重启之后重新建立,它不表示说在队列当中的消息会在重启后恢复。那么如何才能做到不只是队列和交换机,还有消息都是持久的呢?
但是首先一个问题是,你真的需要消息是持久的吗?对于一个需要在重启之后回复的消息来说,它需要被写入到磁盘上,而即使是最简单的磁盘操作也是要消耗时间的。如果和消息的内容相比,你更看重的是消息处理的速度,那么不要使用持久化的消息。
当你将消息发布到交换机的时候,可以指定一个标志“Delivery Mode”(投递模式)。根据你使用的AMQP的库不同,指定这个标志的方法可能不太一样。简单的说,就是将 Delivery Mode设置成2,也就是持久的即可。一般的AMQP库都是将Delivery Mode设置成1,也就是非持久的。所以要持久化消息的步骤如下:
1. 将交换机设成 durable 。
2. 将队列设成 durable 。
3. 将消息的 Delivery Mode 设置成 2 。
绑定( Bindings )如何持久化?我们无法在创建绑定的时候设置成 durable 。没问题,如果绑定了一个 durable 的队列和一个 durable 的交换机, RabbitMQ 会自动保留这个绑定。类似的,如果删除了某个队列或交换机(无论是不是 durable ),依赖它的绑定都会自动删除。
注意两点:
1. RabbitMQ 不允许绑定一个非坚固( non-durable )的交换机和一个 durable 的队列。反之亦然。要想成功必须队列和交换机都是 durable 的。
2. 一旦创建了队列和交换机,就不能修改其标志了。例如,如果创建了一个 non-durable 的队列,然后想把它改变成 durable 的,唯一的办法就是删除这个队列然后重现创建。因此,最好仔细检查创建的标志。
消息队列(MQ)使用过程
几个概念说明:
1. Broker:简单来说就是消息队列服务器实体。
2. Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
3. Queue:消息队列载体,每个消息都会被投入到一个或多个队列。
4. Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
5. Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
6. vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
7. producer:消息生产者,就是投递消息的程序。
8. consumer:消息消费者,就是接受消息的程序。
9. channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。
消息队列的使用过程大概如下:
1. 客户端连接到消息队列服务器,打开一个channel。
2. 客户端声明一个exchange,并设置相关属性。
3. 客户端声明一个queue,并设置相关属性。
4. 客户端使用routing key,在exchange和queue之间建立好绑定关系。
5. 客户端投递消息到exchange。
6. exchange接收到消息后,就根据消息的key和已经设置的binding,进行消息路由,将消息投递到一个或多个队列里。
rabbitMQ的优点(适用范围)
1. 基于erlang语言开发具有高可用高并发的优点,适合集群服务器。
2. 健壮、稳定、易用、跨平台、支持多种语言、文档齐全。
3. 有消息确认机制和持久化机制,可靠性高。
4. 开源
其他MQ的优势:
1. Apache ActiveMQ曝光率最高,但是可能会丢消息。
2. ZeroMQ延迟很低、支持灵活拓扑,但是不支持消息持久化和崩溃恢复。
rabbitMQ单个节点部署文档
Ubuntu(12.04)安装rabbitMQ(python使用rabbitMQ服务)
1. 添加rabbitmq源:
1) sudo vim /etc/apt/sources.list
2) 把 deb http://www.rabbitmq.com/debian/ testing main 添加进去
2. 添加公钥:
1) wget http://www.rabbitmq.com/rabbitmq-signing-key-public.asc
2) sudo apt-key add rabbitmq-signing-key-public.asc
3. 更新并安装rabbitmq-server:
1) wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.2.2/rabbitmq-server_3.2.2-1_all.deb
2) sudo dpkg -i rabbitmq-server_3.2.2-1_all.deb
4. 安装pika:
1) sudo apt-get install python-pip
2) sudo pip install pika
5. 配置文件:官方地址:http://www.rabbitmq.com/configure.html一般情况下,RabbitMQ的默认配置就足够了。如果希望特殊设置的话,有两个途径:一个是环境变量的配置文件rabbitmq-env.conf;一个是配置信息的配置文件 rabbitmq.config;注意,这两个文件默认是没有的,如果需要必须自己创建。
1) rabbitmq-env.conf:这个文件的位置是确定和不能改变的,位于:/etc/rabbitmq目录下(这个目录需要自己创建)。文件的内容 包括了 RabbitMQ的一些环境变量,常用的有:端口号、配置文件的路径、需要使用的MNESIA数据库的路径、log的路径插件的路径。
具体的列表见: http://www.rabbitmq.com/configure.html#define-environment-variables
2) rabbitmq.config:这是一个标准的erlang配置文件。它必须符合erlang配置文件的标准。它既有默认的目录,也可以在rabbitmq-env.conf文件中配置。文件的内容详见: http://www.rabbitmq.com/configure.html#config-items( 更改完密码配置除了重启一定要再用命令行改一下 )
rabbitMQ说明文档的更多相关文章
- RabbitMQ安装说明文档(超详细版本)
RabbitMQ安装说明文档(超详细版本) 1. 安装依赖环境 在线安装依赖环境: yum install build-essential openssl openssl-devel unixODBC ...
- 【腾讯GAD暑期训练营游戏程序班】游戏场景管理作业说明文档
场景管理作业说明文档 用了八叉树的算法,测出三层时最快,区域范围内物体数量为21块,控制台打印出的结果如图所示: 场景物体:游戏中,所有具有空 ...
- 浏览器内核控制Meta标签说明文档
浏览器内核控制Meta标签说明文档 原文链接 背景介绍 由于众所周知的情况,国内的主流浏览器都是双核浏览器:基于Webkit内核用于常用网站的高速浏览.基于IE的内核用于兼容网银.旧版网站.以360的 ...
- OAuth2.0说明文档
OAuth2.0说明文档 1.OAuth 2.0 简介 OAuth为应用提供了一种访问受保护资源的方法.在应用访问受保护资源之前,它必须先从资源拥有者处获取授权(访问许可),然后用访问许可交换访问令牌 ...
- Net 通用权限管理系统源码 带数据库设计文档,部署说明文档
Net 通用权限管理系统源码 带数据库设计文档,部署说明文档 包括数据库设计文档部署安装文档源码数据库文件 下载地址:http://www.mallhd.com/archives/1389
- SWFUpload 2.5.0版 官方说明文档 中文翻译版
原文地址:http://www.cnblogs.com/youring2/archive/2012/07/13/2590010.html#setFileUploadLimit SWFUpload v2 ...
- 在Sharepoint 2010中启用Session功能的说明文档
在Sharepoint 2010中启用Session功能的说明文档 开发环境:Windows 7系统,SharePoint Server 2010,Visual Studio 2010 按以下步骤进行 ...
- Highcharts选项配置详细说明文档(zz)
http://www.helloweba.com/view-blog-156.html Highcharts提供大量的选项配置参数,您可以轻松定制符合用户要求的图表,目前官网只提供英文版的开发配置说明 ...
- Java基础(60):Java打包生成Jar和Javadoc说明文档,以及在另外的工程中导入和使用自己的Jar
一.Jar包的导出 1.在Package Explorer中选中项目,右键,点击“Export” 2.在弹出框一次选择Java-->JAR file,点击Next 3.在新弹出的窗口选择 ...
随机推荐
- RaspberryPI 连接rs232模块接线图
- projecteuler---->problem=14----Longest Collatz sequence
title: The following iterative sequence is defined for the set of positive integers: n n/2 (n is eve ...
- CallContext和多线程
前一段时间正好要在某个网页程序上开一个多线程调用多个组件的尝试,这些组件是有其他团队开发的(如:印度/俄罗斯),所以修改它们的代码看起来是不太现实的,但是,令人恼火的是他们的代码中大量的用到了AppC ...
- hdu4190 简单的二分法
题意是 有n个城市,m个投票箱.接下来n个城市人口数,每一个投票箱都不能为空.计算最后投票箱的容量必须达到多少,才干满足须要. 每一个城市的人必须仅仅能将票投到自己城市分得得投票箱中.要是容量最小箱子 ...
- jQuery
代码的层定位滑动动画效果
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 花生壳宣布网站的网址直接绑定到详细的项目——jboss版本
花生壳公布,首先要有域名.然后激活域名,详细的公布就不说了,网上有非常多资料,这里是在jboss下直接将网址与详细的项目相应.做法有点不地道 假设跟图上一样配置的话.訪问网址相当于訪问的是http:/ ...
- CentOS7 防火墙 firewall-cmd
最小化安装 CentOS7 后,很多端口默认是不打开的,需要通过 firewall-cmd 把这些端口打开. 检查防火墙状态 # firewall-cmd --state running 关闭防 ...
- Linux-2.6.32内核编译流量计数器nfacct
最近一直想看到一本书<一个Jiegeng华>.而技术不依赖书.但是,这并不表示我IT技术没有兴趣.事实证明,,当我无法理解的沧桑.肮脏的领导者无法理解的心理.自我可惜无法理解它处处感受到脏 ...
- 第十六章——处理锁、阻塞和死锁(3)——使用SQLServer Profiler侦测死锁
原文:第十六章--处理锁.阻塞和死锁(3)--使用SQLServer Profiler侦测死锁 前言: 作为DBA,可能经常会遇到有同事或者客户反映经常发生死锁,影响了系统的使用.此时,你需要尽快侦测 ...
- Property 和 Attribute 的区别(转)
property 和 attribute非常容易混淆,两个单词的中文翻译也都非常相近(property:属性,attribute:特性),但实际上,二者是不同的东西,属于不同的范畴. property ...