在说正题之前先解释一下交换机模式是个笼统的称呼,它不是一个单独的模式(包括了订阅模式,路由模式和主题模式),交换机模式是一个比较常用的模式,主要是为了实现数据的同步。

首先,说一下订阅模式,就和字面上的意思差不多主要就是一个生产者,多个消费者,同一个消息被多个消费者获取,先看一下官网的图示

整体执行过程就和图里一样,生产者把消息发送到交换机,然后队列绑定到交换机,消息由交换机发送到队列,每一个队列都有一个各自的消费者。这样

就实现了一个消息被多个消费者所获取,而且如果有新的消费者加入直接绑定队列到交换机就可以了,大大的降低了系统间的耦合度。还有一点要注意的就是

当我们把消息发送到一个没有队列绑定的交换机时,消息就会丢失,因为消息只能存储在队列,而交换机只做交换,不做存储!

生产者代码:

public class Send {

private final static String EXCHANGE_NAME = "exchange_name"; //交换机名称

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

// 获取MQ连接和通道

Connection connection = ConnectionUtil.getConnection();

Channel channel = connection.createChannel();

// 声明交换机

channel.exchangeDeclare(EXCHANGE_NAME, "fanout");

// 消息内容

String message = "生产者消息";

channel.basicPublish(EXCHANGE_NAME, "", null, message.getBytes());

System.out.println(" 发送 '" + message + "'");

channel.close();

connection.close();

}

}

消费者一号代码:

public classRecv {private final static String QUEUE_NAME = "test_queue_ex";private final static String EXCHANGE_NAME = "exchange_name";public static void main(String[] argv) throwsException {

Connection connection=ConnectionUtil.getConnection();

Channel channel=connection.createChannel();//声明队列

channel.queueDeclare(QUEUE_NAME, false, false, false, null);//绑定队列到交换机

channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "");

channel.basicQos(1);//定义队列的消费者

QueueingConsumer consumer = newQueueingConsumer(channel);//监听队列,手动返回完成

channel.basicConsume(QUEUE_NAME, false, consumer);//获取消息

while (true) {

QueueingConsumer.Delivery delivery=consumer.nextDelivery();

String message= newString(delivery.getBody());

System.out.println(" 消费者一号 '" + message + "'");

Thread.sleep(10);

channel.basicAck(delivery.getEnvelope().getDeliveryTag(),false);

}

}

}

消费者二号代码:

public classRecv2 {private final static String QUEUE_NAME = "test_queue_ex2";private final static String EXCHANGE_NAME = "exchange_name";public static void main(String[] argv) throwsException {

Connection connection=ConnectionUtil.getConnection();

Channel channel=connection.createChannel();

channel.queueDeclare(QUEUE_NAME,false, false, false, null);

channel.queueBind(QUEUE_NAME, EXCHANGE_NAME,"");

channel.basicQos(1);

QueueingConsumer consumer= newQueueingConsumer(channel);

channel.basicConsume(QUEUE_NAME,false, consumer);while (true) {

QueueingConsumer.Delivery delivery=consumer.nextDelivery();

String message= newString(delivery.getBody());

System.out.println("消费者二号 '" + message + "'");

Thread.sleep(10);

channel.basicAck(delivery.getEnvelope().getDeliveryTag(),false);

}

}

}

运行代码之后可以看到

生产者发送的消息已经存储在了交换机之中。查看绑定关系如下图所示:

所以,可以得出结论一个消息被多个消费者所消费。订阅模式也存在着缺陷有时并不是所有数据都需要同步,所以用订阅模式来做数据同步并不合理。于是就用到了路由模式。

路由模式

官网图示如下:

和订阅模式比较类似,只是type变成了direct类型,路由模式也是先由生产者发送消息到交换机,然后在根据绑定键来判断消息发送到哪一个交换机。如下图:

和订阅模式的区别就是生产者发送消息时要先声明消息的类型,也就是说消息会被哪类消费者所获取

消费者和生产者保持一个类型的时候,就可以接收到对应生产者所发送的消息了。从而可以过滤掉不需要的消息类型。

主题模式

主题模式个人感觉就和sql语句里的like关键字一样,不用保证消息类型一样,只要保证其相似就可以接收消息了,相比于路由模式,

主题模式匹配率比较低,但是功能确提高了很多,减少了路由key的创建,如图所示:

type变成了topic类型,至于其他方面和路由模式一样就不多说了。

php rabbit怎么使用默认的交换机,RabbitMQ-交换机模式相关推荐

  1. 还不知道 RabbitMQ 常用的几种交换机模式?这篇小白都能看懂的 RabbitMQ 交换机模式

    要了解 RabbitMQ 的交换机发布订阅模型,先来了解下 RabbitMQ 消息传递模型的核心思想:生产者从不直接向队列发送任何消息.实际上,通常情况下,生产者甚至根本不知道消息是否会被传递到任何队 ...

  2. RabbitMQ——交换机

    1. 交换机 exchange 不指定交换机直接发送到队列时,多个消费者之间存在的是竞争关系,一个消息只能被一个消费者接收,其他的消费者不能够再次接收:交换机可以绑定多个不同的队列,但是其Routin ...

  3. RabbitMQ交换机(Fanout、Direct、Topic)三种模式详解

    一. 交换机 1.1 Exchanges 1.1.1 Exchanges概念 ​ RabbitMQ 消息传递模型的核心思想是: 生产者生产的消息从不会直接发送到队列.实际上,通常生产 者甚至都不知道这 ...

  4. RabbitMQ交换机简介

    介绍 RabbitMQ消息传递模型的核心思想是:生产者生产的消息从不会直接发送到队列.实际上,通常生产者甚至都不知道这些消息传递传递到了哪些队列中. 相反,生产者只能将消息发送到交换机(exchang ...

  5. RabbitMQ交换机类型

    RabbitMQ交换机类型 一.Direct Exchange(直连交换机) 二. Fanout Exchange(扇型交换机) 三.Topic Exchange(主题交换机) 四.Headers E ...

  6. 认识RabbitMQ交换机模型

    认识RabbitMQ交换机模型 原文:认识RabbitMQ交换机模型 前言 RabbitMQ是消息队列中间件(Message Queue Middleware)中一种,工作虽然有用到,但是却没有形成很 ...

  7. Rabbitmq交换机详解

    rabbitmq交换机 1.作用: 接受生产者的消息,然后根据路由键routingKey把消息投递到跟交换机绑定的对应的队列上 2.属性 Name: 交换机的名称 Type: 交换机的类型,direc ...

  8. (需求实战_进阶_07)SSM集成RabbitMQ 订阅模式 关键代码讲解、开发、测试

    接上一篇:(企业内部需求实战_进阶_06)SSM集成RabbitMQ 订阅模式 关键代码讲解.开发.测试 https://gblfy.blog.csdn.net/article/details/104 ...

  9. (需求实战_进阶_06)SSM集成RabbitMQ 订阅模式 关键代码讲解、开发、测试

    背景: 为了减轻服务器的压力,现在原有项目的基础上集成消息队列来异步处理消息! 此项目是企业真实需求,项目的代码属于线上生产代码,直接用于生产即可! 此项目采用MQ发送消息模式为:订阅模式,如果对Ra ...

  10. RabbitMQ初步到精通-第四章-RabbitMQ工作模式-Routing

    第四章-RabbitMQ工作模式-Routing 1.模式介绍 1.1 模式 路由模式-继续还是和Exchange打交道,上节提到的Exchange类型为Fanout,此次声明的类型为direct 与 ...

最新文章

  1. R语言KEGGREST包
  2. SAP MM 如何手工修改IDoc的状态?
  3. 顶级Java多线程面试题及回答
  4. 性能分析工具 Android TraceView
  5. centos7下kafka2.12-2.1.0的安装及使用
  6. Linux动态链接库的使用
  7. python的文件式如何操作_Python文件操作
  8. 互斥锁pthread_mutex_t的使用
  9. altas(ajax)控件(二十):让BulletedList拥有客户端索引、分页和排序的控件
  10. 智能一代云平台(三十八):单元测试推动开发,如何避免服务之间依赖拖了工期
  11. aidl远程服务调用Android,报错:Process 'command 'F:\Android\SDK\build-tools\29.0.0\aidl.exe''
  12. Android Toast小解
  13. 小米笔记本适合计算机专业吗,小米笔记本性价比如何?该不该买?这篇最客观了。...
  14. MGV2000_S905L系列_线刷_通刷固件
  15. 海贼王燃烧意志服务器维修,海贼王燃烧意志刷经验
  16. 第二章 Pyton语言基础、Ipython及Jupyter notebook(?功能,%run命令,魔法函数)
  17. oracle 按照固定顺序排序
  18. 循环语句—do…while循环
  19. [转载]HEVC的快速模式选择(一)
  20. Element-UI可编辑表格的实现

热门文章

  1. 机械设计手册2[1].0的关于要插盘的问题的解密文件
  2. R语言:接受拒绝法(Acceptance-Rejection Method)生成随机数
  3. 计算机技术类岗位英文简历,计算机科学与技术类专业英文简历模板.docx
  4. java生成缩略图例子_具体介绍java生成缩略图的方法示例代码
  5. vs2013开发简单ATL ocx控件
  6. 华为mate30计算机删了怎么找回,华为mate30pro桌面天气删除了怎么恢复
  7. javaweb JAVA JSP超市管理系统源码超市订单管理系统商品进销存系统超市后台管理
  8. 超详细解析|大厂都在用的设计提效神器 Design Toke
  9. 关于ChatGPT的一些小问题
  10. 人大金仓与新疆大学开启产学研合作,助力数据库产业人才建设