柳州网站建设推荐怎么网站代备案

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

柳州网站建设推荐,怎么网站代备案,wordpress 点击特效,wordpress 小工具代码这篇文章主要介绍RabbitMQ中几个重要的概念#xff0c;对于初学者来说#xff0c;概念性的东西可能比较难以理解#xff0c;但是对于理解和使用RabbitMQ却必不可少#xff0c;初学阶段#xff0c;现在脑海里留有印象#xff0c;随着后续更加深入的学习#xff0c;就会很…        这篇文章主要介绍RabbitMQ中几个重要的概念对于初学者来说概念性的东西可能比较难以理解但是对于理解和使用RabbitMQ却必不可少初学阶段现在脑海里留有印象随着后续更加深入的学习就会很容易理解。对于消息队列的高手这篇文章如有阐述不到位的可以一起交流。 RabbitMQ整体上是一个生产者和消费者模型如下图。 生产者和消费者 RabbitMQ的Producer和其他消息队列的Producer没有什么不同都是用来将消息发送到服务器只是在实现上有所区别关于RabbitMQ客户端的实现包括API和网络模型等后面会专门有文章介绍。 RabbitMQ Consumer连接Broker并订阅它关注的队列只要队列上有消息Consumer就会接收到消息并开始消费消息。RabbitMQ的消费端默认是推模型。 有Producer、Consumer那么就会有一个地方来存储、转发消息RabbitMQ Broker完成这项工作在这里可以先简单的把一个Broker理解为一个RabbitMQ 节点或实例。 队列 Queue是RabbitMQ的内部对象是实际存储Producer发送的消息的地方这点和Kafka存储消息的模型不一样。 Producer发送消息并不是直接发送到Queue而是在发送消息的请求中声明Exchange交换器 和 RoutingKey绑定键Broker会根据Exchange 和 RoutingKey找到相应的Queue并保存消息内容到Queue。 Consumer订阅的是Queue所有直接从Queue上消费消息。RabbitMQ支持多个Consumer同时订阅一个Queue这时Broker会轮询Consumer把Queue中的消息均摊到所有订阅次Queue的Consumer。但是RabbitMQ不支持队列层面的广播消费。 交换器、路由键、绑定 下面介绍的是RabbitMQ中非常重要的概念生产和消费消息都是以此为基础也是对AMQP协议的具体实现。 交换器Exchange负责按照一定的规则分发消息Producer发送的消息实际上是到Exchange由Exchange将消息路由到一个或多个Queue如果找不到Queue则根据客户端配置要么返回给Producer要么直接丢弃。 路由键RoutingKey指定了路由规则在Producer发送消息的时候一般会指定RoutingKey这样就知道消息需要路由到哪里。 绑定BingKey将Exchange和Queue关联起来这样RabbitMQ就知道如何正确的将消息路由到队列了。 关于路由键和绑定键对于初学者可能有点混淆这里分享下我的理解路由键是在客户端发送消息的时候告诉服务器我发送的消息根据我指定的路由键去找队列而绑定键是在创建的时候使用的告诉服务器交换器是如何与队列关联的。具体可以对照下面的代码示例来理解可能容易点。 交换器类型 RabbitMQ提供了多个交换器类型来满足不同的需求fanout、direct、topic、headers。 fanout fanout exchange会把消息发送到所有与该交换器绑定的队列中会忽略Procuder发送消息时申明的RoutingKey。如下图Producer发送message给fanout_exchange并制定了routing key 为 info最终queue1和queue2都收到了这条消息。 public void testFanoutExchange() throws IOException, TimeoutException {// fanout类型的 exchange, 在server端忽略 routing key只要发送到 exchange任何和这个 exchange 绑定的 queue都会收到这条消息String exchangeName fanout_exchange;String queue1 queue1;String queue2 queue2;String warning warning;String info info;ConnectionFactory factory new ConnectionFactory();factory.setHost(localhost);factory.setPort(5672);factory.setUsername(root);factory.setPassword(root);Connection connection factory.newConnection();Channel channel connection.createChannel();channel.exchangeDeclare(exchangeName, BuiltinExchangeType.FANOUT, true, false, null);channel.queueDeclare(queue1, true, false, false, null);channel.queueDeclare(queue2, true, false, false, null);channel.queueBind(queue1, exchangeName, warning);channel.queueBind(queue2, exchangeName, warning);channel.queueBind(queue2, exchangeName, info);String message info;channel.basicPublish(exchangeName, info, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());channel.close();connection.close();}direct direct exchange也是一种比较简单的exchange在路由的时候只有routing key 和binding key完全匹配的时候才会路由到queue。如下图Producer发送消息到direct_exchangerouting_key 是info只有queue2才会收到消息。 public void testDirectExchange() throws IOException, TimeoutException {String exchangeName direct_exchange;String queue1 direct_queue1;String queue2 direct_queue2;String warning warning;String info info;ConnectionFactory factory new ConnectionFactory();factory.setHost(localhost);factory.setPort(5672);factory.setUsername(root);factory.setPassword(root);Connection connection factory.newConnection();Channel channel connection.createChannel();channel.exchangeDeclare(exchangeName, BuiltinExchangeType.DIRECT, true, false, null);channel.queueDeclare(queue1, true, false, false, null);channel.queueDeclare(queue2, true, false, false, null);channel.queueBind(queue1, exchangeName, warning);channel.queueBind(queue2, exchangeName, warning);channel.queueBind(queue2, exchangeName, info);String message direct exchange;channel.basicPublish(exchangeName, info, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());channel.close();connection.close();}topic topic exchange 是比较灵活实际项目中用的比较多的一种它也是将消息路由到 routing key 和 binding key 匹配的队列中匹配规则如下 routing key 和 binding key 以点.为分隔符被点号分割的字符串为一个独立的匹配单元如com.rabbitmq.clientcom.java.util 等等。‘#’ 和 ‘’ 用于做模糊匹配‘#’ 匹配0个或多个词‘’ 匹配0个词。 下图中topic_exchange绑定了两个queue.rabbitmq. 绑定颅queue1 ..client 、 com.# 都绑定了queue2当binding key 为 com.rabbitmq.client匹配queue1和queue2因此都会收到消息当binding key 为 org.rabbitmq.server 时只有queue1匹配当 binding key 为 com.hidden.demo 时只有queue2匹配当bingding key 为 aaa 时queue1 和 queue2 都不匹配。 public void testTopicExchange() throws IOException, TimeoutException {// * 匹配一个单词# 匹配0个或多个单词String exchangeName topic_exchange;String queue1 topic_queue1;String queue2 topic_queue2;String routing1 .rabbitmq.;String routing2 ..client;String routing3 com.#;ConnectionFactory factory new ConnectionFactory();factory.setHost(localhost);factory.setPort(5672);factory.setUsername(guest);factory.setPassword(guest);Connection connection factory.newConnection();Channel channel connection.createChannel();channel.exchangeDeclare(exchangeName, BuiltinExchangeType.TOPIC, true, false, null);channel.queueDeclare(queue1, true, false, false, null);channel.queueDeclare(queue2, true, false, false, null);channel.queueBind(queue1, exchangeName, routing1);channel.queueBind(queue2, exchangeName, routing2);channel.queueBind(queue2, exchangeName, routing3);String message topic exchange;// queue1, queue2channel.basicPublish(exchangeName, com.rabbitmq.client, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());// queue1channel.basicPublish(exchangeName, org.rabbitmq.server, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());// queue2channel.basicPublish(exchangeName, com.hidden.demo, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());// NONEchannel.basicPublish(exchangeName, aaaa, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());}headers headers exchange 不依赖路由键的匹配规则来路由消息而是根据消息的headers属性值RabbitMQ收到消息后对比消息的headers中的属性值是否与queue、exchange绑定时指定的属性值一致如果完全匹配则路由消息到队列。由于headers exchange 性能很差所以这里不做代码演示感兴趣的小伙伴可以实验一下。 以上就是对RabbitMQ中的一些概念做了一下介绍小伙伴们可以多做实验加深理解我也是在写了几个UnitTest之后才理解这些概念尤其是Exchange、RoutingKey 和 BindingKey。 感谢各位小伙伴的阅览也很高兴能和各位小伙伴一起钻研探讨技术问题。