博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AMQP浅谈
阅读量:4229 次
发布时间:2019-05-26

本文共 1471 字,大约阅读时间需要 4 分钟。

AMQP,高级消息队列协议(Advanced Message Queuing Protocol),是一个异步消息传递所使用的应用层协议规范,和JMS不同,JMS是一组API,而AMQP是一个规范,是一个二进制协议。

AMQP采用了分层的协议架构,共分为三层,包括Model Layer、Session Layer、Transport Layer,Model层定义了基本域模型(exchange、queue)产生的行为,Session层定义了客户端与broker(AMQP服务器端)之间的通信,为可靠传输提供保障,Thransport层专注于数据传输,并与Session层保持交互,接受上层的数据,将数据封装,加上一些label信息,组装成二进制流,到达receiver后再解析得到真实数据交付给Session层,在这个过程中,Transport层是没法接触到真实数据的,而且数据也应该是不可见的!

AMQP中提供了4中域模型:1,exchange、2,queue、3,bindings。

1,exchange其实就是一个路由,它有四种不同类型,采用不同的路由算法,它里面绑定了queue,记录下了这个queue得routing key,并转发Message,当Message到达时,首先会获取Message的routing key,然后它会在内部维护的一个路由表里面去匹配这个routing key,根据自身的路由算法,将Message发送到对应的queue;

2,queue,是消息的存储容器,接收消息,直到消息被receiver取走;

3,bindings,绑定器,将exchange和queue通过routing key连接起来,并且封装消息的路由信息。

还有两个比较重要的点:Connection、Channel,在下面的流程中来说:

整个传输流程是这样的:

首先客户端建立到服务器端(broker)的连接,然后发送Message到exchange,exchange获取Message的routing key,与内部的路由表匹配,将Message发送到对应的queue,而Receive则从queue中取走Message。

这里的连接其实是建立channel,它的完整过程是先在客户端和服务器端建立tcp连接(Connection),当客户端需要发送Message的时候,在tcp连接上面建立channel连接(Channel)用于Message的发送,因为对于OS来说,建立和关闭TCP连接是有代价的,频繁地建立关闭tcp连接对于系统性能的影响很大,而且tcp得连接数也有限制,这就限制了系统处理高并发的能力。但是,在tcp上建立channel是不存在这些的。

这里继续说receive从queue中取消息:一个Message到达queue中后,必须确保被正确收到。当没有receiver时,Message会被缓存,当有receiver时,会将queue发送到receiver上,保证正确接收。为了保证正确接收,通过ack。每个Message都要被acknowledge(ack,确认),当receiver接收到Message之后,会发送一个ack到queue,queue接收到ack之后,将Message从队列中移除。

4,Virtual hosts,它是一个虚拟概念,其实就是服务器端消息队列的一套服务,包括了exchange、queue、bindings等基本域及其一系列行为。

下一篇将讲述AMQP实现之--RabbitMQ

转载地址:http://jejqi.baihongyu.com/

你可能感兴趣的文章
Linux内核同步机制API函数:宏:spin_lock_init ( )
查看>>
driver_register 理解
查看>>
copy_from_user && copy_to_user
查看>>
device_register
查看>>
Android上C++对象的自动回收机制分析
查看>>
从spin_lock到spin_lock_irqsave
查看>>
sdio 驱动
查看>>
T-SQL中的聚合函数中的SUM()函数与AVG函数()
查看>>
T-SQL中的聚合函数(二)
查看>>
分组查询
查看>>
2021-06-04
查看>>
最长无重复子数组
查看>>
Dual-Primal Graph Convolutional Networks 对偶-原始图卷积神经网络
查看>>
GoGNN: Graph of Graphs Neural Network for Predicting Structured Entity Interactions
查看>>
Estimating Node Importance in Knowledge Graphs Using Graph Neural Networks
查看>>
DiffPool: Hierarchical Graph Representation Learning with Differentiable Pooling
查看>>
MuchGCN:Multi-Channel Graph Convolutional Networks
查看>>
kernel_size为1的卷积核与全连接层的关系
查看>>
STRATEGIES FOR PRE-TRAINING GRAPH NEURAL NETWORKS
查看>>
PAT_A 1010. Radix (25)
查看>>