2016-12-20 4 views
1

ユーザーがファイルをアップロードするWebアプリケーションで作業していますが、サーバー上のファイルの計算に時間がかかります。計算が完了すると、計算された結果が元のファイルとともに表示されます。セレンから大規模なjson応答がフラスコに届かない

これは小さいファイルでは機能しますが、大きなファイルでは失敗します。基本的に、jsonレスポンスが小さければ(サイズ3と11726のオブジェクトの配列がチェックされています)、ブラウザには出力されますが、応答が大きければ(サイズ507072)、出力されません。失敗したケースでアップロードされたファイルのサイズは約3 MBであり、jsonレスポンスにはアップロードされたファイルのすべてのデータが含まれているため、同じ順序であることを前提としています。セロリ側

Iが大きいJSONレスポンスに、

[2016-12-20 18:11:11,734: INFO/MainProcess] emitting event "response"  to all [/test] 
[2016-12-20 18:11:13,151: INFO/MainProcess] Task flask_application.restapi.background_thread[0457e7cb-f10b-408e-8f80-2bd95ce2c7b4] succeeded in 10.542778854s: None 

同様小さいJSON応答(11726アレイのサイズ)の場合にはこれを見ています:

[2016-12-20 18:17:08,788: INFO/MainProcess] emitting event "response" to all [/test] 
[2016-12-20 18:18:42,813: INFO/MainProcess] Task flask_application.restapi.background_thread[309e0ed6-94ec-4332-a2ed-b6d9211bc263] succeeded in 366.478926406s: None 

フラスコ側

012小さなJSONレスポンスについては

、私は最終的に(これは、それが切り捨てられたとして、フル出力ではありません)また、ブラウザ上に表示されている完全な放出された出力を、参照してください。

35,"Formula":"CHNO"},{"NA Corrected with zero":345,"Name":"XYZ","Label":"A","Sample":"M_6_6","Truth Value":false,"NA Corrected":323,"Formula":"CHNO"},{"NA Corrected with zero":422,"Name":"XYZ","Label":"A","Sample":"M_6_5","Truth Value":false,"NA Corrected":233,"Formula":"CHNO"},{"NA Corrected with zero":494,"Name":"XYZ","Label":"A","Sample":"M_6_4","Truth Value":false,"NA Corrected":4946,"Formula":"CHNO"},{"NA Corrected with zero":458,"Name":"L-Proline","Label":"A","Sample":"M_6_3","Truth Value":false,"NA Corrected":4586,"Formula":"CHNO"},{"NA Corrected with zero":493,"Name":"XYZ","Label":"A","Sample":"M_6_2","Truth Value":false,"NA Corrected":4935,"Formula":"CHNO"},{"NA Corrected with zero":4565,"Name":"XYZ","Label":"A","Sample":"M_6_1","Truth Value":false,"NA Corrected":45656,"Formula":"CHNO"}]}] [in /Users/raaisa/.virtualenvs/nacorr/lib/python2.7/site-packages/engineio/socket.py:69] 
20161220-18:11PM INFO: 441d88fffb814e1696aa25eb99e97336: Received packet PING data None [in /Users/raaisa/.virtualenvs/nacorr/lib/python2.7/site-packages/engineio/socket.py:44] 

しかし、大規模な応答のために、そこにあります何もない。私はフラスコ、フラスコ-socketio、セロリ、Redisのを使用しています

20161220-18:16PM INFO: 441d88fffb814e1696aa25eb99e97336: Sending packet PONG data None [in /Users/raaisa/.virtualenvs/nacorr/lib/python2.7/site-packages/engineio/socket.py:69] 
20161220-18:16PM INFO: 441d88fffb814e1696aa25eb99e97336: Received packet PING data None [in /Users/raaisa/.virtualenvs/nacorr/lib/python2.7/site-packages/engineio/socket.py:44] 
20161220-18:16PM INFO: 441d88fffb814e1696aa25eb99e97336: Sending packet PONG data None [in /Users/raaisa/.virtualenvs/nacorr/lib/python2.7/site-packages/engineio/socket.py:69] 
20161220-18:17PM INFO: 441d88fffb814e1696aa25eb99e97336: Received packet PING data None [in /Users/raaisa/.virtualenvs/nacorr/lib/python2.7/site-packages/engineio/socket.py:44] 
20161220-18:17PM INFO: 441d88fffb814e1696aa25eb99e97336: Sending packet PONG data None [in /Users/raaisa/.virtualenvs/nacorr/lib/python2.7/site-packages/engineio/socket.py:69] 
20161220-18:17PM INFO: 441d88fffb814e1696aa25eb99e97336: Received packet PING data None [in /Users/raaisa/.virtualenvs/nacorr/lib/python2.7/site-packages/engineio/socket.py:44] 
20161220-18:17PM INFO: 441d88fffb814e1696aa25eb99e97336: Sending packet PONG data None [in /Users/raaisa/.virtualenvs/nacorr/lib/python2.7/site-packages/engineio/socket.py:69] 
20161220-18:18PM INFO: 441d88fffb814e1696aa25eb99e97336: Received packet PING data None [in /Users/raaisa/.virtualenvs/nacorr/lib/python2.7/site-packages/engineio/socket.py:44] 
20161220-18:18PM INFO: 441d88fffb814e1696aa25eb99e97336: Sending packet PONG data None [in /Users/raaisa/.virtualenvs/nacorr/lib/python2.7/site-packages/engineio/socket.py:69] 
20161220-18:18PM INFO: 441d88fffb814e1696aa25eb99e97336: Received packet PING data None [in /Users/raaisa/.virtualenvs/nacorr/lib/python2.7/site-packages/engineio/socket.py:44] 
20161220-18:18PM INFO: 441d88fffb814e1696aa25eb99e97336: Sending packet PONG data None [in /Users/raaisa/.virtualenvs/nacorr/lib/python2.7/site-packages/engineio/socket.py:69] 
20161220-18:19PM INFO: 441d88fffb814e1696aa25eb99e97336: Received packet PING data None [in /Users/raaisa/.virtualenvs/nacorr/lib/python2.7/site-packages/engineio/socket.py:44] 
20161220-18:19PM INFO: 441d88fffb814e1696aa25eb99e97336: Sending packet PONG data None [in /Users/raaisa/.virtualenvs/nacorr/lib/python2.7/site-packages/engineio/socket.py:69] 
20161220-18:19PM INFO: 441d88fffb814e1696aa25eb99e97336: Received packet PING data None [in /Users/raaisa/.virtualenvs/nacorr/lib/python2.7/site-packages/engineio/socket.py:44] 
20161220-18:19PM INFO: 441d88fffb814e1696aa25eb99e97336: Sending packet PONG data None [in /Users/raaisa/.virtualenvs/nacorr/lib/python2.7/site-packages/engineio/socket.py:69] 

:フラスコはセロリから何かを受信して​​いないようです。私はthis blogに続いてWebソケットと長いバックグラウンドタスクを実装しました。ここに関連コードがあります。

#socketio_redis 
'SOCKETIO_REDIS_URL' = 'redis://localhost:6379/0' 

@socketio.on('nacorr', namespace='/test') 
def test_connect(data): 
    background_thread.delay(app.config['SOCKETIO_REDIS_URL'],data) 

@celery.task 
def background_thread(url, data): 
    local_socketio = SocketIO(message_queue=url) 
    local_socketio.emit('response', {'data': 'background task starting ...'}, namespace='/test') 
    # do something with data 
    responsejson = some_func_resulting_in_json_obj() 
    local_socketio.emit('response', responsejson, namespace='/test') 

助けてください。すべてのタスクのキー値のRedis

更新

は同じ(のみ異なるタスクID)です:

127.0.0.1:6379> GET "celery-task-meta-691c61e6-ef2a-413c-9226-fac0be352928" 
"{\"status\": \"SUCCESS\", \"traceback\": null, \"result\": null, \"task_id\": \"691c61e6-ef2a-413c-9226-fac0be352928\", \"children\": []}" 
127.0.0.1:6379> GET "celery-task-meta-f01e0818-dc80-42e2-8ab0-2e4240f0e972" 
"{\"status\": \"SUCCESS\", \"traceback\": null, \"result\": null, \"task_id\": \"f01e0818-dc80-42e2-8ab0-2e4240f0e972\", \"children\": []}" 
127.0.0.1:6379> GET "celery-task-meta-5adc0627-3288-4d21-8bf7-6ee5964e1683" 
"{\"status\": \"SUCCESS\", \"traceback\": null, \"result\": null, \"task_id\": \"5adc0627-3288-4d21-8bf7-6ee5964e1683\", \"children\": []}" 

私はチャンクに私の応答を分割して発光することで、この問題を回避することができました小さなチャンクなので、おそらくどこかにバッファサイズの問題があります。

+0

redisログには何か興味深いものはありますか? – Miguel

+0

@Miguelあなたのコメントをありがとう!私はウェブソケットの新人です。あなたのブログポストと非常に多くの質問への回答のために、私はこの点まで到達することができました。 私はredisログで質問を更新しましたが、それは私にとってはうまくなりました。大きな応答を許さないバッファがありますか?私はこの大きな問題の小さなjsonチャンクを放出することでこの問題を回避することができたからです。 – Raaisa

+0

私には限界があると思われますが、単純な検索では役に立たないものはありません。また、redisでsocketioチャンネルに接続して、そこに起こっていることを監視することもできます。これらの大きなペイロードがキューにまったく表示されるかどうかは興味深いでしょう。 – Miguel

答えて

0

この問題は、redis pubsubクライアントバッファ制限とflask-socketio ping timeoutを構成することで解決しました。

モニターRedisのとミゲルにより示唆されるように

監視Redisのログをフラスコ。 redis-cliのコマンドPSUBSCRIBE *を使用して、メッセージ・キューとしてのレディ・アクティビティを監視します。それが適切にセロリのタスクを実行すると、すべてのEMITメッセージを送信している

ivery_tag\": \"433b78b8-7cb1-4665-96aa-a53fcc478c32\"}, \"content- encoding\": \"utf-8\"}" 
1) "pmessage" 
2) "*" 
3) "flask-socketio" 
4) "(dp0\nS'skip_sid'\np1\nNsS'room'\np2\nNsS'namespace'\np3\nS'/test'\np4\nsS'event'\np5\nS'response'\np6\nsS'callback'\np7\nNsS'data'\np8\n(dp9\ng8\nS'background task starting ...'\np10\nssS'method'\np11\nS'emit'\np12\ns." 

ected\np140697\nF45867838.165479094\nsVFormula\np140698\nVC5H9NO2\np140699\nsa(dp140700\nVNA Corrected with zero\np140701\nF49355484.84626437\nsVName\np140702\nVL-Proline\np140703\nsVLabel\np140704\nVC12 PARENT\np140705\nsVSample\np140706\nVSAMPLE_#SZ3G2FM_6_2\np140707\nsVTruth Value\np140708\nI00\nsVNA Corrected\np140709\nF49355484.84626437\nsVFormula\np140710\nVC5H9NO2\np140711\nsa(dp140712\nVNA Corrected with zero\np140713\nF45656465.639370896\nsVName\np140714\nVL-Proline\np140715\nsVLabel\np140716\nVC12 PARENT\np140717\nsVSample\np140718\nVSAMPLE_#SZ3G2FM_6_1\np140719\nsVTruth Value\np140720\nI00\nsVNA Corrected\np140721\nF45656465.639370896\nsVFormula\np140722\nVC5H9NO2\np140723\nsassS'method'\np140724\nS'emit'\np140725\ns." 
1) "pmessage" 
2) "*" 
3) "flask-socketio" 
4) "(dp0\nS'skip_sid'\np1\nNsS'room'\np2\nNsS'namespace'\np3\nS'/'\np4\nsS'event'\np5\nS'disconnect'\np6\nsS'callback'\np7\nNsS'data'\np8\n(dp9\ng8\nS'disconnect the socket'\np10\nssS'method'\np11\nS'emit'\np12\ns." 
1) "pmessage" 
2) "*" 
3) "celery-task-meta-6b4da3b9-b887-4032-a0ce-5d19a38f75d3" 

:ボタンは、長時間実行されるタスクを開始するためにクリックされたとき、小さなデータセットについて

が、これはRedisの上に来ました。タスクのIDは "celery-task-meta-6b4da3b9-b887-4032-a0ce-5d19a38f75d3"です。

同じタスクが大repsonseを生成し、大容量のファイルのために実行された場合、いくつかの時間後に停止し、プロセスが完了していないとのRedis-CLI:

3) "flask-socketio" 
4) "(dp0\nS'skip_sid'\np1\nNsS'room'\np2\nNsS'namespace'\np3\nS'/test'\np4\nsS'event'\np5\nS'response'\np6\nsS'callback'\np7\nNsS'data'\np8\n(dp9\ng8\nS'background task starting ...'\np10\nssS'method'\np11\nS'emit'\np12\ns." 
1) "pmessage" 
2) "*" 
3) "/0.celeryev/worker.heartbeat" 
4) "{\"body\": \"eyJzd19zeXMiOiAiRGFyd2luIiwgImNsb2NrIjogMTY1MCwgInRpbWVzdGFtcCI6IDE0ODI3ODE1OTQuODI5MzY0LCAiaG9zdG5hbWUiOiAiY2VsZXJ5QFJhYWlzYXMtTWFjQm9vay1Qcm8ubG9jYWwiLCAicGlkIjogNDI0MSwgInN3X3ZlciI6ICI0LjAuMiIsICJ1dGNvZmZzZXQiOiAtNiwgImxvYWRhdmciOiBbMi4zNywgMi45MSwgMi45N10sICJwcm9jZXNzZWQiOiA4LCAiYWN0aXZlIjogMSwgImZyZXEiOiAyLjAsICJ0eXBlIjogIndvcmtlci1oZWFydGJlYXQiLCAic3dfaWRlbnQiOiAicHktY2VsZXJ5In0=\", \"headers\": {\"hostname\": \"[email protected]\"}, \"content-type\": \"application/json\", \"properties\": {\"priority\": 0, \"body_encoding\": \"base64\", \"delivery_info\": {\"routing_key\": \"worker.heartbeat\", \"exchange\": \"celeryev\"}, \"delivery_mode\": 1, \"delivery_tag\": \"d96e8e9e-032e-41ae-8e9c-64cf7c6bc17c\"}, \"content-encoding\": \"utf-8\"}" 
1) "pmessage" 
2) "*" 
3) "/0.celeryev/worker.heartbeat" 
4) "{\"body\": \"eyJzd19zeXMiOiAiRGFyd2luIiwgImNsb2NrIjogMTY1MiwgInRpbWVzdGFtcCI6IDE0ODI3ODE2MDkuODA5MzAyLCAiaG9zdG5hbWUiOiAiY2VsZXJ5QFJhYWlzYXMtTWFjQm9vay1Qcm8ubG9jYWwiLCAicGlkIjogNDI0MSwgInN3X3ZlciI6ICI0LjAuMiIsICJ1dGNvZmZzZXQiOiAtNiwgImxvYWRhdmciOiBbMi4yOSwgMi44NiwgMi45NV0sICJwcm9jZXNzZWQiOiA4LCAiYWN0aXZlIjogMSwgImZyZXEiOiAyLjAsICJ0eXBlIjogIndvcmtlci1oZWFydGJlYXQiLCAic3dfaWRlbnQiOiAicHktY2VsZXJ5In0=\", \"headers\": {\"hostname\": \"[email protected]\"}, \"content-type\": \"application/json\", \"properties\": {\"priority\": 0, \"body_encoding\": \"base64\", \"delivery_info\": {\"routing_key\": \"worker.heartbeat\", \"exchange\": \"celeryev\"}, \"delivery_mode\": 1, \"delivery_tag\": \"3160b37f-273b-4023-9bb6-5d89ebfe97a7\"}, \"content-encoding\": \"utf-8\"}" 
user-MacBook-Pro:WebTool user$ 

しかし、Redisの上で、私たちは、次の設定を設定した場合: config set client-output-buffer-limit "pubsub 0 0 0"、我々はredisで大放出メッセージを見る。フラスコのwebsocketが "ソケットが閉じています"というエラーを表示するようになりました。多分大きな応答を出すのにかかる時間が原因でしょう。 SocketIOのping_timeoutを増やすとこれが処理され、応答がフロントエンドに送信されます。

分割チャンクへの応答:

この問題に対する他の解決策は、小さなチャンクに応答を分割し、発光されます。上記のケースではうまくいきました。

関連する問題