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说明文档的更多相关文章

  1. RabbitMQ安装说明文档(超详细版本)

    RabbitMQ安装说明文档(超详细版本) 1. 安装依赖环境 在线安装依赖环境: yum install build-essential openssl openssl-devel unixODBC ...

  2. 【腾讯GAD暑期训练营游戏程序班】游戏场景管理作业说明文档

    场景管理作业说明文档                              用了八叉树的算法,测出三层时最快,区域范围内物体数量为21块,控制台打印出的结果如图所示: 场景物体:游戏中,所有具有空 ...

  3. 浏览器内核控制Meta标签说明文档

    浏览器内核控制Meta标签说明文档 原文链接 背景介绍 由于众所周知的情况,国内的主流浏览器都是双核浏览器:基于Webkit内核用于常用网站的高速浏览.基于IE的内核用于兼容网银.旧版网站.以360的 ...

  4. OAuth2.0说明文档

    OAuth2.0说明文档 1.OAuth 2.0 简介 OAuth为应用提供了一种访问受保护资源的方法.在应用访问受保护资源之前,它必须先从资源拥有者处获取授权(访问许可),然后用访问许可交换访问令牌 ...

  5. Net 通用权限管理系统源码 带数据库设计文档,部署说明文档

    Net 通用权限管理系统源码 带数据库设计文档,部署说明文档 包括数据库设计文档部署安装文档源码数据库文件 下载地址:http://www.mallhd.com/archives/1389

  6. SWFUpload 2.5.0版 官方说明文档 中文翻译版

    原文地址:http://www.cnblogs.com/youring2/archive/2012/07/13/2590010.html#setFileUploadLimit SWFUpload v2 ...

  7. 在Sharepoint 2010中启用Session功能的说明文档

    在Sharepoint 2010中启用Session功能的说明文档 开发环境:Windows 7系统,SharePoint Server 2010,Visual Studio 2010 按以下步骤进行 ...

  8. Highcharts选项配置详细说明文档(zz)

    http://www.helloweba.com/view-blog-156.html Highcharts提供大量的选项配置参数,您可以轻松定制符合用户要求的图表,目前官网只提供英文版的开发配置说明 ...

  9. Java基础(60):Java打包生成Jar和Javadoc说明文档,以及在另外的工程中导入和使用自己的Jar

    一.Jar包的导出 1.在Package Explorer中选中项目,右键,点击“Export”   2.在弹出框一次选择Java-->JAR file,点击Next   3.在新弹出的窗口选择 ...

随机推荐

  1. QT 4.7.6 驱动 罗技C720摄像头

    编译器: mingw32 gcc 4.8.1 mingw32 g++ 4.8.1 QT 版本: 4.8.6 OpenCV版本: 3.0.0 测试平台: win7 x64 --------------- ...

  2. IOS本地化应用

    BK项目已完成7788,在项目的后期需要被翻译成多国语言版.为了适应全球多个国家使用多个存储. 应用本地化是分别对字符串.图片和 xib 或 storyboard 文件本地化,而传统的做法是对 xib ...

  3. 升级iOS8系统后,保险箱Pro、私人保险箱、私密相冊打开就闪退的官方解决方式

    升级iOS8系统后,保险箱Pro.私人保险箱.私密相冊打开就闪退的官方解决方式   写在前面的话: 1.   本文适用条件    适用于:您的保险箱Pro.私人保险箱.私密相冊在iPhone或iPad ...

  4. Android访问服务器(TOMCAT)乱码引发的问题

    1.浏览器往服务器发送的请求主要可分为2种:get.post:delete.head等不赘述. GET方式: 从浏览器上直接敲地址,最大特点就是参数直接跟在地址后面. POST方式:表单提交等. 2. ...

  5. Atitit.Hibernate于Criteria 使用汇总and 关系查询 and 按照子对象查询 o9o

    Atitit.Hibernate于Criteria 使用总结and 关联查询 and 依照子对象查询 o9o 1. Criteria,,Criterion ,, 1 <2. 基本的对象黑头配置磊 ...

  6. web压力测试-pylot

    我已经写在使用前Web Bench做压力測试.http://blog.csdn.net/jacson_bai/article/details/41143713 但这个測试,測试结果非常好.缺点就是,无 ...

  7. hdu 4945 2048 (dp+组合的数目)

    2048 Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submi ...

  8. 达到HTTP合约Get、Post和文件上传功能——采用WinHttp介面

    于<采用WinHttp实现HTTP协议Get.Post和文件上传功能>一文中,我已经比較具体地解说了怎样使用WinHttp接口实现各种协议. 在近期的代码梳理中,我认为Post和文件上传模 ...

  9. C++四种类型的转换

    在C/C++使用的语言 (type) value(您还可以使用type(value))对于显式类型转换,经常提到投.转换程序猿的精度等完全掌握手,一个传统投往往是过度使用.成为C++要根源. 为了降低 ...

  10. 物理卷操作命令:pvcreate,pvscan,pvdisplay.卷组操作命令:vgcreate,vgdisplay. (转)

    新硬盘创建LVM系统过程. 物理卷操作命令:pvcreate,pvscan,pvdisplay. 卷组操作命令:vgcreate,vgdisplay. 逻辑卷操作命令:lvcreate,lvdispl ...