• RabbitMQ学习笔记(二、RabbitMQ结构)


    目录:

    • RabbitMQ几大组件
    • 交换器类型
    • RabbitMQ运行流程

    RabbitMQ几大组件:(与RabbitMQ第一节中AMQP一样,不细说)

    1、生产者、消费者、消息

    2、Broker:简单的来说broker就是一个RabbitMQ的一个服务节点

    3、队列

    4、交换器、路由键、绑定键

    交换器类型:

    1、fanout(分列):把所有发送到该交换器上的消息,路由到与该交换器绑定的队列中。

     1 public class Product {
     2 
     3     private static final String EXCHANGE_NAME = "exchange";
     4     private static final String QUEUE_NAME = "exchange_queue1";
     5     private static final String QUEUE_NAME2 = "exchange_queue2";
     6     private static final String ROUTING_KEY = "exchange_routingKey";
     7     private static final String ROUTING_KEY2 = "exchange_routingKey2";
     8 
     9     public static void main(String[] args) throws IOException, TimeoutException {
    10         Connection connection = getConnection();
    11         Channel channel = connection.createChannel();
    12         channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.FANOUT);
    13 
    14         // 定义队列1、队列2
    15         channel.queueDeclare(QUEUE_NAME, false, false, false, null);
    16         channel.queueDeclare(QUEUE_NAME2, false, false, false, null);
    17         // 将队列1、队列2绑定到同一个fanout交换器上,但路由键不一样
    18         channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY);
    19         channel.queueBind(QUEUE_NAME2, EXCHANGE_NAME, ROUTING_KEY2);
    20 
    21         // 仅发送路由键1的消息,但因绑定键是fanout类型,所以队列1和队列2都会受到消息
    22         channel.basicPublish(EXCHANGE_NAME,
    23                 ROUTING_KEY,
    24                 MessageProperties.PERSISTENT_TEXT_PLAIN,
    25                 "Hello world".getBytes());
    26 
    27         close(connection, channel);
    28     }
    29 }

    2、direct(直接):需要bindingKey和routingKey完全匹配才能成功发送消息。

    就fanout例子的第12行代码修改为channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);(注意:修改代码运行前,需要先将原先绑定的交换器删掉,因为之前那个交换器已经是fantou类型了;或者是定义一个新的交换器)

    便只有exchange_queue1才能接受到消息,便为2。

    3、topic(主题):与direct类似,但支持通配符匹配(类似于广播)。

    • #:匹配多个或零个单词
    • *:匹配一个单词

    4、header:不是根据路由键的匹配规则,而是通过发送消息中的header来匹配。

    RabbitMQ运行流程:

    1、生产者:

    • 生产者与Broker建立连接并开启信道
    • 生产者声明交换器(交换器类型、是否持久化、是否自动删除)、队列(是否持久化、是否排他、是否自动删除)
    • 生产者通过路由键将交换器和队列绑定
    • 生产者发送消息到Broker(携带路由键等)
    • 交换器再根据接收到的路由键以及交换器类型查找相匹配的队列,如果匹配上了将消息存入队列中,若未匹配上,则根据生产者的配置决定丢弃或是退回给生产者
    • 关闭信道和连接

    2、消费者:

    • 消费者与Broker建立连接并开启信道
    • 消费者向Broker请求消费相对应的队列,此中可以设置回调函数
    • 接受并处理消息
    • 消费者可以确认消息(ack)
    • RabbitMQ从队列中删除已被确认的消息
    • 关闭信道和连接
  • 相关阅读:
    如何应对“需求不确定型项目”?
    Python virtualenv安装库报错SSL: CERTIFICATE_VERIFY_FAILED
    R语言之——字符串处理函数
    你看那个人他像一条狗
    BZOJ 3744: Gty的妹子序列 [分块]
    BZOJ 3731 3731: Gty的超级妹子树 [树上size分块 !]
    BZOJ 3720: Gty的妹子树 [树上size分块]
    BZOJ 4129: Haruna’s Breakfast [树上莫队 分块]
    SPOJ COT2 Count on a tree II [树上莫队]
    【WC2013】糖果公园 [树上莫队]
  • 原文地址:https://www.cnblogs.com/bzfsdr/p/11801993.html
Copyright © 2020-2023  润新知