lega911 / ijson

Inverted json - lightweight and blazing fast message-broker
MIT License
149 stars 12 forks source link

Как работает режим worker mode? #3

Closed MatthewPattell closed 4 years ago

MatthewPattell commented 4 years ago

Опять же есть пример на python:

import requests
s = requests.Session()
# send request to get first task with worker-mode (type = 'worker')
req = s.post('http://127.0.0.1:8001/msg/hello', headers={'type': 'worker'}).json()
while True:
    result = {'result': 'Hello ' + req['name'] + '!'}
    # send result, and receive next task
    req = s.post('http://127.0.0.1:8001', json=result).json()

Что происходит здесь? Чтобы можно было воспроизвести на других языках. Конструкции requests.Session() нет например в nodejs. Там заголовки устанавливаются или куки или еще что? Постоянно получаю 503 Service Unavailable после того как получил задачу и пытаюсь вернуть ответ.

lega911 commented 4 years ago

или еще что?

Нужно переиспользовать соединение (обычно оно закрыватеся после запроса).

Пример: запрос/клиент:

curl localhost:8001/test -d '{"text": "hello"}'

воркер:


let http = require('http');
let request = require('request');

var myAgent = new http.Agent({
    keepAlive: true,
    maxSockets: 1
    //keepAliveMsecs: 3000
});

function processResponse(err, res, data) {
    if(err) {console.error(err); return;}
    console.log('request:', data);
    data.text += ' world!';
    sendResponse(data);
}

// send result and get next task
function sendResponse(response) {
    request.post({url:'http://localhost:8001/', agent: myAgent, json: response}, processResponse);
};

// register a worker and get first task
request.post({url:'http://localhost:8001/test', agent: myAgent, json: true, headers: {type: 'worker'}}, processResponse);
MatthewPattell commented 4 years ago

@lega911 Да, спасибо. Нужно было http.Agent добавить и включить keepAlive. Думаю в документацию добавить следовало бы. Неочевидно.