谷粒商城-高级-64 -商城业务-消息队列-RabbitMQ

一、MQ简介

简介

大多应用中,可通过消息服务中间件来提升系统异步通信、扩展解耦能力。
消息的发送者和接收者不需要同时与消息队列交互。消息会保存在队列中,知道接收者取回它

下面是架构图:
file

  • Producer:消息生产者,负责生产和发送消息到Broker;
  • Broker:消息处理中心,负责消息存储、确认、重试等;
  • Consumer:消息消费中心,负责从Broker中获取消息并处理。

消息队列-特性

  • 异步性:将耗时的同步任务通过发送消息的方式进行异步处理,减少等待时间。
  • 松耦合:不同系统、服务之间可以通过消息队列进行通信,不用关心彼此的实现细节,数据格式一致。
  • 分布式:为了防止消息堵塞,可以对消费者集群进行横向扩展,避免单点故障,同样队列本身也可以。
  • 可靠性:将接收到的消息落盘,就算服务器重启或者发生故障,恢复之后也能重新加载。

RabbitMQ核心概念

RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue Protocol)的开源实现。

Message

  • 消息,消息是不具名的,它由消息头和消息体组成
  • 消息头,包括routing-key(路由键)、priority(相对于其他消息的优先权)、delivery-mode(指出该消息可能需要持久性存储)等

Publisher

  • 消息的生产者,也是一个向交换器发布消息的客户端应用程序

Exchange

  • 交换器,将生产者消息路由给服务器中的队列
  • 类型有direct(默认),fanout, topic, 和headers,具有不同转发策略

Queue

  • 消息队列,保存消息直到发送给消费者

Binding

  • 绑定,用于消息队列和交换器之间的关联

Connection

  • 网络连接,比如一个TCP连接

Channel

  • 信道,多路复用连接中的一条独立的双向数据流通道。信道是建立在真实的TCP连接内的虚拟连接,AMQP命令都是通过信道发出去的,不管是发布消息、订阅队列还是接收消息,这些动作都是通过信道完成的。因为对于操作系统来说建立和销毁TCP都是非常昂贵的开销,所以引入了信道的概念,以复用一条TCP连接。

Consumer

  • 消息的消费者,表示一个从消息队列中取得消息的客户端应用程序

Virtual Host

  • 虚拟主机,表示一批交换器、消息队列和相关对象。
  • vhost 是 AMQP 概念的基础,必须在连接时指定
  • RabbitMQ 默认的 vhost 是 /

Broker

  • 消息队列服务器实体

file

二、Docker安装RabbitMQ

docker run -d --name rabbitmq -p 5671:5671 -p 5672:5672 \
-p 4369:4369  -p 25672:25672 -p 15671:15671 -p 15672:15672 \
rabbitmq:management

说明:
4369,25672 (Erlang发现&集群端口)
5672,5671(AMQP端口)
15672(web管理后台端口)
61613,61614(STOMP协议端口)
1883,8883(MQTT协议端口)

安装成功后,通过命令查看:

[root@localhost docker]# docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                                                                                                                                       NAMES
d1496194943f        rabbitmq:management   "docker-entrypoint.s…"   4 minutes ago       Up 3 minutes        0.0.0.0:4369->4369/tcp, 0.0.0.0:5671-5672->5671-5672/tcp, 0.0.0.0:15671-15672->15671-15672/tcp, 0.0.0.0:25672->25672/tcp, 15691-15692/tcp   rabbitmq

设置开机自启动:

docker update rabbitmq --restart=always

访问管理页面:
http://192.168.10.10:15672/#/

file

三、RabbitMQ消息发送测试

RabbitMQ提供了四种Exchange模式:fanout,direct,topic,header 。 header模式在实际使用中较少,这里只讨论前三种模式.

fanout 模式

fanout 模式就是广播模式~,消息来了,会发给所有的队列~

file

测试广播模式:
先在交换机创建 fanout模式的交换机,命名为 my.fanout.exchange,然后再到队列创建多个队列,再到交换机绑定队列,fanout可以不设置路由key,因为这个是广播模式的,最后发消息测试。

file

队列接收消息:
file

可以看到绑定的队列已经收到消息了。

Direct 模式

Direct 模式就是指定队列模式, 消息来了,只发给指定的 Queue, 其他Queue 都收不到。
file

Topic 模式

主题模式,注意这里的主题模式,和 ActivityMQ 里的不一样。 ActivityMQ 里的主题,更像是广播模式。
那么这里的主题模式是什么意思呢? 如图所示消息来源有: 美国新闻,美国天气,欧洲新闻,欧洲天气。
如果你想看 美国主题: 那么就会收到 美国新闻,美国天气。
如果你想看 新闻主题: 那么就会收到 美国新闻,欧洲新闻。
如果你想看 天气主题: 那么就会收到 美国天气,欧洲天气。
如果你想看 欧洲主题: 那么就会收到 欧洲新闻,欧洲天气。

这样就可以灵活搭配~

file


相关文章:
Springboot 整合RabbitMq ,用心看完这一篇就够了
MacOS下安装RabbitMQ和使用
消息中间件RabbitMQ学习

为者常成,行者常至