一. 为什么要用mq?
在介绍RabbitMQ之前,我们先来看下面一个电商项目的场景:
- 商品的原始数据保存在数据库中,增删改查都在数据库中完成。
- 搜索服务数据来源是索引库(Elasticsearch),如果数据库商品发生变化,索引库数据不能及时更新。
- 商品详情做了页面静态化处理,静态页面数据也不会随着数据库商品更新而变化。
如果我们在后台修改了商品的价格,搜索页面和商品详情页显示的依然是旧的价格,这样显然不对。该如何解决?
我们可能会想到这么做:
- 方案1:每当后台对商品做增删改操作,同时修改索引库数据及更新静态页面。
- 方案2:搜索服务和商品页面静态化服务对外提供操作接口,后台在商品增删改后,调用接口。
这两种方案都有个严重的问题:就是代码耦合,后台服务中需要嵌入搜索和商品页面服务,违背了微服务的独立原则。
这时,我们就会采用另外一种解决办法,那就是消息队列!
商品服务对商品增删改以后,无需去操作索引库和静态页面,只需向MQ发送一条消息(比如包含商品id的消息),也不关心消息被谁接收。 搜索服务和静态页面服务监听MQ,接收消息,然后分别去处理索引库和静态页面(根据商品id去更新索引库和商品详情静态页面)。
二. RabbitMQ介绍
2.1. 什么是mq?
消息队列(Message Queue,简称MQ):是在消息的传输过程中保存消息的容器。用于分布式系统之间进行通信。
2.2 选型和对比
RabbitMQ | ActiveMQ | RocketMQ | Kafka | |
---|---|---|---|---|
公司/社区 | Rabbit | Apache | 阿里 | Apache |
开发语言 | Erlang | Java | Java | Scala&Java |
协议 | AMQP | OpenWire、AUTO、Stomp、MQTT | 自定义 | 自定义 |
单机吞吐量 | 万级 | 万级(最差) | 十万级 | 十万级 |
消息延迟 | 微妙级 | 毫秒级 | 毫秒级 | 毫秒以内 |
特性 | 并发能力很强,延时很低 | 老牌产品,文档较多 | MQ功能比较完备,扩展性佳 | 只支持主要的MQ功能,毕竟是为大数据领域准备的。 |
综合上面的材料得出以下两点 :
-
中小型软件公司,建议选RabbitMQ.一方面,erlang语言天生具备高并发的特性,RabbitMQ的社区十分活跃,可以解决开发过程中遇到的bug,这点对于中小型公司来说十分重要。不考虑rocketmq和kafka的原因是中小型软件公司不如互联网公司,数据量没那么大,选消息中间件,应首选功能比较完备的,所以kafka和rocketmq排除。
-
大型软件公司,根据具体使用在rocketMq和kafka之间二选一。一方面,大型软件公司,具备足够的资金搭建分布式环境,也具备足够大的数据量。针对rocketMQ,大型软件公司也可以抽出人手对rocketMQ进行定制化开发,毕竟国内有能力改JAVA源码的人,还是相当多的。至于kafka,根据业务场景选择,如果有日志采集功能,肯定是首选kafka了。
2.3 什么是RabbitMQ?
AMQP,即 Advanced Message Queuing Protocol(高级消息队列协议),是一个网络协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。2006年,AMQP规范发布。类比HTTP。
2.4 为什么使用RabbitMQ?
2.4.1 解耦
- 传统模式:耦合性太强,系统A在代码中直接调用系统B和系统C的代码,如果将来D系统接入,系统A还需要修改代码,过于麻烦!
- 中间件模式:将消息写入到对列中,需要消息的系统自己从消息队列中订阅,从而系统A不需要做任何改变
2.4.2 异步
- 传统模式:一些非必要的业务逻辑以同步的方式运行,太耗费时间
- 中间件模式:将消息写入消息队列,非必要的业务逻辑以异步的方式运行,加快响应速度
2.4.3 削峰
- 传统模式:并发量大的时候,所有的请求直接怼到数据库,造成数据库连接异常
- 中间件模式:系统A慢慢的按照数据库能处理的并发量,从消息队列中慢慢拉取消息(秒杀商品)
三. RabbitMQ的安装(linux系统安装)
3.1 下载:
官网下载http://www.rabbitmq.com/download.html
3.2 安装Erlang
- 上传安装包到linux系统下
- 进入上传后的目录下,依次执行命令:
1)rpm -ivh esl-erlang-17.3-1.x86_64.rpm --force --nodeps
2)rpm -ivh esl-erlang_17.3-1~centos~6_amd64.rpm --force --nodeps
3)rpm -ivh esl-erlang-compat-R14B-1.el6.noarch.rpm --force --nodeps
3.3 安装RabbitMQ
- 上传安装包到linux系统下
-
进入上传后的目录下,执行命令:
rpm -ivh rabbitmq-server-3.4.1-1.noarch.rpm
3.4 启动和停止
service rabbitmq-server start #启动服务
service rabbitmq-server stop #停止服务
service rabbitmq-server restart #重启服务
service rabbitmq-server status #查看当前服务
3.5 设置开机自启
chkconfig rabbitmq-server on
3.6 防火墙开放15672端口--外部可访问
/sbin/iptables -I INPUT -p tcp --dport 15672 -j ACCEPT
/etc/rc.d/init.d/iptables save
3.7 开启web界面管理工具
rabbitmq-plugins enable rabbitmq_management
service rabbitmq-server restart
3.8 创建账户
这样就算安装成功了,他默认有一个账户,账号guest具有所有的操作权限,并且又是默认账号,出于安全因素的考虑,guest用户只能通过localhost登陆,并且只能在安装机器上使用
我们创建一个admin账户,创建一个账户并支持远程ip访问
- 1. 创建账户
rabbitmqctl add_user admin 1111
- 2. 给用户添加角色
rabbitmqctl set_user_tags admin administrator
- 3. 设置用户权限
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
- 4.设置完成后可以查看当前用户和角色(需要开启服务)
rabbitmqctl list_users
3.9 测试
浏览器输入:serverip:15672。其中serverip是RabbitMQ-Server所在主机的ip,15672是RabbitMQ-Server的端口号
四. RabbitMQ管理界面
4.1 主页总览
connections:无论生产者还是消费者,都需要与RabbitMQ建立连接后才可以完成消息的生产和消费,在这里可以查看连接情况
channels:通道,建立连接后,会形成通道,消息的投递获取依赖通道。
Exchanges:交换机,用来实现消息的路由
Queues:队列,即消息队列,消息存放在队列中,等待消费,消费后被移除队列。
端口:
5672: rabbitMq的编程语言客户端连接端口
15672:rabbitMq管理界面端口
25672:rabbitMq集群的端口
4.2 添加用户
如果不使用guest,我们也可以自己创建一个用户:
1、 超级管理员(administrator)
可登陆管理控制台,可查看所有的信息,并且可以对用户,策略(policy)进行操作。
2、 监控者(monitoring)
可登陆管理控制台,同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)
3、 策略制定者(policymaker)
可登陆管理控制台, 同时可以对policy进行管理。但无法查看节点的相关信息(上图红框标识的部分)。
4、 普通管理者(management)
仅可登陆管理控制台,无法看到节点信息,也无法对策略进行管理。
5、 其他
无法登陆管理控制台,通常就是普通的生产者和消费者
4.3 创建Virtual Hosts
虚拟主机:类似于mysql中的database。他们都是以“/”开头
4.4 设置权限
1. 点击用户名
2、设置权限
文章来源:https://www.toymoban.com/news/detail-401872.html
3、查看效果文章来源地址https://www.toymoban.com/news/detail-401872.html
到了这里,关于RabbitMQ入门系列01----RabbitMQ简介的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!