RabbitMQ学习笔记

1、安装时遇到的坑

  • 对于64位或32位的操作系统,要下载安装对应版本的erlang,否则安装时不报错,但在RabbitMQ服务启动时,会提示找不到ERLANG_HOME的错误,虽然已经设置过。
  • 在使用javaAPI进行连接时,guest账号只能连接本地电脑即localhost上的RabbitMQ服务,若服务在其他电脑上,则必须新建账户,否则提示无权限。

2、入门代码体会

按照普遍的思维模式,消息队列的创建及配置都应该在初始化的时候完成,而平常潜意识里,初始化一般在消息发送方(毕竟真实环境都是消息先发送才能接受,想要发消息的时候,至少得知道往什么地方发),故按照这种思维看官方源码教程的时候,有一些费解的地方:为什么消息发送的时候只声明了一个exchange,规则和要发送的目的队列都没有。这部都应该在初始化的时候配置好吗?为什么都没有,却要在消息接收里声明。

由于时间太晚,又困的不行,这个问题想了十分钟没想出来,睡觉去了。第二天起来,接着又来看源码,突然发现这个设计真是合理得不行!!

MQ最最基本的解耦,就是接受方和发送方的解耦:消息发送方只管发消息,只需关心所发消息的内容和主题,而不需要关系消息是否会被监听或被谁监听,而消息接收方,只需要确定自己关系的主题,之后去监听和处理这类消息,而不需要关系这个消息是谁发出来的。而RabbitMQ就是通过exchange和各种交换策略来实现解耦的。

消息发送方只需要关系所发的exchange,消息内容和消息主题(routingKey),这就够了,这就是发送方所有的指责和义务。

消息接收方需要知道和发送方相同的exchange,以及所关系的消息主题(bindingKey),这就够了,然后就可以在MQ上新建队列(queue)进行监听。

还有一个需要注意的地方,对于所有MQ来说queue中的消息只能被消费一次,即使有多个消息接收方,也会以轮询的方式进行发送。如果需要多个接收方都接受所有的消息,则每个接受方都需要新建一个队列,并且进行对应的绑定等操作。

3、AMQP协议基本概念

今天看了一些关于AMQP协议的介绍。发现RabbitMQ中的各种组件及虚拟概念都是完全根据AMQP协议来的,所以这里做下记录,简单介绍下AMQP协议。

(下文中如果涉及RabbitMQ代码的,均指rabbitmq-java-client中的代码,RabbitMQ本身是erlang编写的,我没办法去研究)

下图是AMQP的协议模型,可以看出和RabbitMQ中的各种概念及命名都完全一致。

RabbitMQ学习笔记_第1张图片

下面对各种概念分别做一下简单介绍:

  • Server:又称Broker,接受客户端的链接,实现AMQP的实体服务。
  • Connection:链接,应用程序与Broker的网络链接。
  • Channel:网络信道,几乎所有的操作都是在Channel中进行的,Channel是进行消息读写的通道(也可以看到RabbitMQ代码中的各种重要操作都是在Channel这个对象上进行的)。客户端可以建立多个Channel,每个Channel代表一个会话任务(所以这个概念也类似于数据库或网络链接中Session的)。
  • Message:消息,服务器和应用程序之间传送的数据,由Properties和Body组成(这也和RabbitMQ中发送消息的所需的参数完全吻合,原来这也是AMQP协议确定的。。)。Properties对消息进行修饰(可以参看源码中Properties的属性),如优先级,延迟等;Body就是消息的实体内容。
  • Virtual host:(代码中经常可以看见报错来自于vhost,就是这个东西)虚拟地址(逻辑感念),用于进行逻辑隔离,最上层的消息路由。一个Virtual host里可以有若干个Exchange和Queue,同一个Virtual host 里不能有相同名称的Exchange或Queue。
  • Exchange:交换机,接收消息,根据路右键转发消息到绑定的队列。
  • Binding:Exchange和Queue之间的虚拟链接,binding中可以包含routing key。
  • routing key:一个路由规则,虚拟机可用它来确定如何路由一个特定消息。
  • Queue:也称为Message Queue,消息队列,保存消息并将它们转发给消费者。

从上面AMQP的几个核心概念的介绍可以看出,这些概念与RabbitMQ中定义的各种类完全吻合。所以说RabbitMQ是满足AMQP协议的。其代码也是完全根据AMQP协议设计的。

你可能感兴趣的:(RabbitMQ,RabbitMQ)