2016-12-20 1 views
1

Я работаю над веб-приложением, в котором пользователь загружает файл, некоторые вычисления выполняются в файле на сервере, который занимает много времени. Как только расчет выполнен, приложение отображает вычисленные результаты с исходным файлом.большой ответ json, испускаемый сельдереем, не достигая колбы

Это работает для небольших файлов, но не для больших файлов. В принципе, если json-ответ мал (проверен на массив объектов размером 3 и 11726), он испускается в браузер, но не для большого ответа (размер 507072). Загруженный файл в неудавшемся случае имеет размер ~ 3 МБ, а ответ json содержит все данные загруженного файла, поэтому, если предположить, что он также имеет тот же порядок.

На стороне сельдерея

Я вижу это в случае малого ответ JSON (11726 размера массива)

[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:

[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 

На флаконе

Для небольшого ответа 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] 

Но для большого ответа, есть ничего. Кажется, что колба ничего не получает от сельдерея:

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] 

Я использую флягу, флягу-socketio, сельдерей и Redis. Я выполнил this blog для реализации сетевых сокетов и длинной фоновой задачи. Вот соответствующий код.

#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') 

Любая помощь приветствуется.

Update

Redis ключевых значений всех задач являются одинаковыми (только разные идентификаторы задач):

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 Большое спасибо за ваш комментарий! Я новичок в websockets, и я смог достичь этого момента из-за ваших блог-постов и ответов на многие вопросы. Я обновил вопрос с помощью журналов redis, но мне это показалось прекрасным. Есть ли какой-то буфер, который не позволяет получить большой ответ? Потому что я смог решить эту проблему, выпустив небольшие кусочки json этого большого ответа. – Raaisa

+0

Я подозреваю, что есть предел, но простой поиск не принес ничего полезного. Вы также можете подключиться к сокетному каналу на redis, чтобы следить за тем, что там происходит. Было бы интересно посмотреть, отображаются ли эти большие полезные нагрузки в очереди. – Miguel

ответ

0

Эта проблема была решена путем настройки пределов клиента-буфера redis pubsub и тайм-аута pall-socketio ping.

монитор Redis и колба

Контролируемого REDIS журналов как предложено Мигель. Использовал команду PSUBSCRIBE * в redis-cli, чтобы отслеживать активность redis как очередь сообщений.

Для небольшого набора данных, это произошло на Redis, когда кнопка была нажата, чтобы начать долго выполняющиеся задачи:

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" 

Это правильно запустить задачу сельдерея и отправки всех сообщений испускают. Идентификатор задачи - «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]ook-Pro.local\"}, \"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", мы видим большое сообщение emit в redis. Теперь возникает другая проблема, так как флеш-websocket показывает ошибку «Socket is closed». Вероятно, из-за времени, затраченного на выдачу большого отклика. Увеличение ping_timeout в SocketIO обрабатывает это, и ответ отправляется в интерфейс.

Разделить ответ на куски:

Другим решением этой проблемы деления ответ на небольшие куски и излучающие. Он хорошо работал для вышеуказанного случая.

Смежные вопросы