记一次erlang语言bug导致rabbitmq的队列没有消费者的问题

Posted crazymartin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记一次erlang语言bug导致rabbitmq的队列没有消费者的问题相关的知识,希望对你有一定的参考价值。

  公司开发和测试环境采用的erlang版本是19.0.3,rabbitmq版本为3.6.10。集群条件下稳定使用了近一年时间,没什么问题。

  为了保持和线下一致,线上生产环境采用了相同的版本,运行几个月后,出现问题。现象如下:

  在几天时间内,有三个队列出现没有消费者的问题。查看rabbitmq的日志。

operation queue.declare caused a channel exception not_found: failed to perform operation on queue ‘出现问题的队列‘ in vhost ‘/‘ due to timeout

  根据https://bugzilla.redhat.com/show_bug.cgi?id=1418668,这个bug在3.6.3已经修复,单我们还是有问题。

  此时,通过管理页面,无法删除队列,报错类似,是queue.delete超时。根据https://github.com/rabbitmq/rabbitmq-server/issues/1333的反馈

通过命令

rabbitmqctl eval ‘rabbit_amqqueue:internal_delete({resource,<<"所在vhost">>,queue,<<"出问题的队列">>}).‘

关闭应用,删除队列后,有可能回复。

最终,继续深入查看错误日志

     {gen_server2,call,[<0.26274.8>,{init,new},infinity]}},
    [{gen_server2,call,3,[{file,"src/gen_server2.erl"},{line,327}]},
     {rabbit_channel,handle_method,3,
         [{file,"src/rabbit_channel.erl"},{line,1335}]},
     {rabbit_channel,handle_cast,2,
         [{file,"src/rabbit_channel.erl"},{line,459}]},
     {gen_server2,handle_msg,2,[{file,"src/gen_server2.erl"},{line,1048}]},
     {proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,247}]}]}

=ERROR REPORT==== 2-May-2018::20:26:08 ===
Restarting crashed queue ‘问题队列‘ in vhost ‘/‘.

至此,怀疑是erlang语言有bug。

查看rabbitmq官网。

http://www.rabbitmq.com/which-erlang.html,此页面介绍了rabbitmq需要的erlang版本,并提示了修复的bug

技术分享图片

这两个解决的问题,很显然就是我们的问题。所以对erlang和rabbitmq进行了升级。

为了保证平滑升级,不停机,我们仅将erlang升级到19.3.6.8,rabbitmq升级到3.6.14。否则需要停集群

具体升级很简单,停rabbitmq-server服务,然后卸载erlang,此时会把rabbitmq也卸载。然后安装新的erlang和rabbitmq,启动服务后,自动就在集群里面了

 

以上是关于记一次erlang语言bug导致rabbitmq的队列没有消费者的问题的主要内容,如果未能解决你的问题,请参考以下文章

超简单的RabbitMQ安装步骤,连bug都整理好了,拿走不谢

超简单的RabbitMQ安装步骤,连bug都整理好了,拿走不谢

超简单的RabbitMQ安装步骤,连bug都整理好了,拿走不谢

记一次因 Redis 使用不当导致应用卡死 bug 的排查及解决!

记一次因 Redis 使用不当导致应用卡死 bug 的排查及解决!

记一次诡异的bug