029-云E办_RabbitMQ介绍和安装
一、MQ介绍
1、简介:
在计算机科学中,MQ全称是消息队列(英语:Message queue)是一种进程间通信或同一进程的不同线程间的通信方式,软件的贮列用来处理一系列的输入,通常是来自用户。消息队列提供了异步的通信协议,每一个贮列中的纪录包含详细说明的数据,包含发生的时间,输入设备的种类,以及特定的输入参数,也就是说:消息的发送者和接收者不需要同时与消息队列互交。消息会保存在队列中,直到接收者取回它。
消息队列:是将数据保存后,然后在转发出去,不做任务业务逻辑的处理
2、实现:
消息队列:是一种协议,相应有一些开源的实现。
消息队列常常保存在链表结构中。拥有权限的进程可以向消息队列中写入或读取消息。
目前,有很多消息队列有很多开源的实现,包括 JBoss Messaging 、 JORAM 、 Apache ActiveMQ 、 Sun Open Message Queue 、 IBM MQ 、 Apache Qpid 和 HTTPSQS 。
当前使用较多的消息队列有 RabbitMQ 、 RocketMQ 、 ActiveMQ 、 Kafka 、 ZeroMQ 、 MetaMq 等,而部分数据库如 Redis 、 Mysql 以及 phxsql 也可实现消息队列的功能。
3、特点:
MQ是消费者-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取或者订阅队列中的消息。MQ和JMS类似,但不同的是JMS是SUN JAVA消息中间件服务的一个标准和API定义,而MQ则是遵循了AMQP协议的具体实现和产品。
注意:
- AMQP ,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。
- JMS ,Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。 Java消息服务
是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。常见的消息队列,大部分都实现了JMS API,如 ActiveMQ , Redis 以及 RabbitMQ 等
4、优缺点:
- 优点:
应用耦合、异步处理、流量削锋
1.解耦
传统模式:系统间耦合性太强,如上图所示,系统A在代码中直接调用系统B和系统C的代码,如果将来D系统接入,系统A还需要修改代码,过于麻烦!
中间件模式:
将消息写入消息队列,需要消息的系统自己从消息队列中订阅,从而系统A不需要做任何修改
2.异步处理
举例子:注册用户信息时,当注册成功后,服务器会将信息写到数据库中,还会给用户发短信、发邮箱,这样经过了三个步骤再返回来,耗时太慢了。这样消息队列的优点之一:异步处理解决了问题。服务器只需要将消息发送给消息队列即可,消息队列会去分发任务。
传统模式的缺点:
并发量大的时候,所有的请求直接怼到数据库,造成数据库连接异常
中间件模式的的优点:
将消息写入消息队列,需要消息的系统自己从消息队列中订阅,从而系统A不需要做任何修改
3.流量削锋
举例子:2000个用户同时请求某个商品,从而会访问数据库,然后数据库处理不过来,那么就可以去消息队列进行排队,这样数据库,每次从数据库取出100个请求,进行处理。从而减少了数据库的压力。
传统模式的缺点:
并发量大的时候,所有的请求直接怼到数据库,造成数据库连接异常。
中间件模式的的优点:
系统A慢慢的按照数据库能处理的并发量,从消息队列中慢慢拉取消息。在生产中,这个短暂的高峰期积压是允许的。
4.缺点
系统可用性降低、系统复杂性增加
5、使用场景
消息队列,是分布式系统中重要的组件,其通用的使用场景可以简单地描述为:当不需要立即获得结果,但是并发量又需要进行控制的时候,差不多就是需要使用消息队的时候
在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式大大
的节省了服务器的请求响应时间,从而提高了系统的吞吐量。
二、为什么使用RabbitMQ
1.介绍不同的MQ
- ActiveMQ:Apache旗下,老牌MQ年代久了。性能稍逊,从而高并发很容易出现阻塞。
- Kafka:之前专门用来做日志收集。优点:相对比较这四个,性能最高,每秒一百万条的消息处理量。缺点:对于消息可靠性差了点,例如:重发、漏掉等。而日志丢掉一点也无所谓。
- RocketMQ:Alibaba开源消息队列,设计上借鉴了kafka,基于kafka做了改进。优点:1.高性能 2.提高了可靠性。缺点:虽然开源了, 但是捐献了Apache,有些功能不完美。而商业版花钱才能用。
- RabbitMQ:1.性能还不错 2.能保证消息的可靠性。3.高可用:例如集群主从:任何一个节点有数据,都能恢复过来。4.真正的开源
2、RabbitMQ
AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。
AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。
RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python 、 Ruby 、 .NET 、 Java 、 JMS 、 C 、 PHP 、 ActionScript 、 XMPP 、 STOMP 等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
为什么要使用RabbitMQ 总结如下:
- 基于AMQP协议
- 高并发(是一个容量的概念,服务器可以接受的最大任务数量)
- 高性能(是一个速度的概念,单位时间内服务器可以处理的任务数)
- 高可用(是一个持久的概念,单位时间内服务器可以正常工作的时间比例)
- 强大的社区支持,以及很多公司都在使用(美团、艺龙等)
- 支持插件
- 支持多语言
三、安装RabbitMQ
1、由于Erlang编写的,先安装Erlang
官网提示:https://www.erlang-solutions.com/resources/download.html
安装erlang
yum -y install esl-erlang_23.0.2-1_centos_7_amd64.rpm
检测erlang
2、安装RabbitMQ
文件下载
官网下载地址:http://www.rabbitmq.com/download.html
-
安装rabbitmq
yum -y install rabbitmq-server-3.8.5-1.el7.noarch.rpm
-
启用rabbitmq服务
systemctl start rabbitmq-server.service
-
检测服务
systemctl status rabbitmq-server.service
修改防火墙,添加规则
```-A INPUT -p tcp -m state --state NEW -m tcp --dport 15672 -j ACCEPT```
```-A INPUT -p tcp -m state --state NEW -m tcp --dport 5672 -j ACCEPT```
重启防火墙
```systemctl restart iptables.service```
-
安装UI插件
rabbitmq-plugins enable rabbitmq_management
-
重启服务器,查看端口
netstat -tunlp |grep 15672
-
访问可视化页面:
服务器地址:默认的http访问的端口
默认的用户名和密码是:guest
出现问题:用户只能通过本地主机登录。而现在是在远程登录。
-
如何解决:
在rabbitmq的配置文件目录下(默认为:/etc/rabbitmq)创建一个rabbitmq.config文件。
文件中添加如下配置(请不要忘记那个“.”)
[{rabbit, [{loopback_users, []}]}].
重启rabbitmq服务
systemctl restart rabbitmq-server.service
重新访问
3、管理界面基本操作
1.管理界面添加用户与权限分配
RabbitMQ默认提供guest用户,密码为guest用于登录MQ主页面
添加用户,默认用户 guest 角色为管理员,一般开发环境下会创建新的用户并对权限进行分配。
添加ego用户并对权限进行分配
用户添加完毕,用户列表显示用户状态是 No access ,代表用户未进行权限分配,不能进行任何操作,这里创建用户分配权限可以类比数据库中创建用户并分配权限操作。
2.分配权限
创建 virtual hosts 可以类比创建数据库,分配用户操作权限
创建完成以后可以看到默认分配了 guest 用户
点击/shop进入权限分配页面,添加用户
添加shop用户
添加成功如下,Clear代表清除用户
返回Users,现在shop用户只有可以操作/shop的权限,配置/操作权限
点击ego进入权限分配页面
添加/操作权限
添加成功如下,Clear代表清除用户
重新登录
3.路由
4.集群
搭建集群注意事项:
- 不能有中文
- 不能有重复