AMPQ
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。
需要注意的是,队列在使用之前必须先声明。
- 声明之前,如果该队列不存在,那么声明之后就会创建一个队列;
- 如果该队列已经存在了,并且声明的队列与存在的队列属性相同,则不产生任何影响;
- 如果该队列已经存在了,但是声明的队列与存在的队列属性不同,则会抛出一个错误码为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的更多相关文章
- AMPQ 0-9-1学习笔记
AMQP 0-9-1学习笔记 AMQP(Advanced Message Queuing Protocol)高级消息队列协议:是一个进程间传递异步消息的网络协议 2. AMQP的基本模型: Publi ...
- RabbitMQ框架构建系列(一)——AMPQ协议
一.MQ 在介绍RabbitMq之前,先来说一下MQ.什么是MQ?MQ全称为Message Queue即消息队列,就是一个消息的容器, MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入 ...
- Openstack入坑指南
什么是云计算 概念 云计算是一种基于互联网的计算方式,通过这种方式,共享的软硬件资源和信息,可以按需求提供给计算机和其他设备.用户不需要了解”云“中的基础设施细节,不必具有相应的专业知识,也无需直接控 ...
- windows下的php rabbit mq安装、配置
http://www.cnblogs.com/shanyou/p/4067250.html 这篇博文写的rabbit mq和erlang的安装以及rabbitmq可视化插件的一些操作 接下去开始安装P ...
- rabbitMQ+php
RabbitMQ与PHP(一) 项目中使用RabbitMQ作为队列处理用户消息通知,消息由前端PHP代码产生,处理消息使用Python,这就导致代码一致性问题,调整消息定义时需要PHP和Python都 ...
- ActiveMQ;RabbitMQ;ZeroMQ
中间件类型: Embedded middleware: As the name suggests, this typeof middleware handles embedded applicatio ...
- VMP虚拟机加壳的原理学习
好久没有到博客写文章了,9月份开学有点忙,参加了一个上海的一个CHINA SIG信息比赛,前几天又无锡南京来回跑了几趟,签了阿里巴巴的安全工程师,准备11月以后过去实习,这之前就好好待在学校学习了. ...
- ADF_Data Binding系列2_使用URL Service Data Control
2015-02-16 Created By BaoXinjian
- fw: openstack
OpenStack既是一个社区,也是一个项目和一个开源软件,它提供了一个部署云的操作平台或工具集.其宗旨在于,帮助组织运行为虚拟计算或存储服务的云,为公有云.私有云,也为大云.小云提供可扩展的.灵活的 ...
随机推荐
- 史上最全Html和CSS布局技巧
单列布局水平居中 水平居中的页面布局中最为常见的一种布局形式,多出现于标题,以及内容区域的组织形式,下面介绍四种实现水平居中的方法(注:下面各个实例中实现的是child元素的对齐操作,child元 ...
- linux使用nmon监控、分析系统性能
linux使用nmon监控.分析系统性能 一.概述 nmon是一种在AIX与各种Linux操作系统上广泛使用的监控与分析工具,相对于其它一些系统资源监控工具来说,nmon所记录的信息是比较全面的, ...
- 22-MySQL-Ubuntu-备份与恢复
案例: 将数据库jing_dong_1的数据库备份,然后恢复到数据库jing_dong_2; 步骤如下: 1.备份 注意: mysqldump 不是 mysql; 尖括号的方向; python.sql ...
- Git查看历史记录的几种方法
- java内存模型和垃圾回收
摘抄并用于自查 JVM内存模型 1. Java程序具体执行的过程: Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀) 由JVM中的类加载器加载各个类的字节码文 ...
- arc098E Range Minimum Queries
题意:给你一个n个数的数组,每次能够选取连续的长度为K的子序列,取出其中任意一个最小元素. 一共操作Q次.问取出的元素中Max-Min最小是多少? 标程: #include<bits/stdc+ ...
- SQL Server - SQL Server/ bcp 工具如何通信
问题-BCP通讯 ref: https://stackoverflow.com/questions/40664708/bcp-cannot-connect-to-aws-sql-server-but- ...
- [JZOJ3234] 阴阳
题目 题目大意 有一棵树,每条边有\(0\)或\(1\)两种颜色. 求满足存在\((u,v)\)路径上的点\(x\)使得\((u,x)\)和\((x,v)\)路径上的两种颜色出现次数相同的点对\((u ...
- 解析Mybatis入门第二天
入门第二天 目的:使用Mybatis对数据库中的数据进行简单的操作.例如:增.删.改.查. 前言:同样是使用idea创建一个普通的maven工程(如何创建一个普通的Maven工程可以参考入门第一天的详 ...
- java中的break continue
break语句 在任何循环语句的主体部分,均可用break控制循环的流程.break用于强行退出循环,不执行循环中剩余的语句.(break语句也在switch语句中使用) public class B ...