在Python中创建生产者和消费者应用程序

问题描述 投票:0回答:3

我正在尝试使用 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 的消费者主机上创建了一个新用户。

请看看是否有人可以帮助我......

python rabbitmq pika
3个回答
0
投票

当我看到你的问题时,我有几个问题:

  • 您是否 100% 确定您的 RabbitMQ 管理监控 你看到 2 个连接了吗?一份来自您的本地主机,另一份来自

    another host
    ?这将有助于调试

  • 其次,您是否检查了托管 RabbitMQ 的服务器上的持续端口 5672 是否已打开?因为也许您的生产者无法连接您的云提供商是什么?

如果您不想管理此类问题,您应该使用类似 https://zenaton.com 的服务。他们为您托管一切,并且您可以集成监控、错误处理等。


0
投票

您似乎没有将

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 默认情况下会绑定到所有接口(以及所有地址),但我不确定。


0
投票

您的消费者和生产者应用程序必须连接到相同 RabbitMQ 服务器。如果您有两个正在运行的 RabbitMQ 实例,它们是独立的。除非您配置 Shovel 或 Federation,否则消息不会从 RabbitMQ 的一个实例移动到另一个实例。

© www.soinside.com 2019 - 2024. All rights reserved.