【问题标题】:Spring RabbitMQ - caching multiple channels per connection?Spring RabbitMQ - 每个连接缓存多个通道?
【发布时间】:2020-11-19 14:42:26
【问题描述】:

使用 Spring AMQP 的默认缓存策略是创建具有多个通道的单个连接。创建通道的数量取决于监听器的并发性。

这给我们带来了一个问题,因为我们有很多听众,而并发只有少数消费者。 Rabbit documentation 建议每个连接使用一位数的通道数。

如果我们有几个监听器,比如说 10 个,每个监听器需要 5 个并发。这会创建一个包含 50 个通道的单个连接,这远远超过推荐的值。

我尝试过使用spring.rabbitmq.cache 属性,但我不知道如何设置它,因此每个听众都使用自己的 5 个通道连接。我宁愿用 5 个通道创建 10 个连接,而不是用 50 个通道创建 1 个连接。

有人能指出正确的方向吗?

【问题讨论】:

    标签: java rabbitmq amqp spring-amqp


    【解决方案1】:

    最简单的解决方案是为每个容器提供自己的连接工厂。

    您可以将ContainerCustomizer 添加到容器工厂,并使用它来更改每个容器的连接工厂。它会在容器创建之后、容器启动之前被调用。

    编辑

    @SpringBootApplication
    public class So64913992Application {
    
        public static void main(String[] args) {
            SpringApplication.run(So64913992Application.class, args);
        }
    
        @RabbitListener(queues = "foo", concurrency = "5")
        public void listen1(String in) {
            System.out.println(in);
        }
    
        @RabbitListener(queues = "bar", concurrency = "5")
        public void listen2(String in) {
            System.out.println(in);
        }
    
    }
    
    @Component
    class Customizer {
    
        Customizer(GenericApplicationContext context, CachingConnectionFactory cf,
                SimpleRabbitListenerContainerFactory factory) {
    
            factory.setContainerCustomizer(container -> {
                CachingConnectionFactory newCf = new CachingConnectionFactory(cf.getRabbitConnectionFactory());
                String name = "cf." + container.getQueueNames()[0];
                newCf.setConnectionNameStrategy(c -> name);
                // set any other CCF properties you need
                context.registerBean(name, CachingConnectionFactory.class, () -> newCf);
                context.getBean(name); // initialize
                container.setConnectionFactory(newCf);
            });
        }
    
    }
    

    【讨论】:

    • 有没有一种简单的方法来创建 CachingConnectionFactory 的新实例,就像在 Spring Boots RabbitAutoConfiguration 中创建的一样?
    猜你喜欢
    • 1970-01-01
    • 2017-04-16
    • 2020-05-21
    • 2013-12-16
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多