【发布时间】:2015-05-09 14:28:22
【问题描述】:
我们正在使用 rabbitmq 作为消息中间件运行许多服务。 当服务运行时,我们看到服务停止监听请求,要求我们重新启动服务以使其再次工作。 我们在同一个 JVM(Oracle Weblogic 应用服务器)上运行多个服务,但并非所有服务都停止,通常只有一个,但并不总是同一个。
这似乎与负载无关,因为服务具有非常不同的负载配置文件。
我们设置了心跳协议,但没有解决问题。由于我们的测试环境也出现该问题,因此我们将日志级别设置为调试,希望这可以揭示原因并提示解决方案。
遗憾的是,它没有或者我们对正在发生的事情缺乏了解(对 spring-amqp 和 amqp 库不太熟悉,但我们阅读了 spring 文档)。
我们在日志中看到以下异常,然后在我们重新启动服务之前什么都没有发生:
;2015-05-08 00:35:54,578; DEBUG; servicename=; clusterid=; username=; msguuid=; org.springframework.amqp.rabbit.core.RabbitAdmin - Declarations finished
;2015-05-08 00:37:12,015; ERROR; servicename=; clusterid=; username=; msguuid=; nl.pharmapartners.amqp.connectors.AmqpMessageListenerContainer - Consumer received fatal exception on startup
;org.springframework.amqp.rabbit.listener.FatalListenerStartupException: Authentication failure
at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.start(BlockingQueueConsumer.java:367)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:963)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.springframework.amqp.AmqpAuthenticationException: com.rabbitmq.client.PossibleAuthenticationFailureException: Possibly caused by authentication failure
at org.springframework.amqp.rabbit.support.RabbitExceptionTranslator.convertRabbitAccessException(RabbitExceptionTranslator.java:57)
at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:195)
at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.createConnection(CachingConnectionFactory.java:359)
at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.createBareChannel(CachingConnectionFactory.java:309)
at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.getCachedChannelProxy(CachingConnectionFactory.java:283)
at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.getChannel(CachingConnectionFactory.java:276)
at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.access$600(CachingConnectionFactory.java:69)
at org.springframework.amqp.rabbit.connection.CachingConnectionFactory$ChannelCachingConnectionProxy.createChannel(CachingConnectionFactory.java:614)
at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils$1.createChannel(ConnectionFactoryUtils.java:85)
at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils.doGetTransactionalResourceHolder(ConnectionFactoryUtils.java:134)
at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils.getTransactionalResourceHolder(ConnectionFactoryUtils.java:67)
at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.start(BlockingQueueConsumer.java:363)
... 2 more
Caused by: com.rabbitmq.client.PossibleAuthenticationFailureException: Possibly caused by authentication failure
at com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:373)
at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:516)
at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:545)
at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:191)
... 12 more
Caused by: com.rabbitmq.client.AlreadyClosedException: clean connection shutdown; reason: Attempt to use closed channel
at com.rabbitmq.client.impl.AMQChannel.ensureIsOpen(AMQChannel.java:190)
at com.rabbitmq.client.impl.AMQChannel.rpc(AMQChannel.java:223)
at com.rabbitmq.client.impl.AMQChannel.privateRpc(AMQChannel.java:209)
at com.rabbitmq.client.impl.AMQChannel.rpc(AMQChannel.java:202)
at com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:355)
... 15 more
2015-05-08 00:37:12,032; ERROR; servicename=; clusterid=; username=; msguuid=; nl.pharmapartners.amqp.connectors.AmqpMessageListenerContainer - Stopping container from aborted consumer
我们不知道发生了什么,在此之前我们看到每分钟都在重新声明交换、队列和绑定。此日志在重新声明完成后大约 1.5 分钟出现。 没有日志表明rabbitmq有问题,所以我们不知道报告的尝试使用已经关闭的连接。这全部来自 amqp-client 或 spring-amqp 库。
在rabbit集群上找不到相关的错误日志,只查看了/var/log/rabbitmq目录。
日志似乎表明存在身份验证问题,但使用相同身份验证参数在同一节点上运行的其他服务没有问题(并且服务本身已经运行了很长一段时间(长达数天)也没有任何问题。原来的异常表示库获得了一个新的通道,但是在使用之前已经关闭了。
有人可以解释发生了什么以及如何解决这个问题吗?
我们正在运行带有 Spring amqp 1.3.2 版、amqp-client 3.2.4 的 RabbitMQ 3.3.3/Erlang 17。
附加信息: 我们正在使用默认值配置各种组件,但以下情况除外:
#The waiting time (ms) for a response in amqp (for rpc calls)
amqp.timeout=30000
prefetch.count=1
max.concurrent.consumers=5
start.consumer.min.interval=500
stop.consumer.min.interval=5000
consecutive.active.trigger=3
consecutive.idle.trigger=3
amqp.message.ttl=900000
amqp.heartbeat=5
RabbitMQ 有一个策略可以删除超过 120 秒没有消费者的队列。所有队列都镜像到rabbit集群中的所有节点(3个节点)。
我们发现我们使用了一个 CachingConnectionFactory,其默认缓存大小为 1(我们将对此进行更改,因为这似乎不适合 5 个并发消费者,我们认为这应该至少等于最大消费者) .
提前致谢,
维姆·维德休斯。
【问题讨论】:
标签: rabbitmq amqp spring-amqp