RabbitMQ部署及简单应用

Stella981
• 阅读 543

一、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
2年前
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
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
4个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这