RabbitMQ部署及简单应用

Stella981
• 阅读 348

一、RabbitMQ简单介绍

RabbitMQ就是当前最主流的消息中间件之一。RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。 在目前分布式的大环境下,成为非常常用的消息队列,以下详细说明在linux环境下,怎么通过源码安装rabbitmq,并列举简单的维护,方便运维同学能更好的维护rabbitmq的正常运行。由于一般生产环境,不管是erlang还是 rabbitmq都不能随便进行版本升级,每次升级都是要谨慎的,所以这里推荐都使用源码安装,这样就固定了版本,不会出现通过yum安装的话,不小心升级了版本导致服务故障等的问题。当然yum安装会更简单,这里就不做介绍,有兴趣的参考官方文档即可。

二、安装rabbitmq

RabbitMQ是Erlang语言编写,安装RabbitMQ之前,需要先安装Erlang,Elang环境一定要与RabbitMQ版本匹配,可根据官网查看RabbitMQ版本对应Erlang的版本;我们安装rabbitmq3.7.20版本,对应的erlang是最低是21.3,我们选择21.3

1、安装Erlang

进入Erlang官网,下载对应版本Erlang,并解压

wget http://erlang.org/download/otp_src_21.3.tar.gz
tar xf otp_src_21.3.tar.gz
cd otp_src_21.3

安装依赖

yum install -y make gcc gcc-c++ m4 openssl openssl-devel ncurses-devel unixODBC unixODBC-devel java java-devel

初始化配置

./configure --prefix=/usr/local/erlang

出现wx相关提示,可以忽略不记,不影响正常编译

编译安装

make && make install

加入环境变量

echo 'export PATH=/usr/local/erlang/bin:$PATH' >>/etc/profile
source /etc/profile

到此,既安装完成,直接输入erl,得到如下

[root@test ~]# erl
Erlang/OTP 21 [erts-10.3] [source] [64-bit] [smp:1:1] [ds:1:1:10] [async-threads:1] [hipe]
Eshell V10.3  (abort with ^G)
1>

2、安装rabbitmq-server

官网上,或者在github上,找到对应版本下载

wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.20/rabbitmq-server-generic-unix-3.7.20.tar.xz

解压

tar xf rabbitmq-server-generic-unix-3.7.20.tar.xz -C /usr/local/src

创建软连接,添加环境变量

ln -s /usr/local/src/rabbitmq_server-3.7.20 /usr/local/rabbitmq
echo 'export PATH=/usr/local/rabbitmq/sbin:$PATH' >>/etc/profile
source /etc/profile

到此,服务已经部署完毕!

三、rabbitmq简单运用

默认rabbitmq是没有配置文件的,也是可以启动服务的。若是需要配置文件,去github上,复制一个配置文件模版过来,最新的3.7.0以上的版本可以使用新的key-value形式的配置文件rabbitmq.conf,和原来erlang格式的advanced.config相结合,解决一下key-value形式不好定义的配置。yum或者rpm安装的rabbitmq的配置文件在/etc/rabbitmq下,而编译安装默认的配置文件路径在--prefix指定目录下的etc/rabbitmq目录下。

1、启动服务与停止服务

启动服务

rabbitmq-server (前台运行)
rabbitmq-server -detached(后台运行)

查看端口

[root@test ~]# netstat -lntup|egrep "5672|25672|15672"
tcp        0     0 0.0.0.0:25672      0.0.0.0:*               LISTEN      50904/beam.smp
tcp6      0     0 :::5672                 :::*                LISTEN      50904/beam.smp

停服务

rabbitmqctl stop

2、开启Web管理界面

加载插件管理界面

rabbitmq-plugins enable rabbitmq_management      

查看端口

[root@test ~]# netstat -lntup|egrep "5672|25672|15672"
tcp        0     0 0.0.0.0:15672      0.0.0.0:*               LISTEN      50904/beam.smp
tcp        0     0 0.0.0.0:25672      0.0.0.0:*               LISTEN      50904/beam.smp
tcp6      0     0 :::5672                 :::*                LISTEN      50904/beam.smp

浏览器访问 http://ip:15672

3、添加用户

使用默认的用户 guest / guest (此也为管理员用户)登陆,会发现无法登陆,报错:User can only log in via localhost。那是因为默认是限制了guest用户只能在本机登陆,也就是只能登陆localhost:15672。可以通过修改配置文件rabbitmq.conf,取消这个限制;一般为了安全考虑,会删除此用户,添加新用户。

添加用户: 
rabbitmqctl add_user username password
删除用户: 
rabbitmqctl delete_user username
修改密码: 
rabbitmqctl change_password username newpassword
设置用户角色: 
rabbitmqctl set_user_tags username administrator
列出用户: 
rabbitmqctl list_users

4、用户角色

  • 超级管理员(administrator) 可登陆管理控制台,可查看所有的信息,并且可以对用户,策略(policy)进行操作。
  • 监控者(monitoring) 可登陆管理控制台,同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)
  • 策略制定者(policymaker) 可登陆管理控制台, 同时可以对policy进行管理。但无法查看节点的相关信息(上图红框标识的部分)。
  • 普通管理者(management) 仅可登陆管理控制台,无法看到节点信息,也无法对策略进行管理。
  • 其他 无法登陆管理控制台,通常就是普通的生产者和消费者。

5、创建Virtual Hosts

RabbitMQ部署及简单应用

选中Admin用户,设置权限: RabbitMQ部署及简单应用 看到权限已加: RabbitMQ部署及简单应用

6、权限管理

列出所有用户权限: 
rabbitmqctl list_permissions
查看制定用户权限: 
rabbitmqctl list_user_permissions username
清除用户权限: 
rabbitmqctl clear_permissions [-p vhostpath] username
设置用户权限: 
rabbitmqctl set_permissions [-p vhostpath] username conf write read

注意:

​ conf: 一个正则匹配哪些资源能被该用户访问 ​ write:一个正则匹配哪些资源能被该用户写入 ​ read:一个正则匹配哪些资源能被该用户读取

7、修改数据文件和日志文件的存放位置

默认数据文件与日志文件在默认安装路劲的var目录下,要更改文件存放位置。需要以下操作:

(1)先创建数据文件和日志文件存放位置的目录并给权限

mkdir -p /data/rabbitmq/{data,log}

(2)新增环境参数配置文件

cat << EOF >/usr/local/rabbitmq/etc/rabbitmq/rabbitmq-env.conf
RABBITMQ_MNESIA_BASE=/data/rabbitmq/data
RABBITMQ_LOG_BASE=/data/rabbitmq/log
EOF

(3)重启服务

​ 注:更换完位置后原有队列中的数据就没有了,而且原有的rabbitmq用户也需要重建。

四、RabbitMQ的五种队列模式:

1.1 simple简单模式

RabbitMQ部署及简单应用

  1. 消息产生着§将消息放入队列
  2. 消息的消费者(consumer) 监听(while) 消息队列,如果队列中有消息,就消费掉,消息被拿走后,自动从队列中删除(隐患 消息可能没有被消费者正确处理,已经从队列中消失了,造成消息的丢失)应用场景:聊天(中间有一个过度的服务器;p端,c端)
1.2 work工作模式(资源的竞争)

RabbitMQ部署及简单应用

  1. 消息产生者将消息放入队列消费者可以有多个,消费者1,消费者2,同时监听同一个队列,消息被消费?C1 C2共同争抢当前的消息队列内容,谁先拿到谁负责消费消息(隐患,高并发情况下,默认会产生某一个消息被多个消费者共同使用,可以设置一个开关(syncronize,与同步锁的性能不一样) 保证一条消息只能被一个消费者使用)
  2. 应用场景:红包;大项目中的资源调度(任务分配系统不需知道哪一个任务执行系统在空闲,直接将任务扔到消息队列中,空闲的系统自动争抢)
1.3 publish/subscribe发布订阅(共享资源)

RabbitMQ部署及简单应用

  1. X代表交换机rabbitMQ内部组件,erlang 消息产生者是代码完成,代码的执行效率不高,消息产生者将消息放入交换机,交换机发布订阅把消息发送到所有消息队列中,对应消息队列的消费者拿到消息进行消费
  2. 相关场景:邮件群发,群聊天,广播(广告)
1.4 routing路由模式

RabbitMQ部署及简单应用

  1. 消息生产者将消息发送给交换机按照路由判断,路由是字符串(info) 当前产生的消息携带路由字符(对象的方法),交换机根据路由的key,只能匹配上路由key对应的消息队列,对应的消费者才能消费消息;
  2. 根据业务功能定义路由字符串
  3. 从系统的代码逻辑中获取对应的功能字符串,将消息任务扔到对应的队列中业务场景:error 通知;EXCEPTION;错误通知的功能;传统意义的错误通知;客户通知;利用key路由,可以将程序中的错误封装成消息传入到消息队列中,开发者可以自定义消费者,实时接收错误;
1.5 topic 主题模式(路由模式的一种)

RabbitMQ部署及简单应用

  1. 星号井号代表通配符
  2. 星号代表多个单词,井号代表一个单词
  3. 路由功能添加模糊匹配
  4. 消息产生者产生消息,把消息交给交换机
  5. 交换机根据key的规则模糊匹配到对应的队列,由队列的监听消费者接收消息消费
点赞
收藏
评论区
推荐文章
blmius blmius
1年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
刚刚好 刚刚好
6个月前
css问题
1、在IOS中图片不显示(给图片加了圆角或者img没有父级)<div<imgsrc""/</divdiv{width:20px;height:20px;borderradius:20px;overflow:h
小森森 小森森
3天前
租房类微信小程序-基于微信云开发-小程序端集成了管理员后台-一键部署,快速发布
温馨提醒本项目使用MITLicense协议,仅适用于学习交流,并且不提供无偿的、不提供无偿的、不提供无偿的维护修改服务(但可提issue)。若直接将本项目用于商用,因本项目带来的所有后果由使用者自行承担。如需商用升级版,请联系我微信,微信二维码在本博客页面右上角在此奉劝某些人,请尊重作者的劳动成果,做人积点德吧!最近发现有人拿我的源码进行二次分
小森森 小森森
3天前
计划助手V1.0-微信小程序(QQ小程序)-源代码分享
疫情期间在家感觉好无聊啊,于是利用空闲时间做了一个用来记录和管理小目标时间的小程序,命名为《小沙漏》。QQ版本小程序同步上线,QQ小程序叫《时间小沙漏》,欢迎大家前来体验,后期也会添加其他的新功能哦【区别】:微信小程序的代码与QQ小程序的源码是不一样的。微信小程序的源码基于微信小程序云开发,需要在有网络的情况下使用,具有同步功能,所有记录在删除小
小森森 小森森
6个月前
校园表白墙微信小程序V1.0 SayLove -基于微信云开发-一键快速搭建,开箱即用
后续会继续更新,敬请期待2.0全新版本欢迎添加左边的微信一起探讨!项目地址:(https://www.aliyun.com/activity/daily/bestoffer?userCodesskuuw5n)\2.Bug修复更新日历2.情侣脸功能大家不要使用了,现在阿里云的接口已经要收费了(土豪请随意),\\和注意
晴空闲云 晴空闲云
6个月前
css中box-sizing解放盒子实际宽高计算
我们知道传统的盒子模型,如果增加内边距padding和边框border,那么会撑大整个盒子,造成盒子的宽度不好计算,在实务中特别不方便。boxsizing可以设置盒模型的方式,可以很好的设置固定宽高的盒模型。盒子宽高计算假如我们设置如下盒子:宽度和高度均为200px,那么这会这个盒子实际的宽高就都是200px。但是当我们设置这个盒子的边框和内间距的时候,那
艾木酱 艾木酱
5个月前
快速入门|使用MemFire Cloud构建React Native应用程序
MemFireCloud是一款提供云数据库,用户可以创建云数据库,并对数据库进行管理,还可以对数据库进行备份操作。它还提供后端即服务,用户可以在1分钟内新建一个应用,使用自动生成的API和SDK,访问云数据库、对象存储、用户认证与授权等功能,可专
Stella981 Stella981
1年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
1年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
helloworld_28799839 helloworld_28799839
6个月前
常用知识整理
Javascript判断对象是否为空jsObject.keys(myObject).length0经常使用的三元运算我们经常遇到处理表格列状态字段如status的时候可以用到vue
helloworld_34035044 helloworld_34035044
8个月前
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为