热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

消息中间件Rabbitmq的使用

一:消息中间件的描述1、简介消息中间件也可以称消息队列,是指用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式

一:消息中间件的描述
1、简介
消息中间件也可以称消息队列,是指用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息队列模型,可以在分布式环境下扩展进程的通信。
当下主流的消息中间件有RabbitMQ、Kafka、ActiveMQ、RocketMQ等

2、消息中间件主要作用
• 冗余(存储)
• 扩展性
• 可恢复性
• 顺序保证
• 缓冲
• 异步通信
• 削峰 :消息队列中的常用场景,一般在秒杀或抢够活动中使用广泛。一般会因为流量过大,应用系统配置承载不了这股瞬间流量,导致系统直接挂掉,即传说中的“宕机”现象。为解决这个问题,我们会将那股巨大的流量拒在系统的上层,即将其转移至 MQ 而不直接涌入我们的接口。

二.消息队列之一RabbiMQ简介
1, RabbiMQ是⽤Erang开发的,集群⾮常⽅便,因为Erlang天⽣就是⼀⻔分布式语⾔,但其本身并不⽀持负载均衡,支持高并发,支持可扩展。支持AJAX,持久化,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

2, RabbiMQ的特点
• 可靠性
• 扩展性
• 高可用性
• 多种协议
• 多语言客户端
• 管理界面
• 插件机制

3.什么是消息队列
MQ 全称为Message Queue, 消息队列。是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。
消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信。

4.RabbiMQ模式
注意:RabbitMQ模式⼤概分为以下三种:
(1)单⼀模式 (一台主机部署rabbitmq)
(2)普通模式 (默认的集群模式)。
(3) 镜像模式 (把需要的队列做成镜像队列,存在于多个节点,属于RabbiMQ的HA⽅案,在对业务可靠性要求较⾼的场合中⽐较适⽤)。要实现镜像模式,需要先搭建⼀个普通集群模式,在这个模式的基础上再配置镜像模式以实现⾼可⽤,在镜像模式中设置策略可以将主rabbitmq中的数据同步到集群中其他节点里

++++++++++++RabbitMQ 集 群 基 础 部 署 (普通模式)++++++++++++

一:基础部署,集群里的主机都需要实施的操作

1,若有三台服务器作为三个节点,且都联⽹,关闭防火墙,selinux,编辑域名解析/etc/hosts(ip与主机名称应该对应好,要不然容易影响实验)
[root@rabbitmq-1 ~]# vim /etc/hosts
192.168.50.138 rabbitmq-1
192.168.50.139 rabbitmq-2
192.168.50.140 rabbitmq-3

2,三个节点配置安装rabbitmq软件
安装依赖:
[root@rabbitmq-1 ~]# yum install -y gcc-c++ unixODBC unixODBC-devel openssl-devel ncurses-devel
[root@rabbitmq-1 ~]# wget --content-disposition https://packagecloud.io/rabbitmq/erlang/packages/el/7/erlang-20.3-1.el7.centos.x86_64.rpm/download.rpm
[root@rabbitmq-1 ~]# rpm -ivh erlang-20.3-1.el7.centos.x86_64.rpm

测试;
[root@rabbitmq-1 ~]# erl

安装rabbitmq:
[root@rabbitmq-1 ~]# wget https://dl.bintray.com/rabbitmq/all/rabbitmq-server/3.7.5/rabbitmq-server-3.7.5-1.el7.noarch.rpm
[root@rabbitmq-1 ~]# yum install rabbitmq-server-3.7.5-1.el7.noarch.rpm

3.启动
启动方式一:
[root@rabbitmq-1 ~]# systemctl daemon-reload
[root@rabbitmq-1 ~]# systemctl start rabbitmq-server
[root@rabbitmq-1 ~]# systemctl enable rabbitmq-server
[root@rabbitmq-1 ~]# systemctl status rabbitmq-server
启动方式二:
[root@rabbitmq-1 ~]# /sbin/service rabbitmq-server status ---查看状态
[root@rabbitmq-1 ~]# /sbin/service rabbitmq-server start ---启动

4,开启rabbitmq的web访问界面:
[root@rabbitmq-1 ~]# rabbitmq-plugins enable rabbitmq_management


5.创建用户:
注意:创建用户只需要在一台主机上添加就可以,即把谁当作管理员就在哪儿创建
(1)添加用户和密码谁在
[root@rabbitmq-1 ~]# rabbitmqctl add_user soho 123
Creating user "soho" ...
...done.
(2)这是为管理员
[root@rabbitmq-1 ~]# rabbitmqctl set_user_tags soho administrator
Setting tags for user "soho" to [administrator] ...
...done.
(3)查看用户
[root@rabbitmq-1 ~]# rabbitmqctl list_users
Listing users ...
guest [administrator]
soho [administrator]
...done.
(4)权限
[root@rabbitmq-1 ~]# rabbitmqctl set_permissions -p "/" soho "." "." "."
Setting permissions for user "soho" in vhost "/" ...
...done.
此处设置权限时注意'.
'之间需要有空格 三个'.*'分别代表了conf权限,read权限与write权限 例如:当没有给
soho设置这三个权限前是没有权限查询队列,在ui界面也看不见


6,所有机器都操作:开启用户远程登录:
[root@rabbitmq-1 ~]# cd /etc/rabbitmq/
[root@rabbitmq-1 rabbitmq]# cp /usr/share/doc/rabbitmq-server-3.7.5/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
[root@rabbitmq-1 rabbitmq]# ls
enabled_plugins rabbitmq.config
[root@rabbitmq-1 rabbitmq]# vim rabbitmq.config
修改如下:

7.三台机器都操作重启服务服务:
[root@rabbitmq-1 ~]# systemctl restart rabbitmq-server
查看端口 所有机器都操作:开启用户远程登录:
[root@rabbitmq-1 ~]# cd /etc/rabbitmq/
[root@rabbitmq-1 rabbitmq]# cp /usr/share/doc/rabbitmq-server-3.7.5/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
[root@rabbitmq-1 rabbitmq]# ls
enabled_plugins rabbitmq.config
[root@rabbitmq-1 rabbitmq]# vim rabbitmq.config
修改如下:
消息中间件Rabbitmq的使用

8.三台机器都操作重启服务服务:
[root@rabbitmq-1 ~]# systemctl restart rabbitmq-server
查看端口
消息中间件Rabbitmq的使用
4369 -- erlang发现口
5672 --程序连接端口
15672 -- 管理界面ui端口
25672 -- server间内部通信口

9,注意如果是云服务器,切记添加安全组端口放行。
web访问:192.168.50.138:15672
这里需要注意:
rabbitmq默认管理员用户:guest 密码:guest
新添加的用户为:soho 密码:123

++++++++++++RabbitMQ 集 群 正 式 部 署 (普通模式)+++++++++++++

二,正式部署集群

1.首先创建好数据存放目录和日志存放目录
[root@rabbitmq-1 ~]# mkdir -p /data/rabbitmq/data
[root@rabbitmq-1 ~]# mkdir -p /data/rabbitmq/logs
[root@rabbitmq-1 ~]# chmod 777 -R /data/rabbitmq
[root@rabbitmq-1 ~]# chown rabbitmq.rabbitmq /data/ -R

2,创建配置文件:
[root@rabbitmq-1 ~]# vim /etc/rabbitmq/rabbitmq-env.conf (添加如下内容)
RABBITMQ_MNESIA_BASE=/data/rabbitmq/data
RABBITMQ_LOG_BASE=/data/rabbitmq/logs

[root@rabbitmq-1 ~]# cat /etc/rabbitmq/rabbitmq-env.conf

3,重启服务
[root@rabbitmq-1 ~]# systemctl restart rabbitmq-server

4.拷⻉erlang.COOKIE
原因:集群中各节点是经由⼀个COOKIE来实现的,所以必须保证各节点COOKIE⼀致,不然节点之间就⽆法通信.(COOKIE存放的位置:解压缩方式安装部署的rabbitmq存放于/home/.erlang.COOKIE。rpm等安装包方式进行安装的/var/lib/rabbitmq)

[root@rabbitmq-1 ~]# cat /var/lib/rabbitmq/.erlang.COOKIE
HOUCUGJDZYTFZDSWXTHJ
⽤scp的⽅式将rabbitmq-1节点的.erlang.COOKIE的值复制到其他两个节点中。
[root@rabbitmq-1 ~]# scp /var/lib/rabbitmq/.erlang.COOKIE root@192.168.50.139:/var/lib/rabbitmq/
[root@rabbitmq-1 ~]# scp /var/lib/rabbitmq/.erlang.COOKIE root@192.168.50.140:/var/lib/rabbitmq/

3.将mq-2、mq-3作为内存节点加⼊mq-1节点集群中.mq-1用作磁盘节点,在RabbitMQ集群中,必须⾄少有⼀个磁盘节点,否则队列元数据⽆法写⼊到集群中,当磁盘节点宕掉时,集群将⽆法写⼊新的队列元数据信息。
在mq-2、mq-3执⾏如下命令:
[root@rabbitmq-2 ~]# rabbitmqctl stop_app #停止节点,切记不是停止服务
[root@rabbitmq-2 ~]# rabbitmqctl reset #如果有数据需要重置,没有则不用
[root@rabbitmq-2 ~]# rabbitmqctl join_cluster --ram rabbit@rabbitmq-1 #添加到磁盘节点
Clustering node 'rabbit@rabbitmq-2' with 'rabbit@rabbitmq-1' ...
[root@rabbitmq-2 ~]# rabbitmqctl start_app #启动节点
Starting node 'rabbit@rabbitmq-2' ...

3.1.0此处节点问题解决方式:
(1)如果执行rabbitmqctl stop_app 这条命令报错:需要执行
#chmod 400 .erlang.COOKIE ⽂件是400的权限
#chown rabbitmq.rabbitmq .erlang.COOKIE
(2)由于更改hostname文件,在每次rabbitmqctl stop或者rabbitmqctl cluster_status等,只要是rabbitmq的命令就报错,提示大概如下
Cluster status of node rabbit@web2 ...
Error: unable to connect to node rabbit@web2: nodedown
..............
此时先ps aux | grep mq,然后kill -9 所有mq的进程,然后再rabbitmq-server -detached即可解决。(即先强杀,再重新启动)
(3)使用rabbitmqctl stop,rabbitmq-server -detached重新启动后,原先添加的用户admin、虚拟主机coresystem等均丢失,还需要重新添加。
(4) rabbitmqctl join_cluster --ram rabbit@rabbitmq-1报错时检查域名解析
(5)其他问题关于使用 rabbitmq-server -detached命令启动rabbitmq时,出现以下提示Warning: PID file not written; -detached was passed,此时使用
rabbitmqctl status提示服务已启动,可知此问题不用解决。
3.1.1节点补充:
(1)默认rabbitmq启动后是磁盘节点,在这个cluster命令下,mq-2和mq-3是内存节点,
mq-1是磁盘节点。
( 2)如果要使mq-2、mq-3都是磁盘节点,去掉--ram参数即可。
(3)如果想要更改节点类型,可以使⽤命令rabbitmqctl change_cluster_node_type disc(ram),前提是必须停掉rabbit应⽤
注:
#如果有需要使用磁盘节点加入集群
[root@rabbitmq-2 ~]# rabbitmqctl join_cluster rabbit@rabbitmq-1
[root@rabbitmq-3 ~]# rabbitmqctl join_cluster rabbit@rabbitmq-1

4,查看集群状态,在任意节点上执行 rabbitmqctl cluster_status来查看是否集群配置成功。
[root@rabbitmq-1 ~]# rabbitmqctl cluster_status
消息中间件Rabbitmq的使用
每台机器显示出三台节点,表示已经添加成功!

5.登录rabbitmq web管理控制台,创建新的队列
打开浏览器输⼊http://192.168.50.138:15672,
输⼊默认的Username:guest
输⼊默认的Password:guest
消息中间件Rabbitmq的使用

根据界⾯提示创建⼀条队列
消息中间件Rabbitmq的使用

++++++由以上RABBITMQ普通模式+镜像模式+++++++++++++

三,添加镜像模式的原因:

     上面已经完成RabbitMQ默认集群模式,但并不保证队列的高可用性,队列内容不会复制。如果队列节点宕机直接导致该队列无法应用,只能等待重启,所以要想在队列节点宕机或故障也能正常应用,就要复制队列内容到集群里的每个节点,必须要创建镜像队列。    镜像队列是基于普通的集群模式的。

1,创建镜像集群:三台机器相同操作
rabbitmq set_policy :设置策略
[root@rabbitmq-1 ~]#rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
Setting policy "ha-all" for pattern "^" to "{"ha-mode":"all"}" with priority "0" for vhost "/" ...

2,再次查看队列已经同步到其他两台节点:
消息中间件Rabbitmq的使用

3,此时镜像队列设置成功。已经部署完成,将所有队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态保持一致。``

++++++++rabbitmq默认的集群模式+镜像模式+HA+负载均衡++++++++++++
RabbitMQ 高可用集群搭建完成,最后一个步骤就是搭建均衡器。
消息中间件Rabbitmq的使用

简单安装并配置负载均衡器HA

注意:如果使用阿里云,可以使用阿里云的内网slb来实现负载均衡,不用自己搭建HA。
安装并配置负载均衡器HA
1、在192.168.50.138安装HAProxy
yum -y install haproxy
2、修改 /etc/haproxy/haproxy.cfg
[root@rabbitmq-1 ~]# cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
[root@rabbitmq-1 ~]# vim /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2

chroot      /var/lib/haproxy
pidfile     /var/run/haproxy.pid
maxconn     4000
user        haproxy
group       haproxy
nbproc      4
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats

#---------------------------------------------------------------------
defaults
mode http
log global
retries 3
timeout connect 10s
timeout client 1m
timeout server 1m
timeout check 10s
maxconn 2048
#---------------------------------------------------------------------
##监控查看本地状态#####
listen admin_stats
bind :80
mode http
option httplog
option httpclose
log 127.0.0.1 local0 err
stats uri /haproxy
stats auth xingdian:123 (用户+密码)
stats refresh 30s
####################################
###反代监控
frontend server
bind
:5670
log global
mode tcp
#option forwardfor
default_backend rabbitmq
maxconn 3
backend rabbitmq
mode tcp
log global
balance roundrobin
server rabbitmq1 192.168.50.138:5672 check inter 2000s rise 2 fall 3
server rabbitmq2 192.168.50.139:5672 check inter 2000s rise 2 fall 3
server rabbitmq3 192.168.50.140:5672 check inter 2000s rise 2 fall 3

[root@rabbitmq-1 ~]# systemctl restart haproxy

浏览器输入http://192.168.50.138/haproxy查看rabbitmq的状态。


推荐阅读
  • RocketMQ在秒杀时的应用
    目录一、RocketMQ是什么二、broker和nameserver2.1Broker2.2NameServer三、MQ在秒杀场景下的应用3.1利用MQ进行异步操作3. ... [详细]
  • 一文了解消息中间件RabbitMQ
    消息中间件---RabbitMQ1消息中间件的作用2.常用的消息中间件3消息中间件RabbitMQ3.1RabbitMQ介绍3.3RabbitMQ的队列模式3.3RabbitMQ的 ... [详细]
  • Java自学知乎!阿里高级算法专家公开10份资料,涨姿势!
    接口概述:接口是Java语言中的一种引用类型,是方法的集合,所以接口的内部主要就是定义方法,包含常量,抽象方法(JDK ... [详细]
  • Windows下安装RaibbitMQ
    1.软件准备1.1erlang语言包到http:www.erlang.orgdownload.html下载,并且运行!安装目录C:\ProgramFil ... [详细]
  • .Net下RabbitMQ发布订阅模式实践
    一、概念AMQP,即AdvancedMessageQueuingProtocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的 ... [详细]
  • RabbitMQ是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP,SMTP,STOMP,也 ... [详细]
  • Java高并发与多线程(二):线程的实现方式详解
    本文将深入探讨Java中线程的三种主要实现方式,包括继承Thread类、实现Runnable接口和实现Callable接口,并分析它们之间的异同及其应用场景。 ... [详细]
  • 本文深入解析了通过JDBC实现ActiveMQ消息持久化的机制。JDBC能够将消息可靠地存储在多种关系型数据库中,如MySQL、SQL Server、Oracle和DB2等。采用JDBC持久化方式时,数据库会自动生成三个关键表:`activemq_msgs`、`activemq_lock`和`activemq_ACKS`,分别用于存储消息数据、锁定信息和确认状态。这种机制不仅提高了消息的可靠性,还增强了系统的可扩展性和容错能力。 ... [详细]
  • 在开发过程中,我最初也依赖于功能全面但操作繁琐的集成开发环境(IDE),如Borland Delphi 和 Microsoft Visual Studio。然而,随着对高效开发的追求,我逐渐转向了更加轻量级和灵活的工具组合。通过 CLIfe,我构建了一个高度定制化的开发环境,不仅提高了代码编写效率,还简化了项目管理流程。这一配置结合了多种强大的命令行工具和插件,使我在日常开发中能够更加得心应手。 ... [详细]
  • 优化后的标题:PHP分布式高并发秒杀系统设计与实现
    PHPSeckill是一个基于PHP、Lua和Redis构建的高效分布式秒杀系统。该项目利用php_apcu扩展优化性能,实现了高并发环境下的秒杀功能。系统设计充分考虑了分布式架构的可扩展性和稳定性,适用于大规模用户同时访问的场景。项目代码已开源,可在Gitee平台上获取。 ... [详细]
  • 背景最近面试面得心力交瘁,由于没有高并发架构的实际项目经验,经常是在场景设计的面试题目上面栽跟头。上次就被问到了关于秒杀系统的设计,竟无 ... [详细]
  • SpringCloud之Bus(消息总线)
    说明:关于SpringCloud系列的文章中的代码都在码云上面地址:https:gitee.comzh_0209_javaspringcloud-ali ... [详细]
  • 启动activemq_「Java」SpringBoot amp; ActiveMQ
    一、消息队列消息队列中间件是分布式系统中重要的组件,主要解决应用耦合、异步消息、流量削锋等问题,实现高性能、高可用、可伸缩和最终一致性架构, ... [详细]
  • 可查看rabbitmq官方集群方案架构图Thisguidecoversmirroring(queuecontentsreplication)ofclassicqueues--摘自 ... [详细]
  • CentOS7 安装RabbitMQ
    1安装编译工具yuminstall-ymakegccgcc-c++m4opensslopenssl-develncurses-develunixODBCunixODBC-devel ... [详细]
author-avatar
孤鹜1101
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有