消息队列之RabbitMQ

千羽 2021-01-14 14:48:21
java rabbitMQ 腾讯云 队列 消息


思维导图

RabbitMQ

1. 消息中间件概述

1.1. 什么是消息中间件

MQ全称为Message Queue,消息队列是应用程序和应用程序之间的通信方法。

  • 为什么使用MQ 在项目中,可将一些无需即时返回且耗时的操作提取出来,进行异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高系统吞吐量
  • 开发中消息队列通常有如下应用场景: 1、任务异步处理 将不需要同步处理的并且耗时长的操作由消息队列通知消息接收方进行异步处理。提高了应用程序的响应时间。 2、应用程序解耦合 MQ相当于一个中介,生产方通过MQ与消费方交互,它将应用程序进行解耦合。 3、削峰填谷 如订单系统,在下单的时候就会往数据库写数据。但是数据库只能支撑每秒1000左右的并发写入,并发量再高就容易宕机(电脑不能正常工作)。低峰期的时候并发也就100多个,但是在高峰期时候,并发量会突然激增到5000以上,这个时候数据库肯定卡死了。

消息被MQ保存起来了,然后系统就可以按照自己的消费能力来消费,比如每秒1000个数据,这样慢慢写入数据库,这样就不会卡死数据库了。

但是使用了MQ之后,限制消费消息的速度为1000,但是这样一来,高峰期产生的数据势必会被积压在MQ中,高峰就被掉了。但是因为消息积压,在高峰期过后的一段时间内,消费消息的速度还是会维持在1000QPS,直到消费完积压的消息,这就叫做“填谷”

1.2. AMQP 和 JMS

MQ是消息通信的模型;实现MQ的大致有两种主流方式:AMQPJMS

1.2.1. AMQP

AMQP是一种协议,更准确的说是一种binary wire-level protocol(链接协议)。这是其和JMS的本质差别,AMQP不从API层进行限定,而是直接定义网络交换的数据格式。

1.2.2. JMS

JMSJava消息服务(JavaMessage Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。

1.2.3. AMQP 与 JMS 区别

  • JMS是定义了统一的接口,来对消息操作进行统一;AMQP是通过规定协议来统一数据交互的格式
  • JMS限定了必须使用Java语言;AMQP只是协议,不规定实现方式,因此是跨语言的。
  • JMS规定了两种消息模式;而AMQP的消息模式更加丰富

1.3. 消息队列产品

市场上常见的消息队列有如下:

  • ActiveMQ:基于JMS
  • ZeroMQ:基于C语言开发
  • RabbitMQ:基于AMQP协议,erlang语言开发,稳定性好
  • RocketMQ:基于JMS,阿里巴巴产品
  • Kafka:类似MQ的产品;分布式消息系统,高吞吐量

1.4. RabbitMQ

RabbitMQ是由erlang语言开发,基于AMQPAdvanced Message Queue 高级消息队列协议)协议实现的消息队列,它是一种应用程序之间的通信方法,消息队列在分布式系统开发中应用非常广泛。

RabbitMQ官方地址:http://www.rabbitmq.com/

RabbitMQ提供了6种模式:

  1. 简单模式
  2. work模式
  3. Publish/Subscribe发布与订阅模式
  4. Routing路由模式
  5. Topics主题模式
  6. RPC远程调用模式(远程调用,不太算MQ;暂不作介绍);

官网对应模式介绍:https://www.rabbitmq.com/getstarted.html

2. 安装及配置RabbitMQ

注意: 请使用资料里提供的CentOS-7-x86_64-DVD-1810.iso 安装虚拟机. 这里以腾讯云服务器展示

1. 安装依赖环境

在线安装依赖环境:

yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c++ kernel-devel m4 ncurses-devel tk tc xz

2. 安装Erlang

上传 put -r D:/..

  • erlang-18.3-1.el7.centos.x86_64.rpm
  • socat-1.7.3.2-5.el7.lux.x86_64.rpm
  • rabbitmq-server-3.6.5-1.noarch.rpm
# 安装 erlang
[root@VM_0_16_centos rabbitmq]# rpm -ivh erlang-18.3-1.el7.centos.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:erlang-18.3-1.el7.centos ################################# [100%]
[root@VM_0_16_centos rabbitmq]#

如果出现如下错误

说明gblic 版本太低。我们可以查看当前机器的gblic 版本

strings /lib64/libc.so.6 | grep GLIBC

当前最高版本2.12,需要2.15.所以需要升级glibc

使用yum更新安装依赖

sudo yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make -y

下载rpm包

wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-utils-2.17-55.el6.x86_64.rpm &
wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-static-2.17-55.el6.x86_64.rpm &
wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-2.17-55.el6.x86_64.rpm &
wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-common-2.17-55.el6.x86_64.rpm &
wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-devel-2.17-55.el6.x86_64.rpm &
wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-headers-2.17-55.el6.x86_64.rpm &
wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/nscd-2.17-55.el6.x86_64.rpm &

安装rpm包

sudo rpm -Uvh *-2.17-55.el6.x86_64.rpm --force --nodeps

安装完毕后再查看glibc版本,发现glibc版本已经到2.17了

strings /lib64/libc.so.6 | grep GLIBC

3. 安装RabbitMQ

# 安装 socat
[root@VM_0_16_centos rabbitmq]# rpm -ivh socat-1.7.3.2-1.1.el7.x86_64.rpm
warning: socat-1.7.3.2-1.1.el7.x86_64.rpm: Header V4 RSA/SHA1 Signature, key ID 87e360b8: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:socat-1.7.3.2-1.1.el7 ################################# [100%]
[root@VM_0_16_centos rabbitmq]#
# 安装 rabbitmq-server
[root@VM_0_16_centos rabbitmq]# rpm -ivh rabbitmq-server-3.6.5-1.noarch.rpm
warning: rabbitmq-server-3.6.5-1.noarch.rpm: Header V4 RSA/SHA1 Signature, key ID 6026dfca: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:rabbitmq-server-3.6.5-1 ################################# [100%]
[root@VM_0_16_centos rabbitmq]#

4. 开启管理界面及配置

# 开启管理界面
rabbitmq-plugins enable rabbitmq_management
# 修改默认配置信息
vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/ebin/rabbit.app
# 比如修改密码、配置等等,例如:loopback_users 中的 <<"guest">>,只保留guest

5. 启动

service rabbitmq-server start # 启动服务
service rabbitmq-server stop # 停止服务
service rabbitmq-server restart # 重启服务
  • 设置配置文件
cd /usr/share/doc/rabbitmq-server-3.6.5/
cp rabbitmq.config.example /etc/rabbitmq/rabbitmq.config

6. 配置虚拟主机及用户

6.1. 用户角色

RabbitMQ在安装好后,可以访问http://ip地址:15672 ;其自带了guest/guest的用户名和密码;如果需要创建自定义用户;那么也可以登录管理界面后,如下操作:

登录页面

登录成功

添加用户

角色说明

1、 超级管理员(administrator)

可登陆管理控制台,可查看所有的信息,并且可以对用户,策略(policy)进行操作。

2、 监控者(monitoring)

可登陆管理控制台,同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)

3、 策略制定者(policymaker)

可登陆管理控制台, 同时可以对policy进行管理。但无法查看节点的相关信息(上图红框标识的部分)。

4、 普通管理者(management)

仅可登陆管理控制台,无法看到节点信息,也无法对策略进行管理。

5、 其他

无法登陆管理控制台,通常就是普通的生产者和消费者。

6.2. Virtual Hosts配置

像mysql拥有数据库的概念并且可以指定用户对库和表等操作的权限。RabbitMQ也有类似的权限管理;在RabbitMQ中可以虚拟消息服务器Virtual Host,每个Virtual Hosts相当于一个相对独立的RabbitMQ服务器,每个VirtualHost之间是相互隔离的。exchange、queue、message不能互通。相当于mysql的db。Virtual Name一般以/开头。

6.2.1. 创建Virtual Hosts

6.2.2. 设置Virtual Hosts权限

  • 解决not found问题

/usr/share/doc/rabbitmq-server-3.6.5/rabbitmq.config.example复制到指定/etc/rabbitmq/rabbitmq.config,然后重新启动service rabbitmq-server restart

[root@VM_0_16_centos ~]# cd /usr/share/doc/rabbitmq-server-3.6.5/
[root@VM_0_16_centos rabbitmq-server-3.6.5]# ll
total 200
-rw-r--r-- 1 root root 28945 Aug 5 2016 LICENSE
-rw-r--r-- 1 root root 11358 Aug 5 2016 LICENSE-APACHE2-ExplorerCanvas
-rw-r--r-- 1 root root 10175 Aug 5 2016 LICENSE-APL2-Rebar
-rw-r--r-- 1 root root 10851 Aug 5 2016 LICENSE-APL2-Stomp-Websocket
-rw-r--r-- 1 root root 1206 Aug 5 2016 LICENSE-BSD-base64js
-rw-r--r-- 1 root root 1304 Aug 5 2016 LICENSE-BSD-glMatrix
-rw-r--r-- 1 root root 14041 Aug 5 2016 LICENSE-EPL-OTP
-rw-r--r-- 1 root root 1087 Aug 5 2016 LICENSE-MIT-EJS10
-rw-r--r-- 1 root root 1069 Aug 5 2016 LICENSE-MIT-Flot
-rw-r--r-- 1 root root 1075 Aug 5 2016 LICENSE-MIT-jQuery164
-rw-r--r-- 1 root root 1087 Mar 31 2016 LICENSE-MIT-Mochi
-rw-r--r-- 1 root root 1087 Aug 5 2016 LICENSE-MIT-Mochiweb
-rw-r--r-- 1 root root 1076 Aug 5 2016 LICENSE-MIT-Sammy060
-rw-r--r-- 1 root root 1056 Aug 5 2016 LICENSE-MIT-SockJS
-rw-r--r-- 1 root root 16726 Aug 5 2016 LICENSE-MPL2
-rw-r--r-- 1 root root 24897 Aug 5 2016 LICENSE-MPL-RabbitMQ
-rw-r--r-- 1 root root 21023 Apr 11 2016 rabbitmq.config.example
-rw-r--r-- 1 root root 943 Mar 31 2016 README
-rw-r--r-- 1 root root 277 Mar 31 2016 set_rabbitmq_policy.sh.example
[root@VM_0_16_centos rabbitmq-server-3.6.5]# cp ./rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
[root@VM_0_16_centos rabbitmq-server-3.6.5]# service rabbitmq-server restart
Restarting rabbitmq-server (via systemctl): [ OK ]
[root@VM_0_16_centos rabbitmq-server-3.6.5]#

刷新页面就成功啦

  • ? WeChat : 1210331079
  • ? QQ : 1210331079
  • ? 邮箱 : shaotongjie@gmail.com
  • ? 个人博客 : https://nateshao.gitee.io 或者 https://nateshao.github.io
  • ? GitHub : https://github.com/nateshao
  • ? Gitee : https://gitee.com/nateshao
  • ? 微信公众号 : 千羽的编程时光

本文分享自微信公众号 - 千羽的编程时光(gh_7adc8f5689e2)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间: 2020-09-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

版权声明
本文为[千羽]所创,转载请带上原文链接,感谢
https://cloud.tencent.com/developer/article/1773488

  1. Redis basic command
  2. Summary of MySQL articles
  3. 2、 Create k8s cluster in 5 seconds
  4. data自定义属性在jQuery中的用法
  5. Linux常见解压缩
  6. Detailed explanation of HBase basic principle
  7. 1、 Why and how to learn k8s
  8. Java advanced (29) -- HashMap set
  9. java中大文件上传
  10. Weblogic 2017-3248 analysis of Java Security
  11. Kubernetes official java client 8: fluent style
  12. Explain the function of thread pool and how to use it in Java
  13. Programming software tutorial video Encyclopedia: C + + / Java / Python / assembly / easy language (with tutorial)
  14. Description of dependency problem after javacv is updated to 1.5. X and how to reduce the size of dependency package
  15. Java reflection & dynamic agent
  16. Building Apache 2.4 + php7 + mysql8 in centos7 environment
  17. Summary of Java multithreading (1)
  18. Oracle AWR report generation
  19. Four magic functions of mybatis, don't step on the pit!
  20. A 16-year-old high school student successfully transplanted Linux to iPhone and posted a detailed guide
  21. Centos7 one click installation of JDK1.8 shell script
  22. Mounting of file system in Linux (centos7)
  23. How does serverless deal with the resource supply demand of k8s in the offline scenario
  24. Detailed explanation of HBase basic principle
  25. Spring security oauth2.0 authentication and authorization 4: distributed system authentication and authorization
  26. Redis performance Part 5 redis buffer
  27. JavaScript this keyword
  28. Summary of Java multithreading (3)
  29. Sentry(v20.12.1) K8S 云原生架构探索, SENTRY FOR JAVASCRIPT 手动捕获事件基本用法
  30. Sentry(v20.12.1) K8S 云原生架构探索, SENTRY FOR JAVASCRIPT 手动捕获事件基本用法
  31. (10) Spring from the beginning to the end
  32. Summary of Java multithreading (2)
  33. Spring source notes! From the introduction to the source code, let you really understand the source code
  34. A stormy sunny day
  35. Zookeeper (curator), the implementation of distributed lock
  36. Show the sky! Tencent T4's core Java Dictionary (framework + principle + Notes + map)
  37. Spring boot project, how to gracefully replace the blank value in the interface parameter with null value?
  38. Spring boot project, how to gracefully replace the blank value in the interface parameter with null value?
  39. docker+mysql集群+读写分离+mycat管理+垂直分库+负载均衡
  40. docker+mysql集群+读写分离+mycat管理+垂直分库+负载均衡
  41. To what extent can I go out to work?
  42. Java 使用拦截器无限转发/重定向无限循环/重定向次数过多报错(StackOverflowError) 解决方案
  43. Implementation of rocketmq message sending based on JMeter
  44. How to choose the ticket grabbing app in the Spring Festival? We have measured
  45. Implementation of rocketmq message sending based on JMeter
  46. My programmer's Road: self study java
  47. My programmer's Road: self study java
  48. All in one, one article talks about the use of virtual machine VirtualBox and Linux
  49. All in one, one article talks about the use of virtual machine VirtualBox and Linux
  50. Java 使用拦截器无限转发/重定向无限循环/重定向次数过多报错(StackOverflowError) 解决方案
  51. [Java training project] Java ID number recognition system
  52. How does serverless deal with the resource supply demand of k8s in the offline scenario
  53. Detailed explanation of HBase basic principle
  54. Explain the function of thread pool and how to use it in Java
  55. Kubernetes official java client 8: fluent style
  56. 010_MySQL
  57. Vibrant special purchases for the Spring Festival tiktok section, hundreds of good things to make the year more rich flavor.
  58. 010_MySQL
  59. Of the 4 million docker images, 51% have high-risk vulnerabilities
  60. Rocketmq CPP client visual studio 2019 compilation