当前位置:   article > 正文

RabbitMQ 简介以及安装使用_rabbitmq active: activating (start)

rabbitmq active: activating (start)

一、RabbitMQ简介

1、简介

MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过 队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。

RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、 安全。AMQP协议更多用在企业系统内,对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。

2、RabbitMQ使用场景

1. 解耦(为面向服务的架构(SOA)提供基本的最终一致性实现)

场景说明:用户下单后,订单系统需要通知库存系统。传统的做法是,订单系统调用库存系统的接口。

 

传统模式的缺点:

假如库存系统无法访问,则订单减库存将失败,从而导致订单失败订单系统与库存系统耦合引入消息队列

 

订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作假如:在下单时库存系统不能正常使用。也不影响正常下单,因为下单后,订单系统写入消息队列就不再关心其他的后续操作了。实现订单系统与库存系统的应用解耦为了保证库存肯定有,可以将队列大小设置成库存数量,或者采用其他方式解决。基于消息的模型,关心的是“通知”,而非“处理”。

短信、邮件通知、缓存刷新等操作使用消息队列进行通知。

 

消息队列和RPC的区别与比较:

RPC: 异步调用,及时获得调用结果,具有强一致性结果,关心业务调用处理结果。消息队列:两次异步RPC调用,将调用内容在队列中进行转储,并选择合适的时机进行投递(错峰流控)

2. 异步提升效率

场景说明:用户注册后,需要发注册邮件和注册短信。传统的做法有两种1.串行的方式;2.并行方式

扩展:

异步并发利器:实际项目中使用CompletionService提升系统性能的一次实践

(1)串行方式:将注册信息写入数据库成功后,发送注册邮件,再发送注册短信。以上三个任务全部完成后,返回给客户端

 

(2)并行方式:将注册信息写入数据库成功后,发送注册邮件的同时,发送注册短信。以上三个任务完成后,返回给客户端。与串行的差别是,并行的方式可以提高处理的时间

 

引入消息队列,将不是必须的业务逻辑,异步处理。改造后的架构如下:

3. 流量削峰

流量削峰也是消息队列中的常用场景,一般在秒杀或团抢活动中使用广泛

应用场景:系统其他时间A系统每秒请求量就100个,系统可以稳定运行。系统每天晚间八点有秒杀活动,每秒并发请求量增至1万条,但是系统最大的处理能力只能每秒处理1000个请求,于是系统崩溃,服务器宕机。

之前架构:大量用户(100万用户)通过浏览器在晚上八点高峰期同时参与秒杀活动。大量的请求涌入我们的系统中,高峰期达到每秒钟5000个请求,大量的请求打到MySQL上,每秒钟预计执行3000条SQL。但是一般的MySQL每秒钟扛住2000个请求就不错了,如果达到3000个请求的话可能MySQL直接就瘫痪了,从而系统无法被使用。但是高峰期过了之后,就成了低峰期,可能也就1万用户访问系统,每秒的请求数量也就50个左右,整个系统几乎没有任何压力。

引入MQ:100万用户在高峰期的时候,每秒请求有5000个请求左右,将这5000请求写入MQ里面,系统A每秒最多只能处理2000请求,因为MySQL每秒只能处理2000个请求。系统A从MQ中慢慢拉取请求,每秒就拉取2000个请求,不要超过自己每秒能处理的请求数量即可。MQ,每秒5000个请求进来,结果只有2000个请求出去,所以在秒杀期间(将近一小时)可能会有几十万或者几百万的请求积压在MQ中。

关于流量削峰:秒杀系统流量削峰这事儿应该怎么做?

这个短暂的高峰期积压是没问题的,因为高峰期过了之后,每秒就只有50个请求进入MQ了,但是系统还是按照每秒2000个请求的速度在处理,所以说,只要高峰期一过,系统就会快速将积压的消息消费掉。我们在此计算一下,每秒在MQ积压3000条消息,1分钟会积压18万,1小时积压1000万条消息,高峰期过后,1个多小时就可以将积压的1000万消息消费掉。

 

三. 引入消息队列的缺点

  • 系统可用性降低

系统引入的外部依赖增多,系统的稳定性就会变差。一旦MQ宕机,对业务会产生影响。这就需要考虑如何保证MQ的高可用。

  • 系统复杂度提高

引入MQ后系统的复杂度会大大提高。以前服务之间可以进行同步的服务调用,引入MQ后,会变为异步调用,数据的链路就会变得更复杂。并且还会带来其他一些问题。比如:如何保证消费不会丢失?不会被重复调用?怎么保证消息的顺序性等问题。

  • 消息一致性问题

A系统处理完业务,通过MQ发送消息给B、C系统进行后续的业务处理。如果B系统处理成功,C系统处理失败怎么办?这就需要考虑如何保证消息数据处理的一致性。

4、几大MQ产品选型特点比较

​常用的MQ产品包括Kafka、RabbitMQ和RocketMQ。我们对这三个产品做下简单的比较,重点需要理解他们的适用场景。

 二、RabbitMQ安装使用

1、实验环境

准备了三台虚拟机 192.168.232.128~130,预备搭建三台机器的集群。

​ 三台机器均预装CentOS7 操作系统。分别配置机器名 worker1,worker2,worker3。然后需要关闭防火墙(或者找到RabbitMQ的业务端口全部打开。 5672(amqp端口);15672(http Api端口);25672(集群通信端口))。

2、版本选择

RabbitMQ版本,通常与他的大的功能是有关系的。3.8.x版本主要是围绕Quorum Queue功能,而3.9.x版本主要是围绕Streams功能。目前还有3.10.x版本,还在rc阶段。我们这次选择3.9.15版本。

​ RabbitMQ是基于Erlang语言开发,所以安装前需要安装Erlang语言环境。需要注意下的是RabbitMQ与ErLang是有版本对应关系的。3.9.15版本的RabbitMQ只支持23.2以上到24.3版本的Erlang。

Docker hub上也已经有官方上传的镜像

3、安装Erlang语言包

这个语言包,在windows下的安装比较简单,是一个可执行程序,直接图形化安装就行了。

​ Linux上的安装稍微复杂,需要有非常多的依赖包。简单起见,可以下载rabbitmq提供的zero dependency版本。 下载地址 https://github.com/rabbitmq/erlang-rpm/releases

​ 下载完成后,可以尝试使用下面的指令安装

[root@worker1 tools]# rpm -ivh erlang-23.2.7-1.el7.x86_64.rpm 
警告:erlang-23.2.7-1.el7.x86_64.rpm: 头V4 RSA/SHA1 Signature, 密钥 ID 6026dfca: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:erlang-23.2.7-1.el7 ################################# [100%]

这样Erlang语言包就安装完成了。 安装完后可以使用 erl -version 指令检测下erlang是否安装成功。

[root@worker1 tools]# erl -version
Erlang (SMP,ASYNC_THREADS,HIPE) (BEAM) emulator version 11.1.8

4、安装RabbitMQ:

​ RabbitMQ的安装方式有很多,我们采用RPM安装包的方式。安装包可以到github仓库中下载发布包。下载地址:https://github.com/rabbitmq/rabbitmq-server/releases

​ 然后使用 rpm -Uvh 指令安装RabbitMQ的rpm包时,会报错,需要安装一个socat。

​ 而这个socat我也在网上下载到了rpm安装包。 socat-1.7.3.2-1.1.el7.x86_64.rpm ,但是安装时,却提示需要tcp_wrappers依赖。

  1. [root@worker2 tools]# rpm -ivh socat-1.7.3.2-1.1.el7.x86_64.rpm
  2. 警告:socat-1.7.3.2-1.1.el7.x86_64.rpm: 头V4 RSA/SHA1 Signature, 密钥 ID 87e360b8: NOKEY
  3. 错误:依赖检测失败:
  4. tcp_wrappers 被 socat-1.7.3.2-1.1.el7.x86_64 需要

这时,当然可以按他的提示去安装依赖包。 但是我就没有这么做了。 直接用yum安装这个socat依赖。在使用yum时,可以做一个小配置,将yum源配置成阿里的yum源,这样速度会比较快。

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

yum makecache

然后安装socat
yum install socat

 这时,当然可以按他的提示去安装依赖包。 但是我就没有这么做了。 直接用yum安装这个socat依赖。在使用yum时,可以做一个小配置,将yum源配置成阿里的yum源,这样速度会比较快。

  1. mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
  2. curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
  3. yum makecache
  4. 然后安装socat
  5. yum install socat

​ socat安装完成后,就可以安装RabbitMQ了。

  1. [root@worker1 tools]# rpm -Uvh rabbitmq-server-3.9.15-1.el7.noarch.rpm 
  2. 警告:rabbitmq-server-3.9.15-1.el7.noarch.rpm: 头V4 RSA/SHA512 Signature, 密钥 ID 6026dfca: NOKEY
  3. 准备中... ################################# [100%]
  4. 正在升级/安装...
  5. 1:rabbitmq-server-3.9.15-1.el7 ################################# [100%]

​ 安装完成后,可以查看下他的安装情况

  1. [root@worker1 share]# whereis rabbitmqctl
  2. rabbitmqctl: /usr/sbin/rabbitmqctl /usr/share/man/man8/rabbitmqctl.8.gz
  3. ##启动RabbitMQ服务
  4. [root@worker1 rabbitmq]# service rabbitmq-server start
  5. Redirecting to /bin/systemctl start rabbitmq-server.service
  6. Job for rabbitmq-server.service failed because the control process exited with error code. See "systemctl status rabbitmq-server.service" and "journalctl -xe" for details.
  7. ##查看服务状态
  8. [root@worker1 rabbitmq]# service rabbitmq-server status
  9. Redirecting to /bin/systemctl status rabbitmq-server.service
  10. ● rabbitmq-server.service - RabbitMQ broker
  11. Loaded: loaded (/usr/lib/systemd/system/rabbitmq-server.service; disabled; vendor preset: disabled)
  12. Active: activating (start) since 五 2022-04-22 17:16:47 CST; 5s ago
  13. Main PID: 4327 (beam.smp)
  14. Status: "Startup in progress"
  15. CGroup: /system.slice/rabbitmq-server.service
  16. ├─4327 /usr/lib64/erlang/erts-11.1.8/bin/beam.smp -W w -MBas ageffcbf -MHas ageffcbf -MBlmbcs 512 -MHlmbcs 512 -MMmcs 30 -P 1048576 -t 5000000 -stbt db -zdbbl 128000 -sbwt ...
  17. ├─4342 erl_child_setup 32768
  18. ├─4390 inet_gethost 4
  19. └─4391 inet_gethost 4
  20. 422 17:16:49 worker1 rabbitmq-server[4327]: 2022-04-22 17:16:49.126900+08:00 [info] <0.229.0> Feature flags: list of feature flags found:
  21. 422 17:16:49 worker1 rabbitmq-server[4327]: 2022-04-22 17:16:49.144773+08:00 [info] <0.229.0> Feature flags: [x] implicit_default_bindings
  22. 422 17:16:49 worker1 rabbitmq-server[4327]: 2022-04-22 17:16:49.144856+08:00 [info] <0.229.0> Feature flags: [x] maintenance_mode_status
  23. 422 17:16:49 worker1 rabbitmq-server[4327]: 2022-04-22 17:16:49.144903+08:00 [info] <0.229.0> Feature flags: [x] quorum_queue
  24. 422 17:16:49 worker1 rabbitmq-server[4327]: 2022-04-22 17:16:49.145025+08:00 [info] <0.229.0> Feature flags: [ ] stream_queue
  25. 422 17:16:49 worker1 rabbitmq-server[4327]: 2022-04-22 17:16:49.145075+08:00 [info] <0.229.0> Feature flags: [ ] user_limits
  26. 422 17:16:49 worker1 rabbitmq-server[4327]: 2022-04-22 17:16:49.145110+08:00 [info] <0.229.0> Feature flags: [x] virtual_host_metadata
  27. 422 17:16:49 worker1 rabbitmq-server[4327]: 2022-04-22 17:16:49.145154+08:00 [info] <0.229.0> Feature flags: feature flag states written to disk: yes
  28. 422 17:16:49 worker1 rabbitmq-server[4327]: 2022-04-22 17:16:49.605843+08:00 [noti] <0.44.0> Application syslog exited with reason: stopped
  29. 422 17:16:49 worker1 rabbitmq-server[4327]: 2022-04-22 17:16:49.605930+08:00 [noti] <0.229.0> Logging: switching to configured handler(s); following messages may not be... log output
  30. Hint: Some lines were ellipsized, use -l to show in full.

其他常用的启停操作:

rabbitmq-server -deched --后台启动服务

rabbitmqctl start_app --启动服务

rabbitmqctl stop_app --关闭服务

这样RabbitMQ服务就启动完成了。 之后可以配置下打开他的Web管理页面:

  1. [root@worker1 rabbitmq]# rabbitmq-plugins enable rabbitmq_management 
  2. Enabling plugins on node rabbit@worker1:
  3. rabbitmq_management
  4. The following plugins have been configured:
  5. rabbitmq_management
  6. rabbitmq_management_agent
  7. rabbitmq_web_dispatch
  8. Applying plugin configuration to rabbit@worker1...
  9. The following plugins have been enabled:
  10. rabbitmq_management
  11. rabbitmq_management_agent
  12. rabbitmq_web_dispatch
  13. set 3 plugins.
  14. Offline change; changes will take effect at broker restart.

​ 可以看到,这时需要重启RabbitMQ服务才能生效。重启后,就可以访问Web控制台了。 访问端口192.168.232.129:15672。

​ 这时,可以使用默认的guest/guest用户登录。 但是注意下,默认情况下,只允许在localhost本地登录,远程访问是无法登录的。这时,可以创建一个管理员账户来登录。

  1. [root@worker1 ~]# rabbitmqctl add_user admin admin
  2. Adding user "admin" ...
  3. Done. Don't forget to grant the user permissions to some virtual hosts! See 'rabbitmqctl help set_permissions' to learn more.
  4. [root@worker2 tools]# rabbitmqctl set_permissions -p / admin "." "." ".*"
  5. Setting permissions for user "admin" in vhost "/" ...
  6. [root@worker2 tools]# rabbitmqctl set_user_tags admin administrator
  7. Setting tags for user "admin" to [administrator] ...

​ 这样就可以用admin/admin用户登录Web控制台了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/443052
推荐阅读
相关标签
  

闽ICP备14008679号