关于rabbitmq:RabbitMQ各Exchange适用场景

9次阅读

共计 2519 个字符,预计需要花费 7 分钟才能阅读完成。

Default Exchange(默认交换机)

在首先创立一个 Queen 之后,RabbitMQ 会把这个 Queen 间接绑定到默认交换机上,并且应用 Queen 的名字作为 Routing Key。
因而,对外体现的成果就是,客户端向这个 Queen 间接投递音讯,严格匹配。

// TODO 此处应该有代码 

Direct exchange(直连交换机)

和 Default Exchange 相似,但灵便度更高,基于 AMQP 协定,能够由 Producer 或 Consumer 进行指定,伪代码如下:

// 实现 BeanPostProcessor 类,应用 Bean 的生命周期函数
@Component
public class DirectRabbitConfig implements BeanPostProcessor {
    // 这是创立交换机和队列用的 RabbitAdmin 对象
    @Resource
    private RabbitAdmin rabbitAdmin;
    
    // 初始化 RabbitAdmin Bean
    @Bean
    public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory) {RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
        // 只有设置为 true,spring 才会加载 RabbitAdmin 这个类
        rabbitAdmin.setAutoStartup(true);
        return rabbitAdmin;
    }
    
    // 实例化 bean 后,也就是 Bean 的后置处理器
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        // 向 RabbitMQ 申明创立 Exchange
        rabbitAdmin.declareExchange(rabbitmqDemoDirectExchange());
        // 向 RabbitMQ 申明创立 Queen
        rabbitAdmin.declareQueue(rabbitmqDemoDirectQueue());
        return null;
    }
    /**
     * 申明一个 Queen Bean, 用于下面这个办法
     */
    @Bean
    public Queue rabbitmqDemoDirectQueue() {
        /**
         * 1、name:    队列名称
         * 2、durable: 是否长久化
         * 3、exclusive: 是否独享、排外的。如果设置为 true,定义为排他队列。则只有创建者能够应用此队列。也就是 private 公有的。* 4、autoDelete: 是否主动删除。也就是长期队列。当最初一个消费者断开连接后,会主动删除。* */
        return new Queue(RabbitMQConfig.RABBITMQ_DEMO_TOPIC, true, false, false);
    }
    /**
     * 申明一个 DirectExchange Bean, 用于下面的下面这个办法
     */
    @Bean
    public DirectExchange rabbitmqDemoDirectExchange() {
        //Direct 交换机
        return new DirectExchange(RabbitMQConfig.RABBITMQ_DEMO_DIRECT_EXCHANGE, true, false);
    }
    /**
     * 申明一个 Binding Bean, 用于把 Queen 和 Exchange 进行绑定
     * 并设置 RabbitMQConfig.RABBITMQ_DEMO_DIRECT_ROUTING 作为 Routing Key
     * 投递音讯的时候能够应用这个 key 通过这个 Exchange 发送到这个 Queen 上
     */
    @Bean
    public Binding bindDirect() {
        // 链式写法,绑定交换机和队列,并设置匹配键
        return BindingBuilder
                // 绑定队列
                .bind(rabbitmqDemoDirectQueue())
                // 到交换机
                .to(rabbitmqDemoDirectExchange())
                // 并设置匹配键
                .with(RabbitMQConfig.RABBITMQ_DEMO_DIRECT_ROUTING);
    }
}

Fanout exchange(扇形交换机)

无需依附 Routing Key,所有绑定到这种 Exchange 上的 Queen 都会收到投递,因而适宜播送音讯:

  • 大规模多用户在线(MMO)游戏能够应用它来解决排行榜更新等全局事件
  • 体育新闻网站能够用它来近乎实时地将比分更新分发给挪动客户端
  • 散发零碎应用它来播送各种状态和配置更新
  • 在群聊的时候,它被用来散发音讯给参加群聊的用户。(AMQP 没有内置 presence 的概念,因而 XMPP 可能会是个更好的抉择)

    // TODO 此处应该有配置 Bean 的代码和 Producer 的发送 demo

Topic Exchange(主题交换机)

Routing Key 反对单词匹配和全含糊匹配,缺德的中央在于 匹配两点之间的内容,而 # 匹配所有,如 routing..user 只能匹配 routing.biz.user、routing.user.user、routing.car.user,而 routing.#.user 能匹配 routing.car.Chevrolet.Corvette.ZR1.user。
因为这种 Exchange 反对通配符的 Routing Key,因而在定义 Queen 和 Routing Key 的时候,要思考对命名进行特色分组,如:

  • 懒得写了,反正就是以点为分隔符,对 Queen 和 Routing Key 做业务分组,投递的时候依照分组规定进行投递

Headers Exchange(头信息交换机)

Routing Key 是没用的,在初始化 Binding 时设置一些 map 进去,在投递音讯时带上 map 中的一些元素或全副元素,就能够实现 Exchange 到 Queen 的投递了。这种形式较上一个,灵活性无疑更高了,反对简单的 Binding,不过会不会太过简单把老手都搞晕了,所以我不太倡议用

// TODO 照例这里应该有代码,还是算了,想起来再写 

参考链接 1
参考链接 2

正文完
 0