CacheMode
cache size
cacheSize指的是可以缓存的连接数(CacheMode.CONNECTION)或者channel数(CacheMode.CHANNEL)。注意,这个属性不限制连接的使用量,只决定连接关闭时是否缓存。1.6版本默认值从1变为25.可以通过RabbitMQ Admin UI来监视连接或者CHANNEL的创建频率,依此来选择一个合适的缓存量。
CacheMode.CONNECTION
- 模式解释
当缓存模式设置为CacheMode.CONNECTION时,连接会被缓存起来,createConnection()的调用可能会创建一个新的连接,也可能从缓存中获取;关闭连接时,如果缓存的连接数没有达到cache size,就会将连接缓存起来。在这个模式下,由连接创建的channel也会被缓存起来。
-
使用场景
在高可用集群下,由于连接连着不同的broker,缓存连接会变得非常有用。
-
相关参数
connectionLimit,channelCheckoutTimeLimit
当设置为CacheMode.CONNECTION,spring amqp提供了一个属性connectionLimit,这个属性要配合channelCheckoutTimeLimit
使用。注意,connectionLimit不代表连接的限制数,当连接数达到connectionLimit时,spring amqp会监视存活时间超过channelCheckoutTimeLimit的连接,当连接超过这个时间时,会抛出
AmqpTimeoutException。
因此,connectionLimit在一定意义上指的是空闲连接数。
-
失效参数
在CacheMode.CONNECTION模式下,不支持amqp中各个角色的automatic declaration。
-
相关属性
Property | Meaning |
---|---|
connectionName:<localPort> |
|
openConnections | 连接brokers的连接数 |
channelCacheSize | 当前配置的最大channel缓存数 |
connectionCacheSize | 当前配置的最大连接缓数 |
idleConnections | 当前的连接缓存数 |
idleConnectionsHighWater | 连接缓存数的峰值 |
idleChannelsTx:<localPort> | 这个链接当前支持事务的channel缓存数 |
idleChannelsNotTx:<localPort> | 这个链接当前不支持事务的channel缓存数 |
idleChannelsTxHighWater:<localPort> | 这个链接当前支持事务的channel缓存数的峰值 |
idleChannelsNotTxHighWater:<localPort> | 这个链接不当前支持事务的channel缓存数的峰值 |
- 延申
默认情况下,amqp-client会创建一个固定大小的连接池(默认size:Runtime.getRuntime().availableProcessors() * 2)。如果需要使用大量的连接,可以在CachingConnectionFactory中设置一个executor
。
CacheMode.CHANNEL
- 模式解释
CacheMode.CHANNEL模式下,所有的客户端共享一个链接,不同的channel之间相互隔离。
- 相关参数
当channelCheckoutTimeout大于0时,channelCacheSize代表一个连接可以创建的最大channel数,当达到channelCacheSize时,新的chanel申请会被阻塞,如果阻塞超时会抛出AmqpTimeoutException。
- 相关属性
Property | Meaning |
---|---|
connectionName |
|
channelCacheSize | 当前配置的最大空闲/缓存channel数 |
localPort | 所属连接的本地端口,可以用来在RabbitMQ Admin UI中关联连接。 |
idleChannelsTx | 当前缓存的支持事务的channel的数量。 |
idleChannelsNotTx | 当前缓存的不支持事务的channel的数量。 |
idleChannelsTxHighWater | 缓存的支持事务的channel数量的峰值。 |
idleChannelsNotTxHighWater | 缓存的不支持事务的channel数量的峰值。 |
- 注意
当在框架中使用RabbitTemplate时,Channels可以得到有效的管理。如果通过createChannel直接创建channel,需要通过手动关闭channel(调用closing)。
官方配置的几个例子
<bean id="connectionFactory"
class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory">
<constructor-arg value="somehost"/>
<property name="username" value="guest"/>
<property name="password" value="guest"/>
</bean>
<!-- CacheMode.CONNECTION -->
<rabbit:connection-factory
id="connectionFactory" cache-mode="CONNECTION" connection-cache-size="25"/>
<!-- provide host and port attributes by using the namespace-->
<rabbit:connection-factory
id="connectionFactory" host="somehost" port="5672"/>
<!-- clustered environment -->
<rabbit:connection-factory
id="connectionFactory" addresses="host1:5672,host2:5672" shuffle-addresses="true"/>
<!-- 自定义线程工厂-->
<rabbit:connection-factory id="multiHost" virtual-host="/bar" addresses="host1:1234,host2,host3:4567"
thread-factory="tf"
channel-cache-size="10" username="user" password="password" />
<bean id="tf" class="org.springframework.scheduling.concurrent.CustomizableThreadFactory">
<constructor-arg value="rabbitmq-" />
</bean>