zoukankan      html  css  js  c++  java
  • RabbitMQ——Fedration插件

    前言

    Fedration插件用来在不同的RabbitMQ集群之间复制队列消息,集群可以是内网也可以是公网,而这些对应用来说是透明的,即应用不会感知到,也不需要编写相关代码。

    应用场景:

    • 集群间复制队列消息
    • 集群升级

    特点:

    • 松耦合性(Loose coupling)
      • federation 插件能够在分属不同管理域的 broker 或 cluster 之间传递消息:
      • 他们可能设置了不同的 user 和 vhost ;
      • 他们可能运行在不同版本的 RabbitMQ 和 Erlang 上;
    • WAN 友好性(WAN-friendly)
      • federation 插件基于 AMQP 0-9-1 协议在不同 broker 之间进行通信,并设计成能够容忍不稳定的网络连通情况;
    • 扩展性(Scalability)
      • federation 不需要在 n 个 broker 之间建立 O(n^2) 个连接(尽管这是最简单的使用模式),这也就意味着 federation 在使用时更容易扩展

    一、Fedration相关术语

    1、Upstream(上游)、Downstream(下游)

    上面有2个RabbitMQ集群,A和B,如果我们希望每次发到A的某个Exchange或队列的信息也发送到B,则A是Upstream,B是Upstream,

    即数据流向是从Upstream流向Downstream的。不过Rabbit MQ里操作比较特殊,添加Upstream要在Downstream中加,而不是反过来在Upstream加Downstream。

    2、Policy(策略)

    即用来控制Fedration如何生效的,一个Fedration涉及到以下因素:

    A、Upstream

    因为是在Downstream中添加的,所以添加的时候需要指定Upstream的地址

    B、应用到Exchange还是Queue(队列)

    Fedration有几种类型,分别是应用到Exchange和Queue还是全部。

    二、安装Fedration插件

    首先是安装Erlang和RabbitMQ,这里不详述,注意两个版本对应上。

    然后在Downstream(下游)集群启用插件:

    rabbitmq-plugins enable rabbitmq_federation
    rabbitmq-plugins enable rabbitmq_federation_management

    注意:当你在一个cluster中使用federation插件,所有在集群中 的nodes都需要安装federation插件

    三、创建Fedration

    做实验之前,先规划下:

    Upstream节点:172.21.107.236

    Downstream节点:172.21.107.77

    因为Fedration有分Exchange和Queue的,Queue就简单了,而Exchange分几种类型:Topic、Fanout、Direct。

    为了方便实验我们只测试Topic类型的,Exchange和Queue的信息如下:

    Exchange
    Type:Topic
    Name:oneplus_exchange
    Routing Key:sms
    Queue:
    Name:sms

    我们希望的结果是发送到236机器的oneplus_exchange这个Exchange的routing key为sms的消息都转发到77上,并且在236上不保存消息。

    1、先添加Upstream

    登录172.21.107.77后台:http://172.21.107.77:15672/#

    点击Admin——Fedration Upstreams

    添加界面如下:

    Name根据命名规范自己定义,比较重要的参数如下:

    URI:常用的格式:amqp://{用户名}:{密码}@{ip}

                        例子:amqp://guest:guest@172.21.107.236

    Prefetch count:可以取多少条消息而不回复,和下面的Acknowledgement Mode配合使用,Acknowledgement Mode一般设为On Confirm,即确认才不重发。

    Expires:代表缓存时间,如果说网络连通性不好的时候,消息会在上游的队列中缓存的时间,超时丢弃,设置为空则表示,永远缓存不会丢弃数据(但是如果长时候不恢复内存会占用越来越大,建议设置上)

    Acknowledgement Mode: 代表消息确认方式,用来防止消息在传输过程中丢失,有三个值,on-confirm、on-publish、no-ack,对传输速度的影响是从慢速到快速,对安全性是不会丢失到可能会丢失。通常使用on-publish,不然on-confirm太慢了。

    其它参数先默认就OK了。

    2、在Downstream上添加policy

    注意是在Downstream上添加,如果使用了镜像队列,好像有冲突。

    重要的参数:

    Pattern:匹配的正则,遵守左前缀匹配原则,如我想针对所有oneplus_exchange开头的这里就写oneplus_exchange

    Apply to:应用到Exchange还是Queue还是两者都应用。我们实验是针对Exchange,所以只选Exchange。

    federation-upstream:要应用到哪个Upstream上

    3、在77上添加Exchange和Queue

    Exchange:

    Queue:

    然后绑定Exchange和Queue:

    4、在236上添加Exchange和Queue

    添加之后有个灰的Exchange:

    注意:Exchange不要绑定Queue

    Queue也有个灰色的:

    5、查看状态图

    现在,刚才新建的 exchange 应该建立了 federation ,因为它都能匹配上面的 policy,可以通过页面查看状态

    6、发送消息

    执行之后到236(Upstream)上看:

    再到77(Donwstream)上看:

    四、总结

    发送给Upstream:消息会复制给Downstream,如果Upstream也绑定了routing key,则Upstream也会保存1份消息。

    发送给Downstream:消息只在Downstream上有,不会复制到Upstream。

    即数据流向是单边的,只能从Upstream复制到Downstream,默认两边都会有1份,如果Upstream不想要则可以不绑定Queue。

    引用:

  • 相关阅读:
    第五次作业
    第四次作业
    第三次
    request.getAttribute()和 request.getParameter()有何区别
    .Servlet API中forward()与redirect()的区别
    jsp和servlet的区别、共同点、各自应用的范围
    Servlet的生命周期
    如何从CDN加载jQuery
    window.onload()函数和jQuery中的document.ready()的区别
    jquery中$.get()提交和$.post()提交的区别
  • 原文地址:https://www.cnblogs.com/caoweixiong/p/14775356.html
Copyright © 2011-2022 走看看