• RabbitMQ学习(二)



    目录:

    (1)Fanout交换机类型介绍

    (2)发送消息到Fanout交换机中 

    (3)Topic交换机类型介绍

    (4) Topic类型消息的接收

    (5)集群模式的介绍

    (6)搭建普通模式集群

    (7)搭建镜像模式的集群


    (1)Fanout交换机类型介绍

    每个发到 fanout 类型交换器的消息都会分到所有绑定的队列上去。fanout 交换器不处理路由键,只是简单的将队列绑定到交换器上,每个发送到交换器的消息都会被转发到与该交换器绑定的所有队列上。很像子网广播,每台子网内的主机都获得了一份复制的消息。fanout 类型转发消息是最快的。 

    (2)发送消息到Fanout交换机中 

     在生产者配置类RabbitMQConfig类:中声明交换机:

     声明3个队列:

     声明绑定关系:

    SendMessage中发送消息:

     

     发送消息

     启动主启动类:运行发送消息

    出现了队列接收到了消息 

     给队列加false,换成非持久化:feature缺少了D

     添加其他参数

     

     在消费者模块进行消费:

     在ReceiveMesssage类中

    重新运行发送者发送消息: 

     复制3个端口号运行:8003、8004、8005

     分别启动8003、8004、8005他们启动时对应上面的receiveFanoutMessage1、receiveFanoutMessage2、receiveFanoutMessage3,进行注释启动

     重新启动7003:发送消息

    8003接收到一条消息

     8004、8005也接收一条消息:

     如果停掉8005消息只能被8003、8004接收,它重新再启动也接收不到

    (3)Topic交换机类型介绍

    topic 交换器通过模式匹配分配消息的路由键属性,将路由键和某个模式进行匹配,此时队列需要绑定到一个模式上。它将路由键和绑定键的字符串切分成单词,这些单词之间用点隔开。它同样也会识别两个通配符:符号“#”和符号“*”。#匹配0个或多个单词,“*”匹配不多不少一个单词。

    (4) Topic类型消息的接收

    首先在生产者模块中RabbitMQConfig类中:声明交换机、队列、绑定关系

     

     在SendMessage类中发送消息:

     在启动类RabbitMQ7003Application中调用方法发送消息:

     运行启动类:发现对类中消息的数目total1,1,3根接收的规则是一样的

     

     在接收者Modul中的ReceiveMessage类中接收消息:

     

    (5)集群模式的介绍

     普通模式(默认):对于Queue来说,消息实体只存在于其中的一个节点,A/B两个节点仅有相同的元数据,即队列结构.(交换机的所有元数据在所有节点上是一致的,而队列的完整信息只有在创建它的节点上,各个节点仅有相同的元数据,即队列结构)当消息进入A节点的Queue中后,consumer从B节点拉取数据时,RabbitMQ会临时在A.B间进行消息传输,把A中的消息实体取出并经过B发送给consumer.所以consumer应尽量连接每个节点,从中取消息.即对于同一个逻辑队列,要在多个节点建立物理Queue,否则无论consumer连A或B,出口总在A,会产生瓶颈.该模式存在一个问题就是当A节点故障后,B节点无法取到A节点中还未消费的消息实体.如果做个消息持久化,那么等A几点恢复,然后才可被消费;如果没有做持久化,然后就...该模式非常适合非持久化队列,只有该队列是非持久化的,客户端才能重新连接到集群中的其他节点,并且重新创建队列,如果该队列是持久化的,那么唯一的办法就是将故障节点恢复起来.

     

     镜像模式(高可用模式):把需要的队列做成镜像模式,存在于多个节点,数据Rabbitmq的HA方案.该模式解决了上述问题,其实质和普通模式的不同之处在于,消息实体会主动在镜像节点间同步,而不会在consumer取数据时临时拉取.该模式带来的副作用也很明显,除了降低系统性能意外,如果镜像队列过多,加之有大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉,所以在对可靠性要求较高的场合中适用.

     (6)搭建普通模式集群

    1. 安装2两台Linux操作系统并修改hostname 分别为A和B

                 执行vi /etc/hosts 文件内容如下

    127.0.0.1 A  localhost localhost.localdomain localhost4 localhost4.localdomain4

    ::1       A  localhost localhost.localdomain localhost6 localhost6.localdomain6

    192.168.222.129 A

    192.168.222.130 B

     注意:2Linux服务器需要完成同样的操作

            关闭防火墙确保2台机器相互ping 同可以执行ping A ping B命令进行测试

    在2台Linux服务中分别安装RabbitMQ

    安装RabbitMQ之前必须要先安装所需要的依赖包可以使用下面的一次性安装命令

    yum install gcc glibc-devel make ncurses-devel openssl-devel xmlto -y

    安装Erlang

    1、 将Erlang源代码包otp_src_19.3.tar.gz上传到Linux的/home目录下

      2、解压erlang 源码包

    tar -zxvf otp_src_19.3.tar.gz

    3、手动创建erlang 的安装目录

    mkdir /usr/local/erlang

    4、进入erlang的解压目录

    cd otp_src_19.3

     5、配置erlang的安装信息

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

     6、编译并安装

    make && make install

     7、配置环境变量

    vim /etc/profile

     8、将这些配置填写到profile文件的最后

    ERL_HOME=/usr/local/erlang

    PATH=$ERL_HOME/bin:$PATH

    export ERL_HOME PATH

    9、启动环境变量配置文件

    source /etc/profile

    安装RabbitMQ

    1、将RabbitMQ安装包rabbitmq-server-3.7.2-1.el7.noarch.rpm上传到/home目录

    2、安装RabbitMQ

    rpm -ivh --nodeps rabbitmq-server-3.7.2-1.el7.noarch.rpm

    3、安装管控台插件

    rabbitmq-plugins enable rabbitmq_management

             注意:需要分别在2Linux服务器中安装RabbitMQ

     配置Cookie文件

    Erlang Cookie是保证不同节点可以互相通信的秘钥,要保证集群中的不同节点互相通信必须共享相同的Erlang Cookie,具体存放在/var/lib/rabbitmq/.erlang.cookie

    例如

    [root@A ~]# cat /var/lib/rabbitmq/.erlang.cookie

    MZFQSBXIIJJMUZRTJFWQ

    [root@A ~]# ~

             必须要保证2台Linux的Cookie 文件内容完全相同,可以选择使用vim进行编辑

    也可以使用scp命令完成文件跨机器拷贝例如

    [root@A ~]# scp /var/lib/rabbitmq/.erlang.cookie 192.168.222.130:/var/lib/rabbitmq

    注意:由于这个文件的权限是只读因此无论是使用vim还是scp来实现Cookie文件的同步都会失败,因此必须要修改这个文件的权限,

    例如 chmod 777 /var/lib/rabbitmq/.erlang.cookie

    Cookie文件同步完成以后再修改权限回只读

    例如 chmod 400 /var/lib/rabbitmq/.erlang.cookie

     

    组建集群

    分别启动2台Linux机器中的RabbitMQ服务器

    rabbitmqctl stop

    rabbitmq-server -detached

    注意:rabbitmq-server –detached 表示在后台运行

    启动之后进行开放端口:

     连接上130、137的了

     

     

     

    将某个RabbitMQ加入到某个服务器节点

    rabbitmqctl stop_app

    rabbitmqctl join_cluster rabbit@A

    rabbitmqctl start_app

    注意:

      rabbitmqctl join_cluster rabbit@A 命令中的A为某个机器的hostname,在hostnameB的机器中执行这些命令

    停下某一个节点,加入另外一个上,在加入时出现不能连接4369、25672,需要开启另外一台的端口 

    开启另外一台节点的的端口 

     

     这台节点也开启下端口,重新加入:就加入成功了,可以启动了

     

     

    查看集群状态确认节点成功添加

    [root@B ~]# rabbitmqctl cluster_status

    Cluster status of node rabbit@B ...

    [{nodes,[{disc,[rabbit@A,rabbit@B]}]},

     {running_nodes,[rabbit@A,rabbit@B]},

     {cluster_name,<<"rabbit@A">>},

     {partitions,[]},

     {alarms,[{rabbit@A,[]},{rabbit@B,[]}]}]

    [root@B ~]#

    注意:

             当查看节点状态时发现2台机器的节点同时显示机表示集群搭建完成

    查看节点状态: 

     

     现在就是一个节点集群了

    其他命令

             如果要将某个节点从集群中移除,使其变回独立节点,可以使用以下命令:

    rabbitmqctl stop_app

    rabbitmqctl reset

    rabbitmqctl start_app

     

    使用SpringBoot连接RabbitMQ集群

     配置RabbitMQ的账号

    分别为2台Linux中的RabbitMQ添加账号并进行授权

    rabbitmqctl add_user root root

    rabbitmqctl set_user_tags root administrator

    rabbitmqctl set_permissions -p / root '.*' '.*' '.*'

     

    在两台里面添加完角色以后就可以使用root登录了:

     

     

     

     SpringBoot配置

    修改SpringBoot的application.properties文件进行集群的继承

    #spring.rabbitmq.port=5672

    #配置RabbitMQ的集群访问地址
    spring.rabbitmq.addresses=192.168.222.129:5672,192.168.222.130:5672
    #配置RabbitMQ服务器的访问账号
    spring.rabbitmq.username=root
    #配置RabbitMQ服务器的访问密码
    spring.rabbitmq.password=root

     修改创建者的端口:发送的时候为137的节点

     修改消费者的端口:接收的时候从130接收:

    启动消息的发送者启动类:出现了节点

     

     启动消费者:

    重新启动消息的发送者主启动类,这个时候停掉30端口节点:

     

    这个时候B节点就没了:

     

    这个时候就不能去130端口消费了

     

     重新启动B节点:

    这个时候就可以重新消费了: 

     (7)搭建镜像模式的集群

    需要配置我们的策略信息 

    添加所有节点为高可用的模式 

     

     

     

     

    +1就是镜像同步:把交换机和消息队列同步到对应的节点当中

     重新发送消息:就会镜像同步到节点当中

     

    启动消费者消费:

     

     

  • 相关阅读:
    【新日标习题集】第13課 までのまとめ (discarded)
    面试算法题(shell/日志数据查询统计)
    django rest framework 学习笔记-实战商城
    No module ‘xformers‘. Proceeding without it.
    【STM32】【HAL库】【实用制作】数控收音机(软件设计)
    [附源码]JAVA毕业设计科院垃圾分类系统(系统+LW)
    【2022最新核心面试资料 】最强Java面试八股文秋招offer召唤术!入职薪资53k
    Date/Timestamp/String/LocalDate/LocalDateTime
    【Linux】 login命令使用
    基于vue3+pinia2仿ChatGPT聊天实例|vite4.x仿chatgpt界面
  • 原文地址:https://blog.csdn.net/dengfengling999/article/details/127718977