为了账号安全,请及时绑定邮箱和手机立即绑定

使用烧瓶服务器时,rabbitMQ 的 pika 崩溃

使用烧瓶服务器时,rabbitMQ 的 pika 崩溃

月关宝盒 2021-09-28 20:52:22
所以我们有一个单线程的 Flask 服务器运行,我们从 python 应用程序客户端接收请求。在这个flask 服务器中,我们使用rabbitMQ 和pika 库将消息分发给其他客户端。发生的事情是在 get 函数中程序因错误而崩溃:pika.exceptions.ConnectionClosed: (505, 'UNEXPECTED_FRAME - 60 类的预期内容标题,而是得到非内容标题框架')我在堆栈溢出和其他方面搜索了很多关于此的主题,但它们都解决了多线程问题,但事实并非如此。除非在 app.run(threaded=yes) 中被调用,否则 Flask 应该只为一个线程服务。当在很短的时间间隔内(例如每秒 5 条)发送多条消息时,程序通常会崩溃,同样重要的是要注意每秒都会收到一条消息并请求此函数:@app.route('/api/users/getMessages', methods=['POST'])  def get_Messages():      data = json.loads(request.data)    token = data['token']    payload = jwt.decode(token, 'SECRET', algorithms=['HS256'])    istid = payload['istid']    print('istid: '+istid)    messages = []    queue = channel.queue_declare(queue=istid)    for i in range(queue.method.message_count):        method_frame, header_frame, body = channel.basic_get(queue=istid, no_ack=True)        if method_frame:            #print(method_frame, header_frame, body)            messages.append(body)        else:            print('No message returned')    res = {'messages':messages, 'error':0}    return jsonify(res)在此代码中,它在以下行中正常崩溃:queue = channel.queue_declare(queue=istid)但是我们也尝试更改代码以使用 while 而不是 a 来表示当 body 为 None 并且它在行method_frame, header_frame, body = channel.basic_get(queue=istid, no_ack=True) 中崩溃时的结束位置:在这种情况下。同样重要的是,崩溃是随机的,它可以工作几次,然后在发送消息时在 get 请求之后随机崩溃。如果有人知道与此相关的任何事情,我们将不胜感激。另一个注意事项,我们考虑过使用带有回调的 basic_consume 而不是 basic_get ,但我们没有找到一种可行的方法,因为我们必须将消息发回并且有多个用户向同一函数发出请求。编辑 #1: 在 rabbitMQ 文档rabbitmq 中,如果您搜索函数“def basic_get”,您会注意到有一些 TODO 注释以及对此的引用由于实现细节,在执行回调之前不能再次调用它。所以我怀疑这可能是正在发生的事情,但即使是这样,我也不知道如何解决。
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 237 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号