高级消息队列协议AMQP简介

作者:天方 时间:2022-11-01 09:39:07 

历史:

Message Queue的需求由来已久,80年代最早在金融交易中,高盛等公司采用Teknekron公司的产品,当时的Message queuing软件叫做:the information bus(TIB)。 TIB被电信和通讯公司采用,路透社收购了Teknekron公司。之后,IBM开发了MQSeries,微软开发了Microsoft Message Queue(MSMQ)。这些商业MQ供应商的问题是厂商锁定,价格高昂。2001年,Java Message queuing试图解决锁定和交互性的问题,但对应用来说反而更加麻烦了。

于是2004年,摩根大通和iMatrix开始着手Advanced Message Queuing Protocol (AMQP)开放标准的开发。2006年,AMQP规范发布。2007年,Rabbit技术公司基于AMQP标准开发的RabbitMQ 1.0 发布。

基本概念

AMQP基本模型如下图所示:    

高级消息队列协议AMQP简介

Broker:

接收和分发消息的应用,如RabbitMQ Server就是Message Broker。

Virtual host:

出于多租户和安全因素设计的,把AMQP的基本组件划分到一个虚拟的分组中,类似于网络中的namespace概念。

Exchange

交换器是消息送达的实体。他是具名的,它是消息的第一站。系统根据分发规则,匹配查询表中的routing key,分发消息到queue中去。

属性:

  • durable:该交换器将在broker重启后生效。

  • auto-delete:该交换器将在没有消息队列绑定时自动删除。一个从未绑定任何队列的交换器不会自动删除。

类型:

  • direct (point-to-point)

  • fanout (multicast)

  • topic (publish-subscribe)

Queue

队列是接收消息的实体,具有名字和属性,但没有类型。客户端可以订阅队列以便使broker递送某消息队列的内容到该客户端。

属性:

  • alternate-exchange :当消息被订阅者拒绝或者由于队列被删除而孤立时则被送往此交换器,同时队列中的该消息被删除。

  • passive :当队列不存在时会抛出一个错误信息,仍然不会被声明。

  • durable :队列将在broker重启时启动。

  • exclusive :队列仅服务于一个客户端。

  • auto-delete :队列在没有活跃订阅者的时候将自动删除。当客户端终结时,exclusive类型的队列则一定会自动删除。

Binding

绑定是队列和交换器之间的关系,规定消息如何由交换器到队列。绑定的属性被交换器用来与路由算法匹配。

当一个消息的路由关键字与绑定中的模式匹配时,交换器会把该消息的拷贝送达队列。如何进行匹配仅依赖于交换器的类型:

  • direct型 :消息的路由关键字与绑定相同。

  • fanout型 :总是匹配,即使绑定无关键字。

  • topic型 :匹配路由关键字属性,字符串的各个部分以'.'分隔。可包含两个特殊字符:'*'表示单个任意词,'#'表示0个或多个词,例如 *.stock.# 匹配usd.stock和eur.stock.db,但不匹配stock.nasdaq。

  • headers型 :匹配各个键-值对的逻辑组合结果。

Connection:

publisher/consumer和broker之间的TCP连接。断开连接的操作只会在client端进行,Broker不会断开连接,除非出现网络故障或broker服务出现问题。

Channel:

如果每一次访问RabbitMQ都建立一个Connection,在消息量大的时候建立TCP Connection的开销将是巨大的,效率也较低。

Channel是在connection内部建立的逻辑连接,如果应用程序支持多线程,通常每个thread创建单独的channel进行通讯,AMQP method包含了channel id帮助客户端和message broker识别channel,所以channel之间是完全隔离的。Channel作为轻量级的Connection极大减少了操作系统建立TCP connection的开销。

来源:https://www.cnblogs.com/TianFang/p/10119776.html

标签:高级,消息,队列,协议,AMQP
0
投稿

猜你喜欢

  • 详解Python开发语言中的基本数据类型

    2022-12-11 20:13:35
  • 利用Python库Scapy解析pcap文件的方法

    2021-07-26 12:59:01
  • 关于Flask项目无法使用公网IP访问的解决方式

    2021-01-03 10:04:00
  • MySQL Community Server 8.0.29安装配置方法图文教程

    2024-01-22 12:02:55
  • Node.js学习入门

    2024-05-13 09:58:37
  • 利用Python将彩色图像转为灰度图像的两种方法

    2021-02-06 05:28:54
  • python 正则表达式的使用

    2022-02-16 15:29:09
  • python使用hdfs3模块对hdfs进行操作详解

    2023-10-30 07:12:03
  • 基于TensorFlow的CNN实现Mnist手写数字识别

    2022-03-13 11:20:28
  • vue+echarts实现动态折线图的方法与注意

    2023-07-02 16:29:06
  • 在Pandas中处理NaN值的方法

    2021-05-31 05:37:22
  • windows系统下Python环境的搭建(Aptana Studio)

    2021-03-16 20:40:37
  • js模态对话框使用方法详解

    2024-04-19 10:46:22
  • Python实现在线暴力破解邮箱账号密码功能示例【测试可用】

    2023-09-05 17:01:42
  • 使用NumPy读取MNIST数据的实现代码示例

    2021-08-05 19:17:52
  • python封装对象实现时间效果

    2022-10-30 16:14:01
  • 2022最新腾讯轻量云 debian 10 安装pve教程详解

    2022-09-16 15:55:38
  • IE7下动态创建Iframe时,去除边框的办法

    2009-01-19 13:56:00
  • JavaScript 禁止用户保存图片的实现代码

    2024-04-28 09:48:11
  • Python发送邮件的实例代码讲解

    2021-06-05 02:35:10
  • asp之家 网络编程 m.aspxhome.com