我正在尝试使用 pika forrabbitmq 在 python 中编写生产者和消费者代码。然而,对于我的具体情况,我需要在不同的主机上运行生产者,在其他主机上运行消费者。
我已经编写了生产者代码:
import pika
credentials = pika.PlainCredentials('username', 'password')
parameters = pika.ConnectionParameters('ip add of another host', 5672, '/', credentials)
connection = pika.BlockingConnection()
channel = connection.channel()
channel.queue_declare(queue='test')
channel.basic_publish(exchange='', routing_key='test', body='hello all!')
print (" [x] sent 'Hello all!")
connection.close()
上面的生产者代码运行没有任何错误。我还创建了一个新用户,并在rabbitmq-server 上为其提供了管理员凭据。然而,当我在另一台运行rabbitmq-server的主机上运行消费者代码时,我没有看到任何输出:
import pika
credentials = pika.PlainCredentials('username', 'password')
parameters = pika.ConnectionParameters('localhost', 5672, '/', credentials)
connection = pika.BlockingConnection()
channel = connection.channel()
channel.queue_declare(queue='test')
def callback(ch, method, properties, body):
print(" [x] Recieved %r" % body)
channel.basic_consume(
queue='test', on_message_callback=callback, auto_ack=True)
print (' [x] waiting for messages. To exit press ctrl+c')
channel.start_consume()
所以,我在同一网络上有两台安装了rabbitmq的主机。然而,一个有 3.7.10,另一个有 3.7.16 版本的rabbitmq。
生产者能够毫无错误地发送文本,但另一台主机上的消费者没有收到任何文本。
当两者在同一台计算机上运行时,我没有遇到任何问题,因为我只是用本地主机替换连接设置。由于默认情况下仅允许用户 guest 在本地主机上连接,因此我在运行rabbitmq-server 的消费者主机上创建了一个新用户。
请看看是否有人可以帮助我......
当我看到你的问题时,我有几个问题:
您是否 100% 确定您的 RabbitMQ 管理监控 你看到 2 个连接了吗?一份来自您的本地主机,另一份来自
another host
?这将有助于调试其次,您是否检查了托管 RabbitMQ 的服务器上的持续端口 5672 是否已打开?因为也许您的生产者无法连接您的云提供商是什么?
如果您不想管理此类问题,您应该使用类似 https://zenaton.com 的服务。他们为您托管一切,并且您可以集成监控、错误处理等。
您似乎没有将
parameters
传递给 BlockingConnection
实例。
import pika
rmq_server = "ip_address_of_rmq_server"
credentials = pika.PlainCredentials('username', 'password')
parameters = pika.ConnectionParameters(rmq_server, 5672, '/', credentials)
connection = pika.BlockingConnection(parameters)
channel = connection.channel()
此外,您的消费者正在附加到
localhost
主机名。确保这确实解决了,并且您的 RabbitMQ 服务正在侦听本地主机地址 (127.0.0.1),它可能未绑定到该地址。我相信 RMQ 默认情况下会绑定到所有接口(以及所有地址),但我不确定。
您的消费者和生产者应用程序必须连接到相同 RabbitMQ 服务器。如果您有两个正在运行的 RabbitMQ 实例,它们是独立的。除非您配置 Shovel 或 Federation,否则消息不会从 RabbitMQ 的一个实例移动到另一个实例。