AMPQ

AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,
是`应用层协议的一个开放标准,为面向消息的中间件设计`。 由于AMQP是一个网络协议,所以发布者、消费者以及消息中间件可以部署到不同的物理机器上面。
消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。 基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品、不同开发语言等条件的限制。 AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。 AMQP在消息提供者和客户端的行为进行了强制规定,使得不同卖商之间真正实现了互操作能力。

交换器(exchange)

生产者生产消息至交换器之后,由交换器负责将消息转发出去。

根据交换器类型的不同,交换器将消息转发出去的转发规则也会有所不同。

目前,AMQP提供了四种不同的交换器类型:direct, fanout, topic, header

交换器还有许多属性可供设置。其中比较重要的属性有:name, durability, auto-delete, arguments

默认交换器
不指定交换器类型时,交换器默认是direct类型,其name属性为空。
并且默认交换器有一个重要的特性:
每个队列都会使用它的队列名字作为路由关键字(routing key)去自动地绑定到默认交换器上。
换言之,对于默认的交换器,无需用队列对其进行绑定操作,因为所有的队列都会自动的与之绑定。
消息会转发给与该路由关键字同名的队列中去。 direct类型
该类型的交换器在分发消息到指定队列时要求:
生产者生产某条消息时指定的路由关键字 X 与队列绑定到交换器上时指定的路由关键字 Y 完全一致,即X = Y。 多个队列可以使用相同的路由关键字与交换器绑定(多个X=Y)。这样一来,消息就会被分发至多个队列中。
但是,需要注意的是,消息负载均衡并不在于队列间,而是在于消费者间。 fanout类型
该类型的交换器会将消息转发给所有与之绑定的队列上。
比如,有N个队列与fanout交换器绑定,当产生一条消息时,交换器会将该消息的N个副本分别发给每个队列。类似于广播机制。 topic类型
该类型的交换器会视消息路由关键字和绑定路由关键字之间的匹配情况,进行消息的路由转发。
比如,消息路由关键字为x.y.z的消息会转发给绑定路由关键字为*.y.*的队列,也会转发给绑定路由关键字为x.#的队列,
但却不会转发给绑定路由关键字为*.a.*的队列。 headers类型
该类型的交换器不再是基于路由关键字(routing key)进行路由,而是基于多个属性进行路由的
用于路由的属性是取自于消息header属性的,当消息header的值与队列绑定时指定的值相同时,消息就会路由至相应的队列中。

队列(Queues)

AMQP模型中的队列用来存储消费者待消费的消息。

主要的属性有:name, durable, exclusive, auto-delete, arguments。

需要注意的是,队列在使用之前必须先声明。

  1. 声明之前,如果该队列不存在,那么声明之后就会创建一个队列;
  2. 如果该队列已经存在了,并且声明的队列与存在的队列属性相同,则不产生任何影响;
  3. 如果该队列已经存在了,但是声明的队列与存在的队列属性不同,则会抛出一个错误码为406(PRECONDITION_FAILED)的异常。
name属性
指定队列名,当应用程序指定name属性为空时,代理(broker)会自动地为其生成一个唯一的队列名。 durability属性
durability属性对应两种情况,分别是durable(持久的)和transient(短暂的)。
durable类型的队列会持久化至硬盘上,所以当代理(broker)重启之后,它依然存在。
相反地,当代理重启之后,transient类型的队列就消失了。 需要注意的是,队列的持久化是相对队列而言,对存储在持久化队列中的消息来说,当代理重启之后:队列还存在、消息则不存在。
所以,当broker重启之后,如果想让消息仍然存在,这就是消息持久化机制干的事了。 绑定(binding)
队列获取来自交换器的消息的前提是该队列必须先与交换器进行绑定。 如果生产者生产的某条消息,没有与之匹配的任何一个队列可供路由。
那么,根据该条消息的属性,该消息要么丢弃,要么返回至生产者。 连接(connection)
我们已经知道,AMQP是一个应用层协议,并且是基于TCP可靠传输的应用层协议。
除此之外,AMQP也提供了加密传输的机制(使用TSL或SSL),让消息传递更加安全。 通道(channel)
有的应用程序需要与AMQP broker建立多个连接。
在AMQP模型中,我们不需要通过建立太多的TCP连接来实现。
假如针对每一个AMQP连接都建立一个TCP连接的话,会占用大量的系统资源。
对此,AMQP提供了通道(channel)机制。即,共享一个TCP连接,可创建多个通道。 在多线程/进程的应用程序中正确做法是,对于每一个线程/进程,应分别建立一个通道,而不是多个线程/进程之间去共享一个通道。 虚拟机(virtual hosts)
AMQP使用了虚拟机的概念,在一个broker上面划分出多个隔离的环境(各环境下的用户、交换器以及队列等互不影响)。
这样一来,AMQP客户端们在进行连接的时候,需要协商指定同一个vhost才能进行正常的往来业务。 消息确认(message acknowledgements)
AMQP给出了两种处理办法:
一是,当消息代理(broker)将一条消息发送给消费者应用程序之后就将其从队列中移除;
二是,当消费者应用程序返还一条确认信息之后(类似于TCP三次握手中的ack确认)就将其从队列中移除。 第一种处理方法是自动确认的,称为automatic acknowledgement;
第二种处理方法则需要由消费者进行确认操作,称为explicit acknowledgement。 拒绝消息(rejecting messages) 消费者应用程序在处理消息失败时,应用程序可以通知broker:消息处理失败,拒绝消息。
当拒绝消息时,消费者应用程序可以要求broker丢弃或重新发送该消息。

AMPQ的更多相关文章

  1. AMPQ 0-9-1学习笔记

    AMQP 0-9-1学习笔记 AMQP(Advanced Message Queuing Protocol)高级消息队列协议:是一个进程间传递异步消息的网络协议 2. AMQP的基本模型: Publi ...

  2. RabbitMQ框架构建系列(一)——AMPQ协议

    一.MQ 在介绍RabbitMq之前,先来说一下MQ.什么是MQ?MQ全称为Message Queue即消息队列,就是一个消息的容器, MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入 ...

  3. Openstack入坑指南

    什么是云计算 概念 云计算是一种基于互联网的计算方式,通过这种方式,共享的软硬件资源和信息,可以按需求提供给计算机和其他设备.用户不需要了解”云“中的基础设施细节,不必具有相应的专业知识,也无需直接控 ...

  4. windows下的php rabbit mq安装、配置

    http://www.cnblogs.com/shanyou/p/4067250.html 这篇博文写的rabbit mq和erlang的安装以及rabbitmq可视化插件的一些操作 接下去开始安装P ...

  5. rabbitMQ+php

    RabbitMQ与PHP(一) 项目中使用RabbitMQ作为队列处理用户消息通知,消息由前端PHP代码产生,处理消息使用Python,这就导致代码一致性问题,调整消息定义时需要PHP和Python都 ...

  6. ActiveMQ;RabbitMQ;ZeroMQ

    中间件类型: Embedded middleware: As the name suggests, this typeof middleware handles embedded applicatio ...

  7. VMP虚拟机加壳的原理学习

    好久没有到博客写文章了,9月份开学有点忙,参加了一个上海的一个CHINA SIG信息比赛,前几天又无锡南京来回跑了几趟,签了阿里巴巴的安全工程师,准备11月以后过去实习,这之前就好好待在学校学习了. ...

  8. ADF_Data Binding系列2_使用URL Service Data Control

    2015-02-16 Created By BaoXinjian

  9. fw: openstack

    OpenStack既是一个社区,也是一个项目和一个开源软件,它提供了一个部署云的操作平台或工具集.其宗旨在于,帮助组织运行为虚拟计算或存储服务的云,为公有云.私有云,也为大云.小云提供可扩展的.灵活的 ...

随机推荐

  1. A1075 PAT Judge (25 分)

    The ranklist of PAT is generated from the status list, which shows the scores of the submissions. Th ...

  2. jquery操作html元素之(添加元素)

    添加新的 HTML 内容 我们将学习用于添加新内容的四个 jQuery 方法: append() - 在被选元素的结尾插入内容 prepend() - 在被选元素的开头插入内容 after() - 在 ...

  3. 大道浮屠诀---NBU报错代码之status2

    在一次windows2008R2系统上部署7.7.3备份过程中遇到了此报错 当备份catalog时,会出现status 2报错 经过一系列排查后,得出如下解决方法 1.任务进程中有大量的nbtelem ...

  4. Spring 基于xml配置方式的事务(14)

    参考前面的声明式事务的例子:http://www.cnblogs.com/caoyc/p/5632198.html 我们做了相应的修改.在dao中和service中的各个类中,去掉所有注解标签.然后为 ...

  5. 【转】WebResource实现在自定义控件中内嵌JS文件

    在类库中的资源  其他项目中要使用 需要嵌入才行 参考文献:WebResource实现在自定义控件中内嵌JS文件 1. WebResource简介 ASP.NET(1.0/1.1)给我们提供了一个开发 ...

  6. 常用指令linux总结

    linux的基础操作命令: 常见命令: man 查看帮助文档 用法:man + 命令 help 查看指定命令的用法 用法: 命令 --help(有空格) tab linux下命令与文件名补全 用法:在 ...

  7. 4、Docker网络访问

    现在我们已经可以熟练的使用docker命令操作镜像和容器,并学会了如何进入到容器中去,那么实际的工作中,我们通常是在Docker中部署服务,我们需要在外部通过IP和端口进行访问的,那么如何访问到Doc ...

  8. Python全栈开发:django网络框架(二)

    Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行 ...

  9. https://vjudge.net/contest/321565#problem/C 超时代码

    #include <iostream> #include <cstdio> #include <queue> #include <algorithm> ...

  10. Mysql ---Sqlserver数据迁移到Mysql(Mysql建表迁移数据)

    1 试用了MysqlWorkBench的数据迁移功能 以为能实现:建立跟Sqlserver一样的表结构和视图的功能,sqlserver的数据迁移到mysql 实际上发现:即使勾选了表和视图,实际上却只 ...