RabbitMQ基础知识介绍、RabbitMQ的安装
RabbitMQ基础知识介绍
官方解释:MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过 队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。
来自网上某网友的解释:MQ( Message Queue) ,即消息队列是在消息的传输过程中保存消息的容器。你把消息丢进去,然后有个程序去从你的容器里面把消息一条条读出来处理(读取消息,这个过程相比起直接调用来说,不是立即执行的)。一般用于应用系统解耦、 消息异步分发, 能够提高系统吞吐量。
通俗的讲:消息生产者(即:传参者)把消息(即:参数)先放进消息队列的broker服务端,然后服务端会根据用户的配置,将消息(即:参数),用交换器Exchange传递给符合要求的Queue队列们,然后该队列们对应的消费者(即:接参者、一般是方法)会拿到该消息(即:参数),然后执行方法。
MQ的产品有很多, 有开源的, 也有闭源, 比如ZeroMQ、RabbitMQ、 ActiveMQ、 Kafka/Jafka、 Kestrel、 Beanstalkd、HornetQ、 Apache Qpid、 Sparrow、 Starling、 Amazon SQS、MSMQ等。
注:Kafka适用于量级比较大的数据消息交互;一般的千万级以上可以考虑使用Kafka;且使用Kafka一般都需要搭建集群;如:阿里、腾讯、京东等使用的是Kafka。
注:现在使用较多的是RabbitMQ(RMQ)、ActiveMQ(AMQ)、Kafka(卡夫卡)。
声明:各种MQ的原理、使用方式都差不多,下面通过介绍RabbitMQ来让大家初步了解MQ。
RabbitMQ理论知识:
MQ是一种分布式应用程序的的通信方法,它是消费-生产者模型的一个典型的代表,生产者producer往消息队列中不断写入消息,而另一端消费者consumer则可以读取或者订阅队列中的消息。
RabbitMQ是MQ产品的典型代表,是一款基于AMQP协议可复用的企业消息系统。
先给出一个最基本的原理示意图:
通信过程说明:
消息生产者Producer将消息发送给交换机Exchange(注:如果采用direct或topic路由策略的话,那么在将消息convertAndSend发送给Exchange时,路由键routingKey也需要作为一个参数放入convertAndSend方法,一并发送到Exchange),Exchange会比对消息生产者Producer传过来的路由键routingKey,如果和Exchange上某个绑定的Queue的路由键一致,那么就会将详细推送到这个Queue队列(注:在将队列Queue绑定到direct或topic类型的Exchange时,就需要指定该队列的路由键了,如:BindingBuilder.bind(queue).to(exchange).with(ROUTING_KEY);)。消息消费者(又称:消息订阅者)Consumer接收到消息后,会返回给该Queue一个确认码ACK,该Queue收到ACK后,会删除刚才那条被消费了的消息。
在通信过程中,队列Queue对ACK的处理有以下几种情况:
◎如果Consumer接收了消息,发送ACK给队列,RabbitMQ会删除队列中这个消息,发送另一条消息给Consumer。consumer订阅消息时设置auto_ack参数为true。
◎如果Cosumer接受了消息, 但在发送ACK之前断开连接,RabbitMQ会认为这条消息没有被deliver,在Consumer再次连接的时候,这条消息会被redeliver。
◎如果Consumer接受了消息,但是程序中有bug,忘记了ACK;RabbitMQ不会重复发送消息。
注:当RabbitMQ不会重复发送消息时,我们可以设置队列Queue不需要ACK确认,自动删除发过了的消息(我们一般都不这么用);也可以通过设置其最大发送某消息的次数等来设置(详见代码示例中的配置文件)。
注:实际上,Exchange和Queue可以是多对多的关系;且MQ使用模式较多,上面只是画出了最基本最简单的使用方式原理图。
注:安装好erLang,再安装好了RabbitMQ,就相当于安装好了RabbitMQ的服务端了。
Virtual Host:虚拟主机
在RabbitMQ的服务端上可以创建多个虚拟的Message Broker,又叫做Virtual Hosts(vhosts)。每一个vhost本质上是一个mini-Rabbitmq Server,分别管理各自的Exchange,和bindings。vhost相当于物理的server,可以为不同App提供边界隔离,使得应用安全的运行在不同的vhost实例上,相互之间不会干扰。Producer和Consumer连接Rabbit Server需要指定连接到哪一个vhost,否则默认连接到“/”这个vhost。
注:一个Virtual Host里可以有多个Exchange和Queue。
Queue:队列
消息队列,提供了FIFO(即:First In First Out先进先出的数据结构。它只允许在表的前端进行删除操作,而在表的后端进行插入操作)的处理机制,具有缓存消息的能力,用于存储还未被消费者消费的消息。
Exchange:‘交换机’
接收生产者发送的消息,并根据ExchangeType(即路由策略:fanout、direct、topic、headers)将消息路由到服务器中的队列Queue。
注:Exchange 与 Queue可以是多对一、一对多、多对多的关系。
Message:传递的消息
消息是传输的主体,消息包括两部分:有效载荷(payload)和标签(label);有效载荷是要传输的数据,可以是任何内容,比如JSON串、二进制、自定义的数据协议等;标签描述了有效载荷,并且Rabbit用它来决定谁将获得消息的投递。即:payload相当于请求体;label相当于head。
Producer 、 Consumer:生产者和消费者
生产者创建消息,然后发送到代理服务器(RabbitMQ Server),AMQP只会用标签表述这条消息(一个交换器名称和可选的主题标记),Rabbit服务器会根据标签把消息发送给订阅的消费者;消费者消费消息,它会订阅到队列(queue)上,每当有消息到达RabbitMQ服务器时,会发送给消费者,消费者收到消息时,会进行处理。
注:消费者收到的消息只包括有效载荷,所有不会知道是从哪里发来的。
连接(TCP)和信道(Channel):
要想发布或消费消息,必须先与RabbitMQ Server建立一条TCP连接,建立TCP连接之后,要创建一条Channel信道,信道是建立在真实TCP连接的虚拟连接;AMQP命令都是通过信道发送出去的,每条信道会被指派一个唯一的ID,不直接通过TCP连接发送AMQP命令是因为操作系统建立和销毁TCP会话是很昂贵的,而且创建的连接数也有限。 通过创建Channel通道来传输消息,降低一些开销;而且Channel通道是私密的、相互不受影响的。
RabbitMQ的安装、创建虚拟主机、用户密码等
第一大步:安装Erlang
第二大步:安装RabbitMQ
Windows下安装RabbitMQ注意事项:
安装好了RabbitMQ之后,一定要验证保证rabbitMQ安装成功!
验证方式:定位到安装位置,并且输入rabbitmqctl status指令
我遇见的问题:
输入指令后,报错了 Error: unable to connect to node ……
解决方式:
第一小步:Erlang会生成两个cookie文件:C:\Windows\.erlang.cookie 及
C:\用户\你的用户名\.erlang.cookie。检查两个文件内容是否一致,不一致用其中一个替换另一个即可。
第二小步:用上面这个文件覆盖下面两个目录中的同名文件(如果有的话):
C:\Windows\SysWOW64\config\systemprofile
C:\Windows\System32\config\systemprofile
第三小步:打开服务面板(运行》》services.msc),重新启动RabbitMQ服务
第四小步:再次cmd窗口,定位到安装位置,并且输入rabbitmqctl status指令,验证(成功)
第三大步:创建virtual host 以及 user
提示1:我们也可以不创建virtual host和user,直接使用RabbitMQ默认提供的用户(“guest”),密码(“guest”),virtual host(“/”)也行。
提示2:这里是在图形界面创建的;也可以使用命令行进行创建。
Windows下,如果我们想在浏览器界面管理rabbitMQ的话,那么我们还需要在rabbitMQ安装目录下的sbin文件夹下执行DOS指令:rabbitmq-plugins enable rabbitmq_management,然后访问localhost:15672(其中,15672是其默认端口)即可。
追注:访问该链接时,需要账号密码;第一次登陆时,可以先以访客身份(账号:guest 密码:guest)登陆,然后进去了再进行账号的创建配置。
线面给出图片步骤:
第一小步:先以guest身份(密码:guest)登录进去
第二小步:创建Virtual Host
第三小步:创建User
第四小步:给刚才创建的User指定Virtual Host
点击进去,指定Virtual Host
第五小步:退出,然后以刚才新创建的身份进行登录即可
本文参考链接:
https://baijiahao.baidu.com/s?id=1549509246303295&wfr=spider&for=pc
https://www.cnblogs.com/jun-ma/p/4840869.html
https://blog.csdn.net/qq_36838191/article/details/79914274
http://qqtalk.iteye.com/blog/2419949
https://www.cnblogs.com/wyt007/p/9078647.html
如有不当之处,欢迎指正
本文已经被收录进《程序员成长笔记(二)》,作者JustryDeng