热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

基于RabbitMQ几种Exchange模式详解

下面小编就为大家带来一篇基于RabbitMQ几种Exchange模式详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

AMQP协议中的核心思想就是生产者和消费者隔离,生产者从不直接将消息发送给队列。生产者通常不知道是否一个消息会被发送到队列中,只是将消息发送到一个交换机。先由Exchange来接收,然后Exchange按照特定的策略转发到Queue进行存储。同理,消费者也是如此。Exchange 就类似于一个交换机,转发各个消息分发到相应的队列中。

RabbitMQ提供了四种Exchange模式:fanout,direct,topic,header 。 header模式在实际使用中较少,本文只对前三种模式进行比较。

一. Fanout Exchange

所有发送到Fanout Exchange的消息都会被转发到与该Exchange 绑定(Binding)的所有Queue上。

Fanout Exchange 不需要处理RouteKey 。只需要简单的将队列绑定到exchange 上。这样发送到exchange的消息都会被转发到与该交换机绑定的所有队列上。类似子网广播,每台子网内的主机都获得了一份复制的消息。

所以,Fanout Exchange 转发消息是最快的。

     /// 
  /// 生产者
  /// 
  /// 
  private static void ProducerMessage(MyMessage msg)
  {
   var advancedBus = CreateAdvancedBus();

   if (advancedBus.IsConnected)
   {
    var exchange = advancedBus.ExchangeDeclare("user", ExchangeType.Fanout);

    advancedBus.Publish(exchange, "", false, new Message(msg));
   }
   else
   {
    Console.WriteLine("Can't connect");
   }

  }

  /// 
  /// 消费者
  /// 
  private static void ConsumeMessage()
  {
   var advancedBus = CreateAdvancedBus();
   var exchange = advancedBus.ExchangeDeclare("user", ExchangeType.Fanout);

   var queue = advancedBus.QueueDeclare("user.notice.wangwu");
   advancedBus.Bind(exchange, queue, "user.notice.wangwu");
   advancedBus.Consume(queue, registration =>
   {
    registration.Add((message, info) => { Console.WriteLine("Body: {0}", message.Body); });
   });
  }

适用场景:

第一:大型玩家在玩在线游戏的时候,可以用它来广播重大消息。这让我想到电影微微一笑很倾城中,有款游戏需要在世界上公布玩家重大消息,也许这个就是用的MQ实现的。这让我不禁佩服肖奈,人家在大学的时候就知道RabbitMQ的这种特性了。

第二:体育新闻实时更新到手机客户端。

第三:群聊功能,广播消息给当前群聊中的所有人。

二. Direct Exchange

所有发送到Direct Exchange的消息被转发到RouteKey中指定的Queue。

Direct模式,可以使用rabbitMQ自带的Exchange:default Exchange 。所以不需要将Exchange进行任何绑定(binding)操作 。消息传递时,RouteKey必须完全匹配,才会被队列接收,否则该消息会被抛弃。

/// 
  /// 生产者
  /// 
  /// 
  private static void ProducerMessage(MyMessage msg)
  {
   var advancedBus = CreateAdvancedBus();

   if (advancedBus.IsConnected)
   {
    var queue = advancedBus.QueueDeclare("user.notice.zhangsan");

    advancedBus.Publish(Exchange.GetDefault(), queue.Name, false, new Message(msg));
   }
   else
   {
    Console.WriteLine("Can't connect");
   }

  }

  /// 
  /// 消费者
  /// 
  private static void ConsumeMessage()
  {
   var advancedBus = CreateAdvancedBus();

   var exchange = advancedBus.ExchangeDeclare("user", ExchangeType.Direct);

   var queue = advancedBus.QueueDeclare("user.notice.lisi");

   advancedBus.Bind(exchange, queue, "user.notice.lisi");

   advancedBus.Consume(queue, registration =>
   {
    registration.Add((message, info) =>
    {
     Console.WriteLine("Body: {0}", message.Body);
    });
   });
  }

三. Topic Exchange

所有发送到Topic Exchange的消息被转发到所有关心RouteKey中指定Topic的Queue上,

Exchange 将RouteKey 和某Topic 进行模糊匹配。此时队列需要绑定一个Topic。可以使用通配符进行模糊匹配,符号“#”匹配一个或多个词,符号“*”匹配不多不少一个词。因此“log.#”能够匹配到“log.info.oa”,但是“log.*” 只会匹配到“log.error”。

所以,Topic Exchange 使用非常灵活。

     /// 
  /// 生产者
  /// 
  /// 
  private static void ProducerMessage(MyMessage msg)
  {
   //// 创建消息bus
   IBus bus = CreateBus();

   try
   {
    bus.Publish(msg, x => x.WithTopic(msg.MessageRouter));
   }
   catch (EasyNetQException ex)
   {
    //处理连接消息服务器异常 
   }

   bus.Dispose();//与数据库connection类似,使用后记得销毁bus对象
  }

  /// 
  /// 消费者
  /// 
  private static void ConsumeMessage(MyMessage msg)
  {
   //// 创建消息bus
   IBus bus = CreateBus();

   try
   {
    bus.Subscribe(msg.MessageRouter, message => Console.WriteLine(msg.MessageBody), x => x.WithTopic("user.notice.#"));
   }
   catch (EasyNetQException ex)
   {
    //处理连接消息服务器异常 
   }
  }

使用场景:

新闻的分类更新

同意任务多个工作者协调完成

同一问题需要特定人员知晓

Topic Exchange的使用场景很多,我们公司就在使用这种模式,将足球事件信息发布,需要使用这些事件消息的人只需要绑定对应的Exchange就可以获取最新消息。

以上这篇基于RabbitMQ几种Exchange 模式详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


推荐阅读
  • 在Windows Server 2008 R2上配置IIS FTP服务
    本文详细介绍了如何在Windows Server 2008 R2操作系统上通过IIS配置FTP服务的过程,包括服务器角色的选择与安装、FTP站点的创建以及必要的服务和防火墙设置检查。 ... [详细]
  • 本文探讨了大型服务端开发过程中常见的几个误区,包括异步任务处理不当、日志同步模式使用、网络操作未设置超时、缓存命中率及响应时间未统计、单一缓存模式、分布式缓存加锁不当以及团队管理上的误区,旨在帮助开发者避免这些常见错误。 ... [详细]
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • 2023年最佳PHP开发学习路径推荐
    本文详细探讨了针对不同背景的学习者如何选择最适合自己的PHP开发学习资源,包括书籍、在线课程及培训机构的推荐。 ... [详细]
  • 在Linux系统上构建Web服务器的详细步骤
    本文详细介绍了如何在Linux系统上搭建Web服务器的过程,包括安装Apache、PHP和MySQL等关键组件,以及遇到的一些常见问题及其解决方案。 ... [详细]
  • 本文将详细介绍如何在ThinkPHP6框架中实现多数据库的部署,包括读写分离的策略,以及如何通过负载均衡和MySQL同步技术优化数据库性能。 ... [详细]
  • 本文探讨了如何通过WebBrowser控件在用户点击输入框时自动显示图片验证码。该过程可能涉及JavaScript事件的触发与响应。 ... [详细]
  • 深入解析SSL Strip攻击机制
    本文详细介绍了SSL Strip(一种网络攻击形式)的工作原理及其对网络安全的影响。通过分析SSL与HTTPS的基本概念,探讨了SSL Strip如何利用某些网站的安全配置不足,实现中间人攻击,以及如何防范此类攻击。 ... [详细]
  • 使用LVS与ldirectord实现高可用负载均衡
    本文介绍了如何通过LVS(Linux Virtual Server)结合ldirectord工具来实现服务器的健康检查及负载均衡功能。环境设置包括一个LVS节点和两个真实服务器节点,通过配置ldirectord进行健康状态监测,确保系统的高可用性。 ... [详细]
  • 本文详细探讨了 JMS (Java Message Service) 中创建会话(session)时使用的 createSession 方法的两个参数 paramA 和 paramB 的不同组合方式及其具体含义,特别是它们如何影响事务处理和消息确认模式。 ... [详细]
  • 深入解析MySQL查询优化:特定类型查询的高级策略
    本文详细探讨了MySQL中特定类型查询的优化方法,包括COUNT()查询、关联查询、LIMIT分页及UNION查询的优化技巧,旨在提高数据库查询效率。 ... [详细]
  • MySQL性能测试标准倡议:老叶提出的压测基准
    进行MySQL的压力测试通常是为了评估新旧版本之间的性能差异、验证硬件升级的效果、测试参数调整的影响以及评估新业务的负载承受能力。老叶提出了一个MySQL压力测试基准值倡议,旨在促进行业内的标准化和成果共享。 ... [详细]
  • APM(Application Performance Management,应用性能管理)对于提供互联网服务的企业至关重要。本文将深入探讨APM如何帮助识别和解决导致用户流失的技术问题,以及它在提升整体用户体验方面的作用。 ... [详细]
  • Redis安全防护深入解析
    本文详细探讨了如何通过指令安全、端口管理和SSL代理等措施有效保护Redis服务的安全性。 ... [详细]
  • JavaWeb技术架构解析
    本文探讨了JavaWeb开发中客户端与服务器端的交互模式,重点分析了B/S(浏览器/服务器)和C/S(客户端/服务器)两种架构的特点及应用场景。 ... [详细]
author-avatar
用户gum5gltoo8
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有