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. cocos2d-x-3.1在eclipse中的环境搭建

    cocos2d-x-3.0出来后,到如今3.1. 自己在eclipse配置上走了不少弯路,记下来给大家方便,给自己方便. 前提条件: * Android NDK * Android SDK **OR* ...

  2. 慎重使用MySQL auto_increment

    在使用MySQL中,常常会在表中建立一个自增的ID字段,利用自增ID可以高速建立索引,也是MySQL官方比較推荐的一种方式,可是,这样的方式在大量数据且配置主从时,可能会出现因为自增ID导致同步失败的 ...

  3. 在C#环境中动态调用IronPython脚本(二)

    一.Python数据类型与C#数据类型的对应 Python中数据类型中的简单类型,例如int,float,string可以对应到C#环境中的int32,double,string,这些对应比较直观,P ...

  4. 《数字图像处理原理与实践(MATLAB文本)》书代码Part7

    这篇文章是<数字图像处理原理与实践(MATLAB文本)>一本书的代码系列Part7(由于调整先前宣布订单,请读者注意分页程序,而不仅仅是基于标题数的一系列文章),第一本书特色186经225 ...

  5. .NET读写Excel工具Spire.Xls使用(1)入门介绍

    原文:[原创].NET读写Excel工具Spire.Xls使用(1)入门介绍 在.NET平台,操作Excel文件是一个非常常用的需求,目前比较常规的方法有以下几种: 1.Office Com组件的方式 ...

  6. AspUpload组件的安装及使用方法介绍

    http://soft.huweishen.com/soft/47.html AspUpload对ASP编程人员来说要实现ASP网站文件上传功能它是首选.本文就为大家介绍一下AspUpload组件的安 ...

  7. 单链表---java实现

    单链表优点:1.不需要预先给出元素个数. 2.单链表插入删除时不需要移动数据元素. 单链表缺点:1.每个节点有指针,空间利用率低. 2.单链表不支持随机读取数据. Node.java package ...

  8. rhel6使用的版本数部分intel xeon处理器时间bug

    可惜在总前几天"oracle操作和维护的高级别小组"于.BBQ 上帝说,大量RHEL的bug.这bug在这个例子中,下面的URL: https://access.redhat.co ...

  9. 图片切割工具---产生多个div切割图片 采用for和一的二维阵列设置背景位置

    照片库 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb21vZ2c=/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  10. TextView于getCompoundDrawables()使用演示样本的方法

    MainActivity例如下列: package cc.testcompounddrawables; import android.app.Activity; import android.grap ...