我正在尝试使用 Python 中的 RabbitMQ 创建一个简单的文件下载和上传服务。我制作了服务器和客户端脚本,并定义了一些对象,这些对象可以为请求在 json 中进行序列化和反序列化,因此我可以将文件 uid 或其他参数与二进制数据(使用 base64 编码)一起发送。发送小文件时一切正常,但是当我开始发送更大的文件(用 1.4mb 文本文件测试)时,我开始收到 JSONDecode 错误。我正在将发送和接收的消息转储到文件中,看起来发送的消息是格式正确的 json。但是,收到的消息似乎是乱七八糟的,例如:发送:{"uid":"test",Rhc2Rhc2Rhc2Rhc2Rhc2Rhc2=="}收到:Rhc2Rhc2{"uid":"test",Rhc2Rhc2Rhc2Rhc2=="}显然,混乱的块比这大得多。有没有人遇到过这个问题?下面是一些代码段,我可以上传完整的代码,但不是很整洁:上传请求:class FileSystemUploadRequest:def __init__(self, uid, data): self.uid = uid self.data = datadef encode(self): dicc = {"uid": self.uid, "data": base64.b64encode(self.data).decode()} return json.dumps(dicc)@staticmethoddef decode(jsonstr): dicc = json.loads(jsonstr) uid = dicc["uid"] data = base64.b64decode(dicc["data"]) return FileSystemUploadRequest(uid, data)客户(发件人):def put_file_blocking(self, uid, data): print(" [x] Llamaron a put_file_blocking") corr_id = str(uuid.uuid4()) request = FileSystemUploadRequest(uid, data) f = open("dump", "w") f.write(request.encode()) f.close() # Send upload request self.channel.basic_publish(exchange='', routing_key=self.queue_upload, properties=pika.BasicProperties( reply_to=self.callback_queue_name, correlation_id=corr_id ), body=request.encode())服务器(接收器):def upload_request(ch, method, props, body):f = open("_dump", "w")f.write(body.decode())f.close()# Get Upload Requestrequest = FileSystemUploadRequest.decode(body)print(" [x] Received upload request for: " + request.uid)filename = fs_dir + "/" + request.uid
1 回答
LEATH
TA贡献1936条经验 获得超6个赞
RabbitMQ 是一个消息代理,而不是一个文件存储系统。由于假设消息在大小上有所限制,因此进行了一些优化,这些优化将适用于您的用例。
要在分布式系统中共享文件,您应该依赖诸如OpenStack Swift或AWS S3之类的对象存储。
您仍然可以使用 RabbitMQ 来通知新文件的存在,但不是将其嵌入到消息中,而是提供对象存储中的位置,消费者从那里检索文件。
添加回答
举报
0/150
提交
取消