我正在尝试使用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的使用者主机上创建了一个新用户。
请看看是否有人可以在这里帮助我...
答案 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将绑定到所有接口(因此也绑定到所有地址),但我不确定。