代码改变世界

RabbitMQ入门(一)-- 定义与安装

2021-04-21 19:58  Hungs  阅读(103)  评论(0)    收藏  举报

RabbitMQ是什么?

搜狗百科:rabbitmq是一个在AMQP基础上完成的,可复用的企业消息系统,用erlang语言开发,遵循Mozilla Public License开源协议

rabbitmq支持消息的持久化,也就是将数据写在磁盘上,为了数据安全考虑,大多数用户都会选择持久化。

RabbitMQ的特点?

MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取或者订阅队列中的消息。MQ和JMS类似,但不同的是JMS是SUN JAVA消息中间件服务的一个标准和API定义,而MQ则是遵循了AMQP协议的具体实现和产品。

消息对列的使用场景

转自简书的作者littlejian,https://www.jianshu.com/p/a7e7c0707c45

消息对列的使用场景还是蛮多的,但是比较核心的主要有这三个:解耦、削峰和异步通信。

  • 应用解耦

    有这么个场景。A系统要发送数据BCD系统,通过接口发送。如果有一天E系统也需要这个数据或者说C系统又不需要数据了,这种情况下每次需求的变动都需要A系统做相应的改动,而且A系统还要考虑处理BCD系统挂了的情况,所以这相对于A系统来说是极其高耦合的。

    那么如果使用MQ,A系统产生一条数据,它只管把数据仍到消息队列里去,其他系统如果需要这些数据,自己去MQ里消费。通过一个 MQ,Pub/Sub 发布订阅消息这么一个模型,A 系统就跟其它系统彻底解耦了。

  • 流量削峰

    比如说,有这样一个系统,它大部分情况下流量都是正常的,但是会存在某个高峰期,高峰期下大量的请求过来系统可能就会崩溃,用户无法正常访问系统。

    如果使用MQ,所有的请求都发送到MQ,系统慢慢的从MQ中消费数据,这样即使是在高峰期的时候,系统也只会处理它能承受的最大请求量,这样系统就绝不会挂掉了。

    所以在高并发,大流量的场景下,rabbitmq可以减少突发访问压力,不会因为突发的超时负荷要求而崩溃

  • 异步通信

    再来看一个场景,A系统接收一个请求,不仅需要本地写库,还需要发送数据给其他系统写库,比如说发送日志信息给日志系统,或者其他一些备份数据等一些不是实话的业务处理。如果是同步的话,用户等待这个请求处理完成的时间就会很长,用户体验就会很差。那么如果是异步的话,将数据发送给消息队列就直接返回,后续由其他系统自己消费慢慢处理。这样对于用户来说就是无感知的,用户体验度就会大大提升。

RabbitMQ安装

由于RabbitMQ是基于erlang的,它依赖于erlang,所以,需要先安装一下erlang。

  • 安装ERLANG

  erlang下载地址:https://www.erlang.org/downloads

 

   选择windows64位操作系统这个进行下载。下载完后,点击安装,傻瓜式一直点到结束即可。

  • 安装RabbitMQ

  RabbitMQ下载地址:https://www.rabbitmq.com/download.html

  

 

   点击windows安装,进入下载界面,翻到中间位置,找到下载链接下载即可。

  

 

   下载完后还是傻瓜式一键安装即可。

  •  配置环境变量

  添加ERLANG_HOME和RABBITMQ_HOME的环境变量,于jdk的环境变量配置一样,这里不在赘述。截图供参考。

  

 

 

   注意,RABBITMQ的Path应该是:%RABBITMQ_HOME%\sbin。

启动RabbitMQ

  rabbitmq默认安装启动以后,是没有开启web管理界面的,所以需要通过 rabbitmq-plugins enable rabbitmq_management 开启web界面管理插件,在rabbitmq安装目录的sbin下执行,执行完成后,执行rabbitmq-server.bat启动rabbitmq,然后用浏览器打开http://localhost:15672/

  

 

 

 

 输入guest/guest用户进行登录即可。

RabbitMQ界面操作 

1、新建exchange,item_topic_exchange,类型Typex选择topic。

 

 RabbitMQ常用的Exchange Type有fanout、direct、topic、headers这四种。具体介绍转自知乎:https://zhuanlan.zhihu.com/p/202872293 ,这里直接复制过来。

Direct
处理路由键,需要将一个队列绑定到交换机上,要求该消息与一个特定的路由键完全匹配。这是一个完整的匹配。如果一个队列绑定到该交换机上要求路由键为 “green”,则只有路由键为“green”的消息才被转发,不会转发路由键为"red",只会转发路由键为"green"。

Topic

将路由键和某模式进行匹配。此时队列需要绑定要一个模式上。符号“#”匹配一个或多个词,符号“*”只能匹配一个词。

Fanout

Fanout 不处理路由键。你只需要简单的将队列绑定到交换机上。一个发送到该类型交换机的消息都会被广播到与该交换机绑定的所有队列上。

Headers
不处理路由键,而是根据发送的消息内容中的headers属性进行匹配。在绑定Queue与Exchange时指定一组键值对;当消息发送到RabbitMQ时会取到该消息的headers与Exchange绑定时指定的键值对进行匹配;如果完全匹配则消息会路由到该队列,否则不会路由到该队列。headers属性是一个键值对,可以是Hashtable,键值对的值可以是任何类型。而fanout,direct,topic 的路由键都需要要字符串形式的

 2、新建一个queue,命名item_queue。

 

 添加完后,回到exchanges页面,点击查看item_topic_exchange详情,绑定queue。

 

 接下来就可以通过代码来实现消息的推送和消费了。