无法通过pika在Heroku连接RabbitMQ,可能是AccessDeniedError
我刚在Heroku上设置了一个RabbitMQ的插件。在本地开发我的应用程序时,我可以顺利地排队和消费消息,但当我把它部署到Heroku后,就一直无法成功连接。我的用户名、密码、主机名、端口和虚拟主机都是从heroku config
中获取的。如果我更改用户名或密码,错误信息就会变成ProbableAuthenticationError
,这让我觉得至少认证是正确的,但可能是我的虚拟主机或其他配置有问题。我在StackOverflow上没有找到类似的问题,经过一个小时的谷歌搜索也没有找到能解决我问题的内容。
我尝试了RABBITMQ_BIGWIG_RX_URL
和RABBITMQ_BIGWIG_TX_URL
这两个环境变量来发送和消费消息,但无论怎么组合都不行。下面是我尝试连接的代码。
url = 'small-laurel-24.bigwig.lshift.net'
port = 10019
vhost = '/notmyrealvhost'
credentials = pika.PlainCredentials('username', 'password')
parameters = pika.ConnectionParameters(url, port, vhost, credentials=credentials)
connection = pika.BlockingConnection(parameters)
我是不是漏掉了什么,或者有什么办法可以找出具体配置错了什么?我现在很困惑。非常感谢!
我使用的是pika 0.9.14,python 2.7.3。
2 个回答
问题很可能是因为你在虚拟主机的设置中加了一个斜杠。很多用户会把这个斜杠和根目录搞混,其实它只是默认的虚拟主机名称。
除非你真的把虚拟主机的名字设成了斜杠,否则它的名字总是和你在管理控制台看到的一样,比如:
- my_virtualhost,而不是 /my_virtualhost
这就是为什么你的解决方案有效,因为在使用 URLParameters 时你没有加那个多余的斜杠。
你原来的代码在使用 URLParameters 时应该是这样的:
amqp://username:password@small-laurel-24.bigwig.lshift.net:10018/%2Fnotmyrealvhost
而你在上面提到的有效版本则没有斜杠(%2F
)这个字符。
amqp://username:password@small-laurel-24.bigwig.lshift.net:10018/notmyrealvhost
我最后通过使用pika中的URLParameters
类来解决了我的问题,这个类可以解析Heroku环境变量中的URL。
它可以处理像这样的字符串:amqp://username:password@small-laurel-24.bigwig.lshift.net:10018/notmyrealvhost
,并把里面的所有信息都解析出来。我之前自己搞得太复杂了,其实用这个类就可以了。