Понимание канала Spring RabbitMQ

RabbitMQ

Обзор


существуетAMQPВ договоре естьchannelконцепция, вRabbitMqсередина,channelПредставляет логическое соединение или виртуальное соединение, котороеTCPсвязаны. ОдинTCPМожно создать несколько подключенийchannel,существуетRabbit MQЗдесь сообщения отправляются и принимаются на основеchannelиз.

collection和channel的关系

имеютTCPПосле подключения также необходимоchannelПричины следующие:

  • создавать и уничтожатьTCPПодключение занимает много времени;
  • открыть слишком многоTCPСоединения потребляют ресурсы операционной системы, и если объем параллелизма в определенной степени велик, пропускная способность системы будет снижена;
  • использоватьcollectionмногоchannelспособ улучшить использование соединения.

Следовательно, несколькоchannelмультиплексированиеОдинTCPСпособ подключения более разумный.


канал не является потокобезопасным


channelНе потокобезопасный, потоки одновременно обращаются к одному и тому жеchannelПроблемы возникнут. Есть несколько способов справиться с этим:

  1. глобальный общественныйchannelИ используйте глобальную блокировку, пусть операцияchannelОчередь.Эта очевидная производительность неприемлема;
  2. Поток соответствует созданию новогоchannel, но иметь дело с максимальным значением, которое может поддерживать соединениеchannelколичество;
  3. Одна нить соответствует однойchannel, но изchannelПул берется, а не создается каждый раз новый.channelиспользуется, он будет возвращен в пул, что делаетchannelДоступно для другого потока.

Если сумма не большая, можно воспользоваться вторым способом. Если сумма большая, рекомендуется использовать третий способ, все-таки создать и уничтожитьchannelЭто также отнимает много времени и ресурсов.spring amqp, обеспечивает кешchannelплан. можно создать вCachingConnectionFactoryПри указании режима кэша.

connectionFactory.setCacheMode(CachingConnectionFactory.CacheMode.CHANNEL);
connectionFactory.setChannelCacheSize(25);

Приведенные выше две строки кода означаютchannelДелитесь только одним соединением и кэшируйте 25channel, Обратите внимание, что 25 здесь не означает, что в этом соединении может быть создано не более 25channel, но кэшировать до 25channel. В качестве примера предположим, что 100 сообщений отправляются одновременно, вCachingConnectionFactory.CacheMode.CHANNELВ режиме 100 будет создано мгновенноchannel, затем положить 25 в кешchannel, когда трафик падает, просто создайте лишнийchannelОн закроется автоматически, а в кеше останется только 25.

Если вы используете этот метод, обратите внимание на кешchannelЧисло не должно быть слишком маленьким, иначе большой объем трафика все равно будет вызывать частые отключения.channelСлучай. Конечно, мы не можем сказать, сколько одновременно, просто создайте столькоchannel, или чтобы ограничить его, на этот раз вы можете использовать:

connectionFactory.setChannelCheckoutTimeout(1000);

когдаChannelCheckoutTimeoutКогда значение больше 0,ChannelCacheSizeзначение является самым большимchannelномер, раз его нельзя получить из тайникаchannel,ждатьChannelCheckoutTimeoutЧерез миллисекунды, если он все еще недоступен, он выдастAmqpTimeoutException.

Мы также можем сделать это самиchannel pool, но как это делать не очень рекомендуется, ведьspring amqpОн все еще достаточно зрелый и может использоваться напрямую.


Производительность режима CacheMode.CHANNEL


Как упоминалось выше, использованиеCacheMode.CHANNELрежим, это один поток одинchannelформа, и этиchannelиспользовать одно и то же соединение, то есть использовать одно и то жеsocket. Когда количество параллелизма велико, это может привести к тому, что в один и тот же момент несколько потоков захотят перейти к этомуsocketзаписать данные. Чтобы избежать этой ситуации, можно добавлять только блокировки, чтобы потоки, которые не могут получить блокировки,blockреальный. написано иностранцамиUsing spring-rabbit under high throughputВ статье этот момент тоже упоминался, и был проведен стресс-тест, и 10 тредов отправили 1 000 000 сообщений одновременно, в результате тред был заблокирован.blockв прямом эфире, как показано ниже:

在这里插入图片描述
Автор также упомянул, что при большом трафике используйтеCacheMode.CONNECTIONрежим, который может повысить эффективность передачи. Что касается проблем с производительностью этих двух режимов, вы также можете посмотретьstackoverflowобсуждение,Spring CachingConnectionFactory limiting channels & causing Thread Blocking;


Мониторинг каналов


RabbitMQ Admin UIобеспечивает мониторингchannelинтерфейс, мы в основном фокусируемся на двух моментах:

  • Может ли канал течь, открыл канал, но не закрыл канал;
  • Скорость, с которой каналы открываются и закрываются.

Это может произойти, если скорость операций открытия канала постоянно выше, чем скорость операций закрытия канала.channelпросочился. Как показано ниже:

在这里插入图片描述

если включено и выключеноchannelСкорость очень высокая, это тоже стоит посмотреть. потому что может не быть кешаchannel. Когда трафик продолжает расти, пропускная способность может не увеличиваться, как показано на следующем рисунке:

在这里插入图片描述

--

оригинальная ссылка


Понимание канала Spring RabbitMQ