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

时间:2019-07-16 13:00:27

标签: python rabbitmq pika

我正在尝试使用pika为Rabbitmq在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。

生产者能够正确发送文本,但是另一台主机上的消费者没有收到任何文本。

当它们都在同一台机器上运行时,我没有任何问题,因为我只是将连接设置替换为本地主机。由于默认情况下仅允许用户来宾在本地主机上进行连接,因此我在运行Rabbitmq-server的使用者主机上创建了一个新用户。

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

3 个答案:

答案 0 :(得分:0)

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

  • 您是否100%确定在您的RabbitMQ management monitoring上 您看到2位联络人吗?一个来自您的本地主机,另一个来自another host?这将有助于调试

  • 第二,您是否检查了承载RabbitMQ的服务器上正在进行的端口5672是否已打开?因为也许您的生产者无法设法连接什么是您的云提供商?

如果您不想管理此类问题,则应使用https://zenaton.com之类的服务。它们为您托管一切,并且您具有集成的监视,错误处理等。

答案 1 :(得分:0)

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


注意: RabbitMQ团队监视rabbitmq-users mailing list,并且有时仅在StackOverflow上回答问题。

答案 2 :(得分: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将绑定到所有接口(因此也绑定到所有地址),但我不确定。