zijing2333...大约 9 分钟

AMQP协议?

AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。 AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。 RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

AMQP三层协议:

  • Module Layer:协议最高层,主要定义了一些客户端调用的命令,客户端可以用这些命令实现自己的业务逻辑。

  • Session Layer:中间层,主要负责客户端命会发送给服务器,再将服务端应答返回客户端,提供可靠性同步机制和错误处理。

  • TransportLayer:最底层,主要传输二进制数据流,提供帧的处理、信道服用、错误检测和数据表示等。

AMQP组件:

  • 交换器(Exchange):消息代理服务器中用于把消息路由到队列的组件。

  • 队列(queue):用来存储消息的数据结构,位于硬盘或内存中。

  • 绑定(Binding):一套规则,告知交换器消息应该将消息投递给哪个队列。

RabbitMQ包含哪些要素?

  • 生产者:消息队列创建者,发送消息到MQ
  • 消费者:连接到RabbitMQ,订阅到队列上,消费消息,持续订阅和单条订阅
  • 消息:包含有效载荷和标签,有效载荷指要传输的数据,标签描述了有效载荷,并且RabbitMQ用它来决定谁获得消息,消费者只能拿到有效载荷,并不知道生产者是谁

RabbitMQ各个部分的概念?

信道

是生产者、消费者与RabbitMQ通信的渠道,生产者publish或是消费者subscribe 一个队列都是通过信道来通信的。

信道是建立在TCP连接上的虚拟连接,就是说RabbitMQ在一条TCP上建立成百上千个信道来达到多个线程处理,这个TCP被多个线程共享,每个线程对应一个信道,信道在RabbitMQ都有一个唯一的ID,保证了信道私有性,对应上唯一的线程使用。

Broker

broker是指一个或多个erlang node的逻辑分组,且node上运行着RabbitMQ应用程序。

Cluster

cluster是在broker的基础之上,増加了node之间共享元数据的约束。

Exchange

生产者将消息发送到交换器,有交换器将消息路由到一个或者多个队中。当路由不到时,或返回给生产者或直接丟弃。

RoutingKey

生产者将消息发送给交换器的时候,会指定一个RoutingKey,用来指定这个消息的路由规则,这个RoutingKey需要与交换器类型和绑定键(BindingKey)联合使用才能最终生效。

Binding

通过绑定将交换器和队列关联起来,一般会指定一个BindingKey,这样RabbitMq就知道如何正确路由消息到队列了。

死信队列

当消息被RabbitMQ server投递到consumer后,但consumer却通过 Basic.Reject进行了拒绝时(同时设置requeue=false),那么该消息会被放入死信队列中。该 queue 可用于排查 message 被 reject 或 undeliver 的原因。

vhost

vhost可以理解为虚拟broker,即mini-RabbitMQ server。其内部均含有独立的queue、exchange和binding等,但最最、重要的是,其拥有独立的权限系统,可以做到vhost范围的用户控制。当然,从RabbitMQ的全局角度,vhost可以作为不同权限隔离的手段(一个典型的例子就是不同的应用可以跑在不同的vhost中)。

RabbitMQ的routing key和binding key的最大长度是多少?

255字节。

RabbitMQ中消息可能有的几种状态?

  • alpha:消息内容(包括消息体、属性和headers)和消息索引都存储在内存
  • beta:消息内容保存在磁盘中,消息索引保存在内存中
  • gamma:消息内容保存在磁盘中,消息索引在磁盘和内存中都有
  • delta:消息内容和索引都在磁盘中

RabbitMQ的消息传输保证层级?

  • At most once:最多一次。消息可能会丢失,但不会重复传递

  • At least once:最少一次。消息绝不会丟失,但可能会重夏传输

  • Exactly once:恰好一次。每条消息肯定仅传输一次