RabbitMQ系列(27)--RabbitMQ使用Federation Exchange(联邦交换机)解决异地访问延迟问题

news2024/9/20 22:13:51

前言:

(broker北京)、(broker深圳)彼此之间相距甚远,网络延迟是一个不得不面对的问题。有一个在北京的业务(Client北京)需要连接(broker北京),向其中的交换器exchangeA发送消息,此时的网络延迟很小,(Client北京)可以迅速将消息发送至exchangeA 中,就算在开启了publisherconfirm机制或者事务机制的情况下,也可以迅速收到确认信息。此时又有个在深圳的业务(Client深圳)需要向exchangeA发送消息,那么(Client 深圳)(broker北京)之间有很大的网络延迟,(Client 深圳)发送消息至exchangeA会经历一定的延迟,尤其是在开启了publisherconfirm机制或者事务机制的情况下,(Client深圳)会等待很长的延迟时间来接收(broker北京)的确认信息,进而必然造成这条发送线程的性能降低,甚至造成一定程度上的阻塞。将业务(Client深圳)部署到北京的机房可以解决这个问题,但是如果(Client深圳)调用的另些服务都部署在深圳,那么又会引发新的时延问题,总不见得将所有业务全部部署在一个机房,那么容灾又何以实现?这里使用Federation 插件就可以很好地解决这个问题.
 

1、Federation Exchange工作原理图

2、在每台机器上开启federation相关插件

(1)安装rabbitmq_federation插件

rabbitmq-plugins enable rabbitmq_federation

node1效果图 :

node2效果图:

node3效果图:

(2)安装rabbitmq_federation_management插件

rabbitmq-plugins enable rabbitmq_federation_management

node1效果图:

node2效果图:

node3效果图:

(3)进入安装了federation插件的节点的可视化页面,进入Admin可以看到多出了两个与federation相关的管理菜单

3、在node2节点上创建fed_exchange交换机和node2_queue队列

(1)编写以下代码

package com.ken;

import com.rabbitmq.client.*;

public class Producer {

    public static final String FED_EXCHANGE = "fed_exchange";

    public static void main(String[] args) throws Exception {

        //创建一个连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //设置工厂IP,用于连接RabbitMQ的队列
        factory.setHost("192.168.194.128");
        //设置连接RabbitMQ的用户名
        factory.setUsername("admin");
        //设置连接RabbitMQ的密码
        factory.setPassword("123456");
        //创建连接
        Connection connection = factory.newConnection();
        //获取信道
        Channel channel = connection.createChannel();
        channel.exchangeDeclare(FED_EXCHANGE, BuiltinExchangeType.DIRECT);
        channel.queueDeclare("node2_queue",true,false,false,null);
        channel.queueBind("node2_queue",FED_EXCHANGE,"routeKey");
    }

}

(2)启动程序:

效果图:

交换机:

交换机和队列的绑定情况:

队列:

4、在downstream(node2)上配置upstream(node1)

(1)进入配置页面

(2)给上游起名称

 (3)设置上游链接

(4)点击添加上游即可

 效果图:

5、添加策略

(1) 进入添加策略的页面

(2)给策略取一个名字,我这里取exchange-policy

 (3)给策略加上匹配规则,通过正则表达式匹配队列,若交换机或者队列的名字满足以fed开头后面任意这个条件,则那条队列使用该策略 

^fed.*

例:

(4)选择交换机为策略的应用 

(5)选择上游策略federation-upstream,点击Federation upstream即可

(6)填写上游的名称为node1-as-upstream(在步骤4(2)里我们填写的上游名称就是node1-as-upstream)

(7)添加策略即可

效果图: 

(8)进入Admin里的Federation Status查看联邦状态,如果是running证明运行成功

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/733364.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

macOS访达当前目录打开终端

在windows 11中,可以在【此电脑】中任意文件夹中鼠标右键,可能直接在当前目录打开【终端】。用久也感觉还是很方便的。 与是在macOS中,我也想得到类似的功能。如何实现记录下来。 实战过程 我的实战环境是: 操作系统&#xff1a…

【数据结构常见七大排序(一)】—插入排序篇【直接插入排序】And【希尔排序】

目录 1.排序的概念及其运用 1.1排序的概念 1.2排序运用 1.3常见的七大排序 2.直接插入排序 2.1基本思想 2.2直接插入排序 2.3动图助解 2.4直接插入排序源码 2.5直接插入排序的特性总结 3.希尔排序( 缩小增量排序 ) 3.1希尔排序概念及思想 3.2希尔排序图解 3.3希尔…

用颜色表示数据的第三个维度

横纵坐标显示时间和空间后,第三个数据的特征有时就不好表示了,3d图有的时候看起来更复杂。对于某些情况,用颜色来表示更加简洁。 这里展示的效果图有点像烟花,所以选了这张,但是换其他的cmap才能使得数据展示更加直观 …

举例解释Lingo的条件执行@if语句

可变成本问题 某公司生产A、B、C共3种产品,售价分别是12元、7元和6元。生产1件这些产品的技术服务、直接劳动、材料的消耗以及这些资源的限量如表所示。 产品\项目 技术服务(h) 直接劳动(h) 材料(kg) 售价(¥/件) A 1 10 3 12 B 2…

Linux的

(该图由AI绘制 关注我 学习AI画图) 目录 网络配置 1、ifconfig查看网络信息 2、与网卡相关的配置文件 3、查询计算机的网络状态 4、systemctl启动/重启/停止网络 Linux远程连接与文件传输 1、为什么需要远程连接 2、SSH协议 3、sshd服务 4、…

SpringBoot——设置随机值测试

在测试中加入随机值 之前我们在测试的时候都是写死的数据,但是有时候我们的数据并不一定是已知的数据,有可能你不知道用户要输入什么数据,这时候我们可以用随机值的方式进行代码的测试。 设置随机值 设置随机值的方式非常简单,…

6-开发模型(5个)

目录 1.瀑布模型(Waterfall Model) 2.螺旋模型(Spiral Model) 3.增量模型(Incremental Model) 4.迭代模型(Iterative Model) PS:增量模型和迭代模型的区别 5.敏捷模…

暑假第五天打卡

Java //1、练习题:判断如下代码是否编译通过,如果能,结果是多少? short s1 120; short s2 8; short s3 s1 s2; //编译不通过,因为s1s2自动提示为int类型 //3、练习题:判断如下代码是否编译通过&am…

雅思考试口语怎么备考才能拿到7分

很多学生在雅思考试里拿到总分7分的好成绩,雅思的口语要怎么准备才能拿到这样的好成绩?其实雅思口语7分的难度不高,下面就来看看雅思口语应该如何备考? 一、雅思口语考试怎么考7分 1、“流利度”如何拿7分 很多雅思口语提升攻略…

【算法】算法笔记(C++)

一、数组 求数组大小 nums.size()//防止报错 数组中的按大小排序 sort(nums.begin(), nums.end()); 获取最大值/最小值 int nums[8] {1,2,3,8,0,33,11,9}; int max_num *max_element(nums, nums 8); int min_num *min_element(nums, nums 8); 将数组a中的数值置为0…

ElasticSearch学习笔记一——下载及安装

最近发现ES是个很重要的内容啊,各种大厂都会使用ES来做一些大范围的搜索之类的功能,所以今天我们也来学习一下。 首先我们要准备Java的环境,推荐版本8、11、14 ES官方的JDK兼容性列表(有些慢,需要耐心等待一下哈) 在我写文章时&…

数值微分与计算图

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、使用数值微分计算导数二、计算图 提示:以下是本篇文章正文内容,下面案例可供参考 一、使用数值微分计算导数 假设函数是y x ** 2&…

探索Gradio库的Radio模块及其change、input和select方法

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

linux之复制文件(cp/tar/rsync/cpio)

复制文件 命令一: cp time cp -a /home/learn/files /home/learn/test/cp real 6m7.699s user 0m0.568s sys 0m48.372s命令二:tar time (cd /home/learn/files; tar c .) | (cd /home/learn/test/tar ; tar x) real 2m7.848s user 0m1.209s sys 1m12.82…

Nuxt3引入Element-plus和sass

1.引入Element-plus 打开编辑器终端 运行npm install element-plus/nuxt 或者命令行cd到项目文件 运行npm install element-plus/nuxt package.json文件会出现 使用Element-plus 在nuxt.config.ts文件添加代码 export default defineNuxtConfig({devtools: { enabled: true }…

Blender基础入门(2):Blender简单渲染

文章目录 我个人的Blender专栏前言渲染基本常识科普Blender渲染设置Blender窗口分栏分屏渲染 渲染设置GPU渲染引擎推荐最大采样 切换摄像机渲染图片渲染采样512和4096差异512采样4096采样 渲染建议 我个人的Blender专栏 Blender简单教学 前言 渲染是从白模到成品的过程&…

CTFSHOW 每周大挑战 RCE极限挑战

RCE挑战1 开题直接给了源码 过滤了括号和点号。 使用内敛绕过。 payload: codeecho tac /f1agaaa;RCE挑战2 源码直接给了。 基本把能用的都过滤了,只剩下$()_;[],./字符,自增RCE无疑。 //相当于 ($_GET[_])($_GET[__]) 使用的时候url编…

【雕爷学编程】Arduino动手做(156)---OTTO两足舵机机器人

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…

【Mac】安装DbServer

1.下载 链接: https://pan.baidu.com/s/13Vzsv1sLAq-J8RsRgtL-pw 提取码: 8gsr 2.安装 如果提示已损坏,无法打开。 解决方式: 打开“终端”,输入命令:sudo spctl --master-disable,这个过程中会提示要输入密码&…

C++ 库 vector初始化方式

vector 支持多种初始化方式,以下是几种常见的方法: 1. 默认初始化: 可以使用无参构造函数来创建一个空的 vector。例如: 创建一个空的整数向量 2. 指定大小和初始值: 可以使用带有两个参数的构造函数来指定 vector 的大小和初始值。例如&am…