AMQP协议

AMQP: Advanced Message Queue,高级队列协议。

特征:

  • 这是一个在进程间传递异步消息的网络协议,因此数据的发送方、接收方以及容器(MQ)都可以在不同的设备上。
  • 主要特征是面向消息、队列、灵活的路由、可靠性、安全性等
  • 支持符合要求的客户端和消息中间件代理之间进行通信,并不受产品、开发语言的限制

RabbitMQ

rabbitMQ是AMQP协议的erlang语言的实现,那么rabbitmq具有哪些特征呢?

  • 可靠性 RabbitMQ使用一些机制来保证可靠性,比如持久化,发布确认、消费确认等;
  • 灵活的路由 Rabbitmq使用exchange来将消息路由到各个队列,对于典型的路由功能,Rabbitmq已经通过一些内置的exchange实现,对于复杂的路由功能,可以采用绑定多个exchange或者使用插件的方式处理;
  • 消息集群 主要是以主从的方式构成集群,可以有普通模式和镜像模式;
  • 高可用 主要是指镜像模式,通过在每个node上复制queue数据达到高可用的目的;
  • 多种协议 Rabbitmq不仅支持AMQP协议,还支持STOMP/MQTT等协议;
  • 多语言客户端 Rabbitmq支持java/php/.net等多语言客户端;
  • 管理界面 通过manage界面,可以直观的查看broker、exchange、channel、queue等多项信息以及可以进行配置;
  • 跟踪机制 使用者可以追踪异常消息出现的原因
  • 插件机制 Rabbitmq提供了很多插件,可以从多方面进行扩展,也可以自行编写插件;

RabbitMQ工作流程图

rabbitMQ的工作流程简言之就是,消息发送者将消息发送到交换机(Exchange)中,交换机通过routing_key将消息路由到绑定的队列中,队列再将消息发送给每个链接到当前队列的消费者。

概念介绍

基于上述的流程图,对RabbitMQ中各个组件进行介绍。

生产者(Publisher)

消息的生产者,就是一个向交换机发布消息的客户端应用程序。

消息(Message)

消息,包含消息头和消息体,消息体是不透明的,只有接收到消息的消费者才知道消息体的具体内容,而消息头是由一系列的属性构成的,这些属性包含routing-key(路由键)、priority(优先级)、delivery-mode(消息是否需要持久化存储)等内容,消息头中的属性有的是对exchange透明的,有的则是非透明的。

AMQP中对于消息的大小没有做限制,客户端和RabbitMQ服务端的最大帧是128k,此时如果消息过大底层就会频繁拆包组包,从而有可能导致mq服务端down掉,因此不建议消息过大。

broker

AMQP的服务端被称为broker,broker就是接收和分发消息的应用,也就是说RabbitMQ server就是broker。

虚拟主机(Virtual Host)

虚拟主机,一个broker可以有多个VH,单个VH中有独立的exchange、queue等内容,主要用作不同用户之间的权限分离,生产环境可以使用不同的VH来区分不同的应用。

交换机(Exchange)

交换机用来接收生产者发送的消息,并且根据royting_key将消息路由到绑定的不同队列中。交换机主要有fanout、direct、topic、headers等几种类型,后面再详细介绍这几种交换机。

交换机不用来存储数据,只是用来路由消息到队列。

队列(Queue)

队列才是最终保存消息并且发送给消费者的位置,一个消息可以被投递到一个或者多个队列。

声明队列时,几个常用属性如下:

  • name 队列名称,不设置时自动生成队列名称
  • durable 队列是否持久化,默认false
  • exclusive 默认false,为true时表示只有一个connection使用该队列,且该connection断开后自动删除队列
  • autodelete 自动删除,默认false,为true时表示当没有消费者连接队列时,队列自动删除
  • priority 优先级,官方建议1-10,数值越大消息越早被消费

绑定(Binding)

队列和交换机之间的关系叫做绑定,一个绑定就是基于路由键将交换机和队列连接起来的路由规则。

routing_key和binding_key

routing_key: 路由键,生产者发送消息时设置,消息从交换机路由到队列的依据;

binding_key: 队列绑定交换机的依据,也是消息从交换机路由到队列的依据,消息从交换机路由到队列时routing_key和binding_key必须匹配(根据交换机不同,匹配规则也不相同)。

routing_key和binding_key最大长度都是255个字节。

连接(Connection)

网络连接,也可以说是tcp连接

信道(Channel)

信道是建立在Connection内部的虚拟连接,AMQP命令都是通过信道发送出去的,不管是发布消息还是接收消息,这些动作都是通过信道完成的。

之所以要有信道是由于操作系统tcp连接的创建和销毁都是很大的负担,如果使用高峰期时会有性能瓶颈,在Connection内部创建虚拟的信道,多个信道可以复用单个Connection可以有效地节约tcp资源。但是当单个信道的流量很大时,此时单个Connection就会出现性能瓶颈,此时需要根据业务需要开辟多个Connection,将这些channel均匀分布在这些Connection中。

一个Connection中可以存在65536个channel.

总结

本文主要简单描述了一下AMQP协议和RabbitMQ的一些特征以及Rabbitmq中一些组件的简单介绍,下一篇将介绍Rabbitmq和SpringBoot的集成以及四种交换机类型.

rabbitmq概念简介的更多相关文章

  1. 【Machine Learning】机器学习及其基础概念简介

    机器学习及其基础概念简介 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  2. java 并发多线程显式锁概念简介 什么是显式锁 多线程下篇(一)

    目前对于同步,仅仅介绍了一个关键字synchronized,可以用于保证线程同步的原子性.可见性.有序性 对于synchronized关键字,对于静态方法默认是以该类的class对象作为锁,对于实例方 ...

  3. Java多线程概念简介 多线程中篇(一)

    Java的线程与操作系统的线程   在线程的相关介绍中,有讲到“线程的实现”分为三种:内核支持,用户级以及两者混合.(这只是一种简要的分类) Java线程在JDK1.2之前,是用户线程实现的 而在JD ...

  4. 转:WebGL、Asm.js和WebAssembly概念简介

    WebGL.Asm.js和WebAssembly概念简介 转:http://www.techbrood.com/zh/news/webgl/webgl%E3%80%81asm_js%E5%92%8Cw ...

  5. RabbitMQ (一) 简介和基本概念

    原文:https://blog.csdn.net/vbirdbest/article/details/78577043 一.简介 MQ全称为Message Queue, 消息队列(MQ)是一种应用程序 ...

  6. RabbitMQ 概念与Java例子

    RabbitMQ简介 目前RabbitMQ是AMQP 0-9-1(高级消息队列协议)的一个实现,使用Erlang语言编写,利用了Erlang的分布式特性. 概念介绍: Broker:简单来说就是消息队 ...

  7. NSIS打包(一)常用概念简介

    1.NSIS简介 官网:http://sourceforge.net/projects/nsis/ 维基百科: http://zh.wikipedia.org/wiki/Nullsoft%E8%85% ...

  8. RabbitMQ 概念

    RabbitMQ快速概念入门 转(http://blog.csdn.net/qq_16414307/article/details/50585630) 本文适有一定消息队列基础的,但没有接触过Ra ...

  9. 【rabbitmq】rabbitmq概念解析--消息确认--示例程序

    概述 本示例程序全部来自rabbitmq官方示例程序,rabbitmq-demo: 官方共有6个demo,针对不同的语言(如 C#,Java,Spring-AMQP等),都有不同的示例程序: 本示例程 ...

随机推荐

  1. python基础之迭代器、生成器、装饰器

    一.列表生成式 a = [0,1,2,3,4,5,6,7,8,9] b = [] for i in a: b.append(i+1) print(b) a = b print(a) --------- ...

  2. 调试备忘录-SWD协议解析

    目录--点击可快速直达 目录 写在前面 1  SWD协议简介 2  SWD物理层协议解析 2.1  SWD通信时序分析 2.2  SWD 寄存器简介 2.2.1  DP寄存器 2.2.2  AP寄存器 ...

  3. C 语言通用模板队列

    前言 嵌入式开发过程中,各个模块之间,各个设备之间进行交互时,都会存在数据的输入输出,由于处理的方式不同,数据不会立即同步处理,因此通常在设计时都会设计缓冲区进行数据的处理,方式数据丢失等问题:一个项 ...

  4. Django 自定义表名和字段名

    Django 自定义表名和字段名 通过db_table和db_column自定义数据表名和字段名 假如你的数据库里已经有了一张数据表,且该表包含多个字段,你希望通过Django直接访问该数据表的各个字 ...

  5. Go语言web开发---Beego基础

    一.框架 框架:可复用的设计组件,它规定了应用的体系结构,明确了整个设计,协作各个组件之间的依赖关系,责任分配,和流程控制.通俗解释框架就是一堆代码的集合,为了提高软件的开发效率和质量,一般都会使用框 ...

  6. AlexeyAB DarkNet YOLOv3框架解析与应用实践(二)

    AlexeyAB DarkNet YOLOv3框架解析与应用实践(二) 版本3有什么新功能? YOLOv3使用了一些技巧来改进训练和提高性能,包括:多尺度预测.更好的主干分类器等等.全部细节都在我们的 ...

  7. NVIDIA® TensorRT™ supports different data formats

    NVIDIA TensorRT supports different data formats NVIDIATensorRT公司 支持不同的数据格式.需要考虑两个方面:数据类型和布局.         ...

  8. Charles下载及安装破解-自己编辑

    Charles下载地址 地址:https://www.charlesproxy.com/latest-release/download.do 2. Charles破解 破解地址:https://www ...

  9. UiPath中恢复依赖项失败的解决方法

    目录 序言 正文 什么是依赖包? 如何查看项目使用了哪些版本的依赖包? 一.项目内查看 二.查看项目的 JSON 文件 问题根源 解决方法 一.「等」字诀 二.切换网络环境(根治) 三.手动复制依赖包 ...

  10. 【NX二次开发】 获取体的面 UF_MODL_ask_body_faces

    获取体的面 1 extern DllExport void ufsta(char *param, int *returnCode, int rlen) 2 { 3 UF_initialize(); 4 ...