Обзор
существуетAMQP
В договоре естьchannel
концепция, вRabbitMq
середина,channel
Представляет логическое соединение или виртуальное соединение, котороеTCP
связаны. ОдинTCP
Можно создать несколько подключенийchannel
,существуетRabbit MQ
Здесь сообщения отправляются и принимаются на основеchannel
из.
имеютTCP
После подключения также необходимоchannel
Причины следующие:
- создавать и уничтожать
TCP
Подключение занимает много времени; - открыть слишком много
TCP
Соединения потребляют ресурсы операционной системы, и если объем параллелизма в определенной степени велик, пропускная способность системы будет снижена; - использовать
collection
многоchannel
способ улучшить использование соединения.
Следовательно, несколькоchannel
мультиплексированиеОдинTCP
Способ подключения более разумный.
канал не является потокобезопасным
channel
Не потокобезопасный, потоки одновременно обращаются к одному и тому жеchannel
Проблемы возникнут. Есть несколько способов справиться с этим:
- глобальный общественный
channel
И используйте глобальную блокировку, пусть операцияchannel
Очередь.Эта очевидная производительность неприемлема; - Поток соответствует созданию нового
channel
, но иметь дело с максимальным значением, которое может поддерживать соединениеchannel
количество; - Одна нить соответствует одной
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
. Когда трафик продолжает расти, пропускная способность может не увеличиваться, как показано на следующем рисунке:
--