RabbitMQ(一):RabbitMQ快速入门

RabbitMQ是目前很是热门的一款消息中间件,不论是互联网大厂仍是中小企业都在大量使用。做为一名合格的开发者,有必要对RabbitMQ有所了解,本文是RabbitMQ快速入门文章,主要内容包括RabbitMQ是什么、RabbitMQ核心概念、经常使用交换器类型、用Docker安装RabbitMQ等。html

RabbitMQ简介

以熟悉的电商场景为例,若是商品服务和订单服务是两个不一样的微服务,在下单的过程当中订单服务须要调用商品服务进行扣库存操做。按照传统的方式,下单过程要等到调用完毕以后才能返回下单成功,若是网络产生波动等缘由使得商品服务扣库存延迟或者失败,会带来较差的用户体验,若是在高并发的场景下,这样的处理显然是不合适的,那怎么进行优化呢?这就须要消息队列登场了。docker

消息队列提供一个异步通讯机制,消息的发送者没必要一直等待到消息被成功处理才返回,而是当即返回。消息中间件负责处理网络通讯,若是网络链接不可用,消息被暂存于队列当中,当网络畅通的时候在将消息转发给相应的应用程序或者服务,固然前提是这些服务订阅了该队列。若是在商品服务和订单服务之间使用消息中间件,既能够提升并发量,又下降服务之间的耦合度。浏览器

RabbitMQ就是这样一款咱们苦苦追寻的消息队列。RabbitMQ是一个开源的消息代理的队列服务器,用来经过普通协议在彻底不一样的应用之间共享数据。安全

RabbitMQ是使用Erlang语言来编写的,而且RabbitMQ是基于AMQP协议的。Erlang语言在数据交互方面性能优秀,有着和原生Socket同样的延迟,这也是RabbitMQ高性能的缘由所在。可谓“人如其名”,RabbitMQ像兔子同样迅速。服务器

RabbitMQ除了像兔子同样跑的很快之外,还有这些特色:网络

  • 开源、性能优秀,稳定性保障
  • 提供可靠性消息投递模式、返回模式
  • 与Spring AMQP完美整合,API丰富
  • 集群模式丰富,表达式配置,HA模式,镜像队列模型
  • 保证数据不丢失的前提作到高可靠性、可用性

MQ典型应用场景:并发

  • 异步处理。把消息放入消息中间件中,等到须要的时候再去处理。
  • 流量削峰。例如秒杀活动,在短期内访问量急剧增长,使用消息队列,当消息队列满了就拒绝响应,跳转到错误页面,这样就可使得系统不会由于超负载而崩溃。
  • 日志处理
  • 应用解耦。假设某个服务A须要给许多个服务(B、C、D)发送消息,当某个服务(例如B)不须要发送消息了,服务A须要改代码再次部署;当新加入一个服务(服务E)须要服务A的消息的时候,也须要改代码从新部署;另外服务A也要考虑其余服务挂掉,没有收到消息怎么办?要不要从新发送呢?是否是很麻烦,使用MQ发布订阅模式,服务A只生产消息发送到MQ,B、C、D从MQ中读取消息,须要A的消息就订阅,不须要了就取消订阅,服务A再也不操心其余的事情,使用这种方式能够下降服务或者系统之间的耦合。

AMQP协议和RabbitMQ

提到RabbitMQ,就不得不提AMQP协议。AMQP协议是具备现代特征的二进制协议。是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。异步

先了解一下AMQP协议中间的几个重要概念:微服务

  • Server:接收客户端的链接,实现AMQP实体服务。
  • Connection:链接,应用程序与Server的网络链接,TCP链接。
  • Channel:信道,消息读写等操做在信道中进行。客户端能够创建多个信道,每一个信道表明一个会话任务。
  • Message:消息,应用程序和服务器之间传送的数据,消息能够很是简单,也能够很复杂。有Properties和Body组成。Properties为外包装,能够对消息进行修饰,好比消息的优先级、延迟等高级特性;Body就是消息体内容。
  • Virtual Host:虚拟主机,用于逻辑隔离。一个虚拟主机里面能够有若干个Exchange和Queue,同一个虚拟主机里面不能有相同名称的Exchange或Queue。
  • Exchange:交换器,接收消息,按照路由规则将消息路由到一个或者多个队列。若是路由不到,或者返回给生产者,或者直接丢弃。RabbitMQ经常使用的交换器经常使用类型有direct、topic、fanout、headers四种,后面详细介绍。
  • Binding:绑定,交换器和消息队列之间的虚拟链接,绑定中能够包含一个或者多个RoutingKey。
  • RoutingKey:路由键,生产者将消息发送给交换器的时候,会发送一个RoutingKey,用来指定路由规则,这样交换器就知道把消息发送到哪一个队列。路由键一般为一个“.”分割的字符串,例如“com.rabbitmq”。
  • Queue:消息队列,用来保存消息,供消费者消费。

咱们彻底能够直接使用 Connection 就能完成信道的工做,为何还要引入信道呢?高并发

试想这样一个场景, 一个应用程序中有不少个线程须要从 RabbitMQ 中消费消息,或者生产消息,那么必然须要创建不少个 Connection,也就是许多个 TCP 链接。然而对于操做系统而言,创建和销毁 TCP 链接是很是昂贵的开销,若是遇到使用高峰,性能瓶颈也随之显现。 RabbitMQ 采用 TCP 链接复用的方式,不只能够减小性能开销,同时也便于管理 。

下图是AMQP的协议模型:

正如图中所看到的,AMQP协议模型有三部分组成:生产者、消费者和服务端。

生产者是投递消息的一方,首先链接到Server,创建一个链接,开启一个信道;而后生产者声明交换器和队列,设置相关属性,并经过路由键将交换器和队列进行绑定。同理,消费者也须要进行创建链接,开启信道等操做,便于接收消息。

接着生产者就能够发送消息,发送到服务端中的虚拟主机,虚拟主机中的交换器根据路由键选择路由规则,而后发送到不一样的消息队列中,这样订阅了消息队列的消费者就能够获取到消息,进行消费。

最后还要关闭信道和链接。

RabbitMQ是基于AMQP协议实现的,其结构以下图所示,和AMQP协议简直就是如出一辙。

经常使用交换器

RabbitMQ经常使用的交换器类型有direct、topic、fanout、headers四种。

Direct Exchange

该类型的交换器将全部发送到该交换器的消息被转发到RoutingKey指定的队列中,也就是说路由到BindingKey和RoutingKey彻底匹配的队列中。

Topic Exchange

该类型的交换器将全部发送到Topic Exchange的消息被转发到全部RoutingKey中指定的Topic的队列上面。

Exchange将RoutingKey和某Topic进行模糊匹配,其中“”用来匹配一个词,“#”用于匹配一个或者多个词。例如“com.#”能匹配到“com.rabbitmq.oa”和“com.rabbitmq”;而"login."只能匹配到“com.rabbitmq”。

Fanout Exchange

该类型不处理路由键,会把全部发送到交换器的消息路由到全部绑定的队列中。优势是转发消息最快,性能最好。

Headers Exchange

该类型的交换器不依赖路由规则来路由消息,而是根据消息内容中的headers属性进行匹配。headers类型交换器性能差,在实际中并不经常使用。

安装和使用入门

在云计算和容器技术大热的今天,不会Docker显得未免太out了吧。Docker提供一种安全、可重复的环境中自动部署软件的方式,本文使用Docker进行安装RabbitMQ。

  • 进入官方下载地址,选择使用Docker安装,跳转到dockerhub查看镜像。

  • 我选择3.8.0-beta.4-management进行安装,带有management是含有管理界面的。

  • 拉取镜像和启动:docker run -d --hostname my-rabbit -p 5672:5672 -p 15672:15672 rabbitmq:3.8.0-beta.4-management

  • 查看镜像:

[root@localhost ~]# docker images
REPOSITORY              TAG                       IMAGE ID            CREATED             SIZE
docker.io/rabbitmq      3.8.0-beta.4-management   d0f93d2b83f7        3 days ago          180 MB
  • 打开浏览器访问localhost:15672,若是你和我同样装在虚拟机上面的话,须要打开虚拟机ip:15672

  • 进行填写帐号密码:默认帐号密码都是guest.

到此,RabbitMQ已经安装并运行起来了。

总结

本文介绍了RabbitMQ是什么、RabbitMQ核心概念、经常使用交换器类型、用Docker安装RabbitMQ等内容,看完本文,想必对于RabbitMQ已经有了一些初步的了解了,后面的世界更精彩。

本文参考慕课网免费课程:《RabbitMQ消息中间件极速入门与实战》。

原文出处:https://www.cnblogs.com/sgh1023/p/11217017.html

相关文章
相关标签/搜索