Python 发布AMQP消息时的延迟结果

Python 发布AMQP消息时的延迟结果,python,rabbitmq,amqp,pika,Python,Rabbitmq,Amqp,Pika,我正在尝试开发一个协议转换器:这意味着有一个sender.py(讲MQTT ZMQ或其他协议)、translator.py(讲发送方和接收方的协议)和receiver.py(讲AMQP)。发送方以协议形式发送消息,该协议可以是MQTT、ZMQ。。。转换器获取这些消息,读取有效负载并将其发布到RabbitMQ代理。然后receiver.py通过订阅以前使用绑定键(比如:“#/data”)绑定到exchange的队列来获取消息 现在的问题是,每次收到MQTT消息时,我都会发布AQMP。然而,AMQP

我正在尝试开发一个协议转换器:这意味着有一个sender.py(讲MQTT ZMQ或其他协议)、translator.py(讲发送方和接收方的协议)和receiver.py(讲AMQP)。发送方以协议形式发送消息,该协议可以是MQTT、ZMQ。。。转换器获取这些消息,读取有效负载并将其发布到RabbitMQ代理。然后receiver.py通过订阅以前使用绑定键(比如:“#/data”)绑定到exchange的队列来获取消息

现在的问题是,每次收到MQTT消息时,我都会发布AQMP。然而,AMQP接收器并没有发布所有消息。只有当发布第四条左右的消息时,才会收到第一条消息。然后,如果我发布另一个4,我可以看到在AMQP订阅服务器中第一次收到发布的第二条消息

翻译员的代码是:

#!/usr/bin/env python

import pika
import json
import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
    #When connected to MQTT broker
    print("Connected with result code "+str(rc))
    #Subscribe to all topics in MQTT
    client.subscribe("#")

def on_message(client, userdata, msg):
   #When mqtt message is received
    message=json.loads(msg.payload)
    allData=message['data']

    for eachData in allData:
        message['data']=eachData
        routKey='eachData['topic']/data'
        publish_amqp(routKey,message)

def publish_amqp(rk,msg):
    channel.basic_publish(exchange='translator', routing_key=rk, body=json.dumps(msg))
    print(rk+' - - '+json.dumps(msg))


client = mqtt.Client('MQTT_to_AMQP_Translator')
client.on_connect = on_connect
client.on_message = on_message
client.connect('localhost', 1883, 60)


connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channel = connection.channel()
channel.exchange_declare(exchange='translator',type='topic')

client.loop_forever()
但是,如果我使用第二个代码来发布,而不是第一个代码块的方法中唯一的一个语句(basic_publish),我会得到正常的结果。代码是:

def publish_amqp(rk, msg):
    connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
    channel = connection.channel()
    channel.exchange_declare(exchange='translator',type='topic')
    channel.basic_publish(exchange='translator', routing_key=rk, body=json.dumps(msg))
    print(rk+' - - '+json.dumps(msg))
    connection.close()
最后一种方法一切正常。我真的不喜欢这种方法,因为这最后一段代码意味着必须建立连接、声明一些值、发布和断开连接,并使用第一段代码“只发布”而无需重新连接等等


为什么第一个代码会延迟发送给接收者的消息?我已经处理这个问题几天了,只有第二段代码(我连接、发布和断开每条消息的连接)可以正常工作。

我建议您尝试pika authors新库。皮卡是有童车的,根本不安全。您还可以尝试使用我的线程安全amqp库。您可以尝试的另一件事是启用confirm_delivery,以确保消息正确传递。