当前位置: 首页 > news >正文

济南建设集团招聘信息网站安徽省建设工程信息网站

济南建设集团招聘信息网站,安徽省建设工程信息网站,泰州企业模板建站,政务网站建设浙江概念 从计算机术语层面来说,RabbitMQ 模型更像是一种交换机模型。 Queue 队列 Queue:队列,是RabbitMQ 的内部对象,用于存储消息。 RabbitMQ 中消息只能存储在队列中,这一点和Kafka相反。Kafka将消息存储在topic&am…

概念

从计算机术语层面来说,RabbitMQ 模型更像是一种交换机模型。
在这里插入图片描述

Queue 队列

Queue:队列,是RabbitMQ 的内部对象,用于存储消息。
RabbitMQ 中消息只能存储在队列中,这一点和Kafka相反。Kafka将消息存储在topic(主题)这个逻辑层面,而相对应的队列逻辑只是topic实际存储文件中的位移标识。

RabbitMQ不支持队列层面的广播消费。

交换器、路由键、绑定

交换器

Exchange :交换器,生产者将消息发送到Exchange,由交换器将消息路由到一个或者多个队列中,如果路由不到,则会返回给生产者或者丢弃消息。交换器

类型

RabbitMQ 中的交换器有四种类型:

direct(径直的)

它会吧消息路由到那些 BindingKeyRoutingKey 完全匹配的队列中。

fanout(扇出)

它会把所有发送到该交换器的消息路由所有与该路由器绑定的队列中

topic(模糊匹配)

它与 direct 类型的交换器相似,也是将消息路由到 BindingKey 和 RouingKey 相匹配的队列中,但这里的匹配规则有些不同:

  • RoutingKey 为一个点号“.” 分隔的字符串(被点号“.”分隔开的每一段独立的字符串称为一个单词),如 com.rabbitmq.clientjava.util.concurrent;
  • BindingKey 和 RoutingKey 一样也是点号分隔的字符串;
  • BindingKey 中可以存在两种特殊字符串 “*”,“#”,用于模糊匹配,其中星号用于匹配一个单词,“#”用于匹配零个和多个单词。

举个栗子

  • 路由键为 “com.rabbitmq.client” 的消息会同时路由到 queue1 和 queue2;
  • 路由键为 “com.hidden.client” 的消息会路由到 queue2中;
  • 路由键为 “com.hidden.demo” 的消息会路由到 queue2中;
  • 路由键为 “java.rabbitmq.demo”的消息会路由到 queue1中;
  • 路由键为 “java.util.concurrent” 的消息将会被丢弃或者返回给生产者(需要设置 mandatory 参数),因为它没有匹配任何路由键;

topic 类型的交换器

headers

headers 类型的交换器不依赖于路由键的匹配规则来路由消息,而是根据发送的消息内容中 headers 属性进行匹配。headers 类型的交换器性能会很差,而且也不实用,基本上不会看到它的存在。

开发向导

RabbitMQ使用过程

生产者发送消息

  1. 连接 RabbitMQ Broker,建立一个 Connection ,开启 一个信道 Channel;
  2. 声明交换器,并设置相关属性;比如交换机类型、是否持久化等;
  3. 声明队列,并设置相关属性;如果是否排他、是否持久化、是否自动删除等;
  4. 通过 RoutingKey 将 Exchange 和 Queue 绑定;
  5. 发送消息到 RabbitMQ,其中包括路由键、交换器等信息;
  6. 交换器根据路由键查找匹配的队列;
  7. 如果找到,则将从生产者发送过的消息存入队列中;
  8. 如果没有找到,则根据生产者配置的属性选择丢弃或者回退给生产者;
  9. 关闭信道;
    10.关闭连接;

消费者接收消息

  1. 连接到 RabbitMq Broker,建立一个 Connection,开启一个信道 Channel;
  2. 向 RabbitMq Broker 请求消费对应队列的消息,可能会设置想要的回调函数,以及做一些准备工作;
  3. 接收消息;
  4. 消费者确认(ack)接收到的消息;
  5. RabbitMQ 从队列中删除已被确认消费的消息;
  6. 关闭信道;
  7. 关闭连接;

由使用过程发现,无论生产者或者消费者都需要和 RabbitMQ Broker 建立连接,这个连接(Connection)就是一条 TCP 连接,一旦 TCP 连接建立起来,客户端紧接着可以创建一个 AMQP 信道(Channel),每个信道都会被指派一个唯一ID。

信道是建立在 Connection 之上的虚拟连接,RabbitMQ 处理的每条 AMQP 指令都是通过信道完成的。
Connection 与 Channel

使用交换器和队列

代码清单

channel.exchangeDeclare(exchangeName,"direct",true);
String queueName = channel.queueDeclare().getQueue(); 
// or 声明队列
channel.queueDeclare(queueName,true,false,false,null);
channel.queueBind(queueName,exchangeName,routingKey);

exchangeDeclare 方法详解

exchangeDeclare 有多个重载方法,这些重载方法都是由下面这个方法中缺省的某些参数构成的。

Exchange.DeclareOk exchangeDeclare(String exchange,String type,boolean durable,boolean autoDelete,boolean internal,Map<String, Object> arguments) throws IOException;
参数说明
  1. exchange:交换器名称;
  2. type:交换器类型;如:direct、fanout、topic、headers;
  3. durable:是否持久化;持久化可以将交换器存盘,在服务器重启的时候不会丢失相关消息;
  4. autoDelete:是否自动删除;自动删除前提:只有有一个队列或交换器与这个交换器绑定了,之后所有与这个交换器绑定的都解绑。(只有绑过到解绑的过程,交换器才会删除,没有绑过则不会删除);
  5. internal:是否内置的;如果是内置交换器,则客户端无法直接发送消息到这个交换器,只能通过交换器路由到交换器这种方式;
  6. argument: 结构化参数;比如: alternate-exchange等;

queueDeclare 方法详解

Queue.DeclareOk queueDeclare() throws IOException;
Queue.DeclareOk queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete,Map<String, Object> arguments) throws IOException;
参数说明
  1. queue:队列名称;
  2. durable:是否持久化;持久化的队列会存盘,服务器重启的时候可以保证不丢失相关信息;
  3. exclusive:是否排他;如果一个队列设置为排他,则该队列仅对首次声明它的连接可见,连接断开后自动删除;排他是基于连接(Connection)可见的。其他Connection 不可声明同名排他队列,而且即使排他队列设置了持久化,一旦连接关闭或者客户端退出,排他队列都会自动删除。
  4. autoDelete:是否自动删除;自动删除的前提是:至少有一个消费者连接到这个队列,之后所有与这个队列连接的消费者都断开后,才会自动删除;如果没有消费者连接过,则不会删除;
  5. arguments:队列的其他一些参数;如:x-message-ttlx-expiresx-max-lengthx-max-length-bytesx-dead-letter-exchangex-dead-letter-routing-keyx-max-priority等;

注意要点
生产者和消费者都能够使用 queueDeclare 来声明一个队列,但是如果消费者在同一个信道上订阅了另一个队列,就无法再声明队列了。必须先取消订阅,然后将信道置为“传输”模式,之后才能声明队列。

queueBind 方法详解

Queue.BindOk queueBind(String queue, String exchange, String routingKey) throws IOException;Queue.BindOk queueBind(String queue, String exchange, String routingKey, Map<String, Object> arguments) throws IOException;void queueBindNoWait(String queue, String exchange, String routingKey, Map<String, Object> arguments) throws IOException;
参数说明
  1. queue:队列名称;
  2. exchange:交换器名称;
  3. routingKey:用来绑定队列和交换器的路由键;
  4. argument:定义绑定的一些参数;

不仅可以将队列和交换器绑定起来,也可以将已经绑定的关系解除;

Queue.UnbindOk queueUnbind(String queue, String exchange, String routingKey) throws IOException;
Queue.UnbindOk queueUnbind(String queue, String exchange, String routingKey, Map<String, Object> arguments) throws IOException;

exchangeBind 方法详解

不仅可以将交换器与队列绑定,也可以将交换器与交换器进行绑定,用法如出一辙。

Exchange.BindOk exchangeBind(String destination, String source, String routingKey) throws IOException;
Exchange.BindOk exchangeBind(String destination, String source, String routingKey, Map<String, Object> arguments) throws IOException;
void exchangeBindNoWait(String destination, String source, String routingKey, Map<String, Object> arguments) throws IOException;
http://www.yayakq.cn/news/192825/

相关文章:

  • 中山全麦网站建设西安网站建设招聘
  • 高端个性化网站开发深圳专业建网站公司排行
  • 北京建设注册中心网站做mp3链接的网站
  • 太原网站建设方案服务安康政务微平台公众号
  • 聊城公司网站设计wordpress怎么进入论坛
  • 做企业网站cms运营服务公司经营范围
  • 全能网站服务器wordpress商城对接支付接口
  • 网站改版的好处主机开通成功网站建设中
  • 广州网站推广模板wordpress酷
  • 闸北网站建设优设网免费素材
  • 做简易动画的网站php彩票网站建设源码
  • 营销型设计网站不备案网站怎么做推广
  • 天津seo网站设计事业单位门户网站开发
  • 怎么自己开网站网站图标生成
  • 家电网站建设费用唐山网站建设开发
  • 网站制作包括什么怎么做下载网站吗
  • 自建网站平台 优帮云如何给网站配置域名
  • WordPress多语言多站点部门网站建设的目的和意义
  • 海南映客交友软件seo必备软件
  • 高效网站建设与维护岗位职责建大网站
  • 北京做机床的公司网站广东网站营销seo费用
  • 网站建设新手教程视频一线视频免费观看
  • 无锡网站建设xinysu购物网站开发的意义
  • 佛山网站建设联系wordpress第一次进来要几秒钟
  • 广汉移动网站建设网页设计跳转链接怎么制作
  • 设计本官方网站 网络服务天津建设银行公积金缴费网站
  • 广州市官网网站建设报价数据分析网站html模板下载
  • 东莞网站排名wordpress京豆插件
  • 网站源码下载了属于侵权吗成都网站开发
  • 网站建设 seo商情网网站的开发和建设有什么区别