• Welcome to the world's largest Chinese hacker forum

    Welcome to the world's largest Chinese hacker forum, our forum registration is open! You can now register for technical communication with us, this is a free and open to the world of the BBS, we founded the purpose for the study of network security, please don't release business of black/grey, or on the BBS posts, to seek help hacker if violations, we will permanently frozen your IP and account, thank you for your cooperation. Hacker attack and defense cracking or network Security

    business please click here: Creation Security  From CNHACKTEAM

Recommended Posts

1. AMQP

AMQP(Advanced Message Queuing Protocol,高级消息队列协议)是应用层标准的高级消息队列协议,提供统一的消息服务,是应用层协议的开放标准,是为面向消息的中间件设计的。基于该协议的客户端和消息中间件可以传递消息,不受客户端/中间件的同一产品和不同开发语言的限制。

AMQP协议是一种减少耦合的机制,它基于一种独立于上层产品和语言的协议。它是一个二进制协议,在客户端应用程序和消息中间件之间提供多通道、协商、异步、安全、中立和高效的交互。总体而言,AMQP协议可分为两层:

apqnw0cajep2841.jpg

Functional Layer

功能层,位于协议的上层,主要定义了一组命令(基于功能的逻辑分类),用于应用调用自身所需的业务逻辑。例如,应用程序可以定义队列名称,向指定的队列生成消息,使用指定的队列消息,等等。通过功能层(消息队列模型)。

Transport Layer

传输层,基于二进制数据流传输,用于将应用调用的指令发送回服务器,并返回结果。同时可以处理通道复用、帧处理、内容编码、心跳传输、数据传输和异常处理。传输层可以用任何传输代替,只要不改变应用可见的功能层的相关协议,就可以使用相同的传输层和不同的高级协议。

AMQ Model 架构

l4fvubihuhr2842.jpg

作为中间服务,AMQ将消息的生产和消费分开。当消息生产者异常时,不会影响消费者对消息的消费。当消费者异常时,生产者产生的消息可以存储在服务的内存或磁盘中,不会影响消费率。同时,可以根据路由规则将消息传递给指定的消费者进行消费。

AMQ通过基于模块化的交换和消息队列相结合的方式实现消息路由和分发;

交换:

消息可以传递到指定的消息队列;基于消息生产者和路由规则;

消息队列:

可以存储发送的消息并将消息转发给消费者;

邮件队列和Exchange邮件队列之间存在绑定关系。消息到达Exchange后,可以根据基于路由策略的路由策略传递到绑定的消息队列。

Message Queue

消息队列将消息存储在内存或磁盘中,并按照一定的顺序转发给一个或多个消费者。每个消息队列都是独立隔离的,互不影响。

消息队列有不同的属性:私有、共享、持久、临时、客户端定义或服务器端定义等。可以根据实际需要选择相应的类型,以RabbitMQ队列特征为例:

共享持久消息队列:将发送的消息存储到磁盘,然后将消息转发给订阅该队列的所有消费者;

临时消息队列:RabbitMQ支持rpc调用。在重新调用过程中,使用者会临时生成一个消息队列,该队列只对当前使用者可见,由服务器生成。调用后,队列将被销毁。

Exchange

接收到交换机生产者交付的消息后,根据路由规则和队列绑定关系,匹配到相应的交换机或队列进行分发。交换机不存储消息,只转发消息。

AMQP定义了许多标准交换机类型,基本上涵盖了消息传递所需的路由类型。通常,AMQP服务器会提供根据开关类型命名的默认开关,AMQP应用程序也可以创建自己的开关来绑定指定的消息队列以发布消息。

消息的流转过程

0yssb0ufqpd2843.jpg

消息生命周期

消息主要由属性和消息内容组成。创建消息时,生产者可以为消息设置属性和消息内容,在消息上标记路由信息,并将消息发送到指定的交换机。

当报文到达交换机时,交换机将根据路由规则判断报文是否可以转发。如果不能转发,就会丢弃消息,反馈给生产者。

交换机可以根据路由规则将消息传递给一个或多个。

消息队列,服务器通过复制或者计数器的方式将消息保存到不同队列中,每个队列中的消息内容是相同的,但是操作是隔离的,相互不影响。

当消息到达消息队列后,消息队列会基于 AMQP 协议投递给消费者,如果无法投递给消费者或者没有消费者,消息将在内存或者磁盘中存储,等待消费者。

当消息队列可以将消息传递给消费者时,消息将从其内部缓冲区中删除。 删除操作可能立刻执行也可以再消费者确认消息消费后再执行,删除策略消费者可以选择。

生产消息投递确认和消费消息消费确认可以作为两个事务,然后提交或者回滚事务。

2.RabbitMQ简介

RabbitMQ是一款使用Erlang语言开发的,实现AMQP(高级消息队列协议)的开源消息中间件。首先要知道一些RabbitMQ的特点,官网可查:

  • 可靠性。支持持久化,传输确认,发布确认等保证了MQ的可靠性。
  • 灵活的分发消息策略。这应该是RabbitMQ的一大特点。在消息进入MQ前由Exchange(交换机)进行路由消息。分发消息策略有:简单模式、工作队列模式、发布订阅模式、路由模式、通配符模式。
  • 支持集群。多台RabbitMQ服务器可以组成一个集群,形成一个逻辑Broker。
  • 多种协议。RabbitMQ支持多种消息队列协议,比如 STOMP、MQTT 等等。
  • 支持多种语言客户端。RabbitMQ几乎支持所有常用编程语言,包括 Java、.NET、Ruby 等等。
  • 可视化管理界面。RabbitMQ提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker。
  • 插件机制。RabbitMQ提供了许多插件,可以通过插件进行扩展,也可以编写自己的插件。

RabbitMQ应用

排队算法 : 使用消息队列特性

秒杀活动 : 使用消息队列特性

消息分发 : 使用消息异步特性

异步处理 : 使用消息异步特性

数据同步 : 使用消息异步特性

处理耗时任务 : 使用消息异步特性

流量销峰

RabbitMQ原理

ppzvmq1h5a12844.jpg

1.Message
消息。消息是不具名的,它由消息头消息体组成。消息体是不透明的,而消息头则由一系列可选属性组成,这些属性包括:routing-key(路由键)、priority(相对于其他消息的优先权)、delivery-mode(指出消息可能持久性存储)等。
2.Publisher
消息的生产者。也是一个向交换器发布消息的客户端应用程序。
3.Consumer
消息的消费者。表示一个从消息队列中取得消息的客户端应用程序。
4.Exchange
交换器。用来接收生产者发送的消息并将这些消息路由给服务器中的队列。三种常用的交换器类型1. direct(发布与订阅 完全匹配)2. fanout(广播)3. topic(主题,规则匹配)
5.Binding
绑定。用于消息队列和交换器之间的关联。一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则,所以可以将交换器理解成一个由绑定构成的路由表。
6.Queue
消息队列。用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者链接到这个队列将其取走。
7.Routing-key
路由键。RabbitMQ决定消息该投递到哪个队列的规则。(也可以理解为队列的名称,路由键是key,队列是value)队列通过路由键绑定到交换器。消息发送到MQ服务器时,消息将拥有一个路由键,即便是空的,RabbitMQ也会将其和绑定使用的路由键进行匹配。如果相匹配,消息将会投递到该队列。如果不匹配,消息将会进入黑洞。
8.Connection
链接。指rabbit服务器和服务建立的TCP链接。
9.Channel
信道。1,Channel中文叫做信道,是TCP里面的虚拟链接。例如:电缆相当于TCP,信道是一个独立光纤束,一条TCP连接上创建多条信道是没有问题的。2,TCP一旦打开,就会创建AMQP信道。3,无论是发布消息、接收消息、订阅队列,这些动作都是通过信道完成的。
10.Virtual Host
虚拟主机。表示一批交换器,消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个vhost本质上就是一个mini版的RabbitMQ服务器,拥有自己的队列、交换器、绑定和权限机制。vhost是AMQP概念的基础,必须在链接时指定,RabbitMQ默认的vhost是/
11.Borker
表示消息队列服务器实体。
12.交换器和队列的关系
交换器是通过路由键和队列绑定在一起的,如果消息拥有的路由键跟队列和交换器的路由键匹配,那么消息就会被路由到该绑定的队列中。 也就是说,消息到队列的过程中,消息首先会经过交换器,接下来交换器在通过路由键匹配分发消息到具体的队列中。 路由键可以理解为匹配的规则。
13.RabbitMQ为什么需要信道?为什么不是TCP直接通信?
1. TCP的创建和销毁开销特别大。创建需要3次握手,销毁需要4次分手。2. 如果不用信道,那应用程序就会以TCP链接Rabbit,高峰时每秒成千上万条链接会造成资源巨大的浪费,而且操作系统每秒处理TCP链接数也是有限制的,必定造成性能瓶颈。3. 信道的原理是一条线程一条通道,多条线程多条通道同用一条TCP链接。一条TCP链接可以容纳无限的信道,即使每秒成千上万的请求也不会成为性能的瓶颈。
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now