栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

rabbitMQ

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

rabbitMQ

目录

MQ简介:

核心功能

MQ的分类

P2P模式(安全)

Pub/Sub模式(并发)

 同类产品

RabbitMQ详解

RabbitMQ简介

RabbitMQ特点:

***RabbitMQ架构图示***

***RabbitMQ常用术语 ***

1.Message:

2.Publisher:

3.Exchange:

4.Queue:

5.Bingding:

6.Virtual Host:

7.Broker:

8.Connection:

9.Channel:

10.Consumer:

Rabbit MQ的通信过程

单机部署RabbitMQ

环境

安装Erlang

安装RabbitMQ

修改配置文件

安装插件并启动服务 

访问测试

客户端介绍 

****命令行添加用户,设置tags***

RabbitMQ集群部署

原理介绍

内存节点和磁盘节点

普通模式和镜像模式

环境要求

部署过程(每个节点都配置)

1、所有节点配置 vim  /etc/hosts

2、所有节点安装erLang和rabbitmq

3、导入rabbitmq 的管理界面

4、设置erlang运行节点

5、添加用户并设置密码

6、访问测试

组成集群

1、将node2、node3加入到node1中组成集群

2、在任意节点上查看集群状态

3、在任意节点上设置镜像队列策略

Rabbitmq+HAproxy

1、安装HAProxy

2、修改配置文件

3、重启HAProxy

4、登录浏览器输入地址


MQ简介:

        MQ 全称为Message Queue, 消息队列。是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。消息传递指的是程序之间,通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信。队列的使用除去了接收和发送应用程序,同时执行的要求。
        在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式,大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。

核心功能

解耦(将不同的系统分离开)
冗余(存储)
扩展性
削峰
可恢复性
顺序保证
缓冲
异步通信

MQ的分类

P2P模式(安全)

        P2P模式包含三个角色:
1.消息队列(Queue)、
2.发送者(Sender)、
3.接收者(Receiver)。
每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到它们被消费或超时。
P2P的特点如下:

• 每个消息只有一个消费者(Consumer),即一旦被消费,消息就不再在消息队列中
• 发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行它不会影响到消息被发送到队列
• 接收者在成功接收消息之后,需向队列应答成功。
• 如果希望发送的每个消息都会被成功处理的话,那么需要P2P模式

Pub/Sub模式(并发)

        Pub/Sub模式包含三个角色:主题(Topic)、发布者(Publisher)、订阅者(Subscriber) 。多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。Pub/Sub的特点如下:

• 每个消息可以有多个消费者
• 发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息
• 为了消费消息,订阅者必须保持运行的状态
• 如果希望发送的消息可以不被做任何处理、或者只被一个消息者处理、或者可以被多个消费者处理的话,那么可以采用Pub/Sub模型

 同类产品

Kafka

RabbitMQ

RocketMQ

RabbitMQ详解

RabbitMQ简介

        RabbitMQ是一个在AMQP(Advanced Message Queuing Protocol )基础上实现的,可复用的企业消息系统。它可以用于大型软件系统,各个模块之间的高效通信,支持高并发,支持可扩展。它支持多种客户端如:Python、Ruby、.NET、Java、JMS、C、PHP、Actionscript、XMPP、STOMP等,支持AJAX,持久化,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
        RabbitMQ是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常重量级,更适合于企业级的开发。它同时实现了一个Broker构架,这意味着消息在发送给客户端时先在中心队列排队,对路由(Routing)、负载均衡(Load balance)或者数据持久化都有很好的支持。

RabbitMQ特点:

    可靠性
    灵活的路由
    扩展性
    高可用性
    多种协议
    多语言客户端
    管理界面
    插件机制

***RabbitMQ架构图示***

***RabbitMQ常用术语 ***

1.Message:

消息,是有消息头和消息体组成的。消息体是不透明的,消息体是由一些可选属性组成的,包括路由键(routing-key)、优先级(priority)、持久性存储(delivery-mode)等

2.Publisher:

消息生产者,是向交换器发送消息的客户端程序,我们可以简单理解为就是一个Java程序

3.Exchange:

交换器,用来接收生产者发送的消息,并将这些消息路由发送给服务器中的队列。消息要先经过交换器(exchange),再到队列中去。

4.Queue:

消息队列,用来保存消息,直到发送给消费者,是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一致在队列里面,等待消费者连接到这个队列将其取走。

5.Bingding:

绑定,用于消息队列和交换器之间的关联。一个绑定就是基于路由键,将交换器和消息队列连接起来的路由规则,所以可以将交换器理解为一个由绑定构成的路由表

6.Virtual Host:

虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器区域。// 也就是说虚拟主机、交换器、队列、绑定等是通过虚拟机来实现的

vhost是AMQP概念的基础,必须再连接时指定,RabbitMQ默认的vhost是"/"

7.Broker:

可以理解为rabbitmq的服务器实体,可以理解为在Linux上创建的虚拟机实体

8.Connection:

连接,我们可以理解为:rabbitmq服务器和app服务建立的TCP的连接。

9.Channel:

信道,也可以成为管道。是TCP里的虚拟连接。一条TCP连接,可以包含很多条的Channel。
例如:电缆相当与TCP,信道是一条独立光纤束,一条TCP连接上创建多少条信道是没有限制的
TCP一旦打开,就会创建AMQP信道
无论是发布消息、接收消息、订阅消息,这些动作都是通过信道完成的

10.Consumer:

消息的消费者,表示一个从消息队列中取得消息的客户端应用程序,和Producer类似,我们可以简单理解为就是一个Java程序

Rabbit MQ的通信过程

1. P1生产消息,发送给服务器端的Exchange
2. Exchange收到消息,根据ROUTINKEY,将消息转发给匹配的Queue1
3. Queue1收到消息,将消息发送给订阅者C1
4. C1收到消息,发送ACK给队列确认收到消息
5. Queue1收到ACK,删除队列中缓存的此条消息

单机部署RabbitMQ

环境

192.168.31.194    设置主机名和域名解析 rabbitmq1
192.168.31.195    设置主机名和域名解析 rabbitmq2
192.168.31.196    设置主机名和域名解析 rabbitmq3
vim /etc/hosts
hostnamectl set-hostname rabbitmq1

安装Erlang

链接: https://pan.baidu.com/s/132_OsuvlaO8xUt_x7Yk35w?pwd=4fcf 提取码: 4fcf 复制这段内容后打开百度网盘手机App,操作更方便哦

# unzip rabbitmq.zip

# yum -y install erlang-21.3.8.1-1.el7.x86_64.rpm

安装RabbitMQ

链接里的安装包里有

# yum -y install rabbitmq-server-3.7.13-1.el7.noarch.rpm

修改配置文件

#cp /usr/share/doc/rabbitmq-server-3.7.13/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config

# vim /etc/rabbitmq/rabbitmq.config

把第61行的注释去掉

安装插件并启动服务 

# rabbitmq-plugins enable rabbitmq_management        web管理界面工具

# systemctl restart rabbitmq-server        

# rabbitmqctl cluster_status                查看节点状态

访问测试

192.168.31.194:15672

默认账号密码:guest/guest

客户端介绍 

****命令行添加用户,设置tags***

(开发者)查看所有的队列:rabbitmqctl list_queues
(开发者)清除所有的队列:rabbitmqctl reset
添加用户:rabbitmqctl add_user xxx mima
分配角色:rabbitmqctl set_user_tags xxx administrator
新增虚拟主机:rabbitmqctl add_vhost xxx
将新虚拟主机授权给新用户:rabbitmqctl set_permissions -p vhost_name username ".*" ".*" ".*"(后面三个”*”代表用户拥有配置、写、读全部权限)

用户角色

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

RabbitMQ集群部署

原理介绍

内存节点和磁盘节点

        RabbitMQ集群中,各个RabbitMQ为对等节点,即每个节点均提供给客户端连接,进行消息的接收和发送。节点分为内存节点和磁盘节点,一般都建立为磁盘节点,为了防止机器重启后的消息消失

普通模式和镜像模式

        RabbitMQ的Cluster集群模式一般分为两种,普通模式和镜像模式。消息队列通过RabbitMQ HA镜像队列进行消息队列实体复制。

普通模式

        普通模式下,以两个节点(rabbit01、rabbit02)为例来进行说明。对于Queue来说,消息实体只存在于其中一个节点rabbit01(或者rabbit02),rabbit01和rabbit02两个节点仅有相同的元数据,即队列的结构。当消息进入rabbit01节点的Queue后,consumer从rabbit02节点消费时,RabbitMQ会临时在rabbit01、rabbit02间进行消息传输,把A中的消息实体取出并经过B发送给consumer。所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连rabbit01或rabbit02,出口总在rabbit01,会产生瓶颈。

镜像模式

        镜像模式下,将需要消费的队列变为镜像队列,存在于多个节点,这样就可以实现RabbitMQ的HA高可用性。作用就是消息实体会主动在镜像节点之间实现同步,而不是像普通模式那样,在consumer消费数据时临时读取。缺点就是,集群内部的同步通讯会占用大量的网络带宽。

环境要求

1、所有节点需要再同一个局域网内;

2、所有节点需要有相同的 erlang cookie,否则不能正常通信,为了实现cookie内容一致,采用scp的方式进行。

3、准备三台虚拟机,配置相同

4、集群中所有节点都需要hosts文件解析

部署过程(每个节点都配置)

1、所有节点配置 vim  /etc/hosts
192.168.31.194    rabbitmq1
192.168.31.195    rabbitmq2
192.168.31.196    rabbitmq3

2、所有节点安装erLang和rabbitmq

        部署过程等同于单机部署

3、导入rabbitmq 的管理界面

        # rabbitmqctl-plugins enable rabbitmq_management

4、设置erlang运行节点

一定要保证三台机器的cookie内容一致

        找到erlang cookie文件的位置,源码包部署一般会存在.erlang.cookie文件;rpm包部署一般是在/var/lib/rabbitmq/.erlang.cookie。将 node1 的该文件使用rsync或者是scp复制到 node2、node3,文件权限需要是400。

        # scp -r /var/lib/rabbitmq/.erlang.cookie rabbitmq2:/var/lib/rabbitmq/.erlang.cookie

        # scp -r /var/lib/rabbitmq/.erlang.cookie rabbitmq3:/var/lib/rabbitmq/.erlang.cookie

        # cat /var/lib/rabbitmq/.erlang.cookie

# systemctl restart rabbitmq-server

rabbitmq2和rabbitmq3

        # rabbitmqctl stop        

  关闭rabbitmq2和rabbitmq3的服务(不要关rabbitmq1)如果2,3节点没有启动服务,会提示错误

        #rabbitmq-server -detached        2.3 独立运行节点,warning提示不用理会

        # rabbitmqctl cluster_status

5、添加用户并设置密码

                由于guest这个用户,只能在本地访问,所以我们要在每个节点上,新增一个用户并赋予对/的所有权限,然后添加到管理员组中,让此用户能够远程访问

        # rabbitmqctl add_user  admin admin
        # rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
        # rabbitmqctl set_user_tags admin administrator

6、访问测试

        http://ip:15672
        账号:admin
        密码admin
        此时每个节点是单独的一台RabbitMQ,下面来将他们组成集群。

组成集群

        rabbitmq-server 启动时,会一起启动:节点和应用,它预先设置RabbitMQ应用为standalone(脱机)模式。要将一个节点加入到现有的集群中,你需要停止这个应用,并将节点设置为原始状态。如果使用rabbitmqctl stop,应用和节点都将被关闭。所以使用rabbitmqctl stop_app仅仅关闭应用。(停应用,不停止节点)

1、将node2、node3加入到node1中组成集群

磁盘节点

        第二台节点

rabbitmq2# rabbitmqctl stop_app

rabbitmq2# rabbitmqctl join_cluster rabbit@rabbitmq1

rabbitmq2# rabbitmqctl start_app

        第三台节点

rabbitmq3# rabbitmqctl stop_app     

rabbitmq3# rabbitmqctl join_cluster rabbit@rabbitmq1

rabbitmq3# rabbitmqctl start_app

内存节点(了解)

rabbitmq2 # rabbitmqctl join_cluster --ram rabbit@rabbitmq1

2、在任意节点上查看集群状态

# rabbitmqctl cluster_status

有这一行

 {alarms,[{rabbit@node1,[]},{rabbit@node2,[]},{rabbit@node3,[]}]}]

3、在任意节点上设置镜像队列策略

         在web界面登陆,点击“Admin--Virtual Hosts(页面右侧)”,在打开的页面上的下方的“Add a new virtual host”处增加一个虚拟主机,同时给用户“admin”和“guest”均加上权限(在页面直接设置、点点点即可);

然后在linux中设置镜像队列策略:

语法介绍:

 # rabbitmqctl set_policy -p vhost1  ha-all "^" '{"ha-mode":"all"}'

"coresystem"        vhost名称,此处应该填写“qianfeng”
 ha-all        策略名称
 "^"        queue的匹配模式为匹配所有的队列
{  }
    为镜像定义,包括三个部分ha-mode, ha-params, ha-sync-mode
     ha-mode
        指明镜像队列的模式,有效值为 all/exactly/nodes
         all
            表示在集群中所有的节点上进行镜像,包含新增节点
        exactly
            (可选)表示在指定个数的节点上进行镜像,节点的个数由ha-params指定
        nodes
            (可选)表示在指定的节点上进行镜像,节点名称通过ha-params指定
    ha-sync-mode
        (可选)进行队列中消息的同步方式,有效值为automatic和manual

Rabbitmq+HAproxy

环境:haproxy 1台 192.168.31.197

三台已经部署rabbitmq集群

1、安装HAProxy

        # yum -y install haproxy

2、修改配置文件

        # 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
    daemon

    stats socket /var/lib/haproxy/stats

defaults
       log        global
       mode       tcp
       option     tcplog
       option     dontlognull
       retries    3
       option redispatch
       maxconn 2000
       contimeout      5s
       clitimeout      120s
       srvtimeout      120s
    
listen rabbitmq_cluster 0.0.0.0:80    #作为代理的服务器的IP和端口
       mode      tcp
       balance roundrobin
       server rabbit1  192.168.31.194:15672 check inter 5000 rise 2 fall 2
       server rabbit2  192.168.31.195:15672 check inter 5000 rise 2 fall 2
       server rabbit3  192.168.31.196:15672 check inter 2000 rise 2 fall 3


listen monitor
    bind 0.0.0.0:8100    #监控页面的访问端口
    mode http
    option httplog
    stats enable
    stats uri /rabbitmq_stats
    stats refresh 30s

3、重启HAProxy

        # systemctl restart haproxy

4、登录浏览器输入地址

高可用使用rabbitmq   http://192.168.31.197:80/

账号:admin

密码:admin

    查看HAProxy的状态    http://192.168.31.197:8100/rabbitmq_stats

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/691702.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号