dashersw/cote

Prevent responder from getting new requests

Open

#228 ouverte le 18 sept. 2020

Voir sur GitHub
 (5 commentaires) (1 réaction) (0 assignés)JavaScript (184 forks)github user discovery
enhancementhelp wanted

Métriques du dépôt

Stars
 (2 388 stars)
Métriques de merge PR
 (Métriques PR en attente)

Description

Hi, I'm working on my service to graceful shutdown. How can I prevent responder to accept new requests so it could finish already got ones and then call responder.close?

I have example responder:

const cote = require('cote');

const { SHOULD_SIGTERM } = process.env;

async function main() {
    const server = new cote.Responder({
        name: 'rpc-server',
        namespace: 'rpc-server',
        key : 'rpc-server'
    });

    server.on('foo', async ({ type, data }) => {
        const { i } = data;

        if (SHOULD_SIGTERM && i === 5) {
            server.close();
        }

        console.log('Data', i);
        const result = `bar-${i}`;
        console.log('Result', result);

        return result;
    })
}

if (require.main === module) {
    main();
}

and example requester that make 10 requests:

const cote = require('cote');

async function main() {
    const requester = new cote.Requester({
        name: 'rpc-requester',
        namespace: 'rpc-server',
        key: 'rpc-server',
    });

    for (let i = 0; i < 10; i++) {
        let result;
        try {
            result = await requester.send({
                type: 'foo',
                data: {
                    i,
                },
                __timeout: 3 * 1000
            });
        } catch (e) {
            console.error(e);
        }
        console.log('Result', result);
    }

    requester.close();
}

if (require.main === module) {
    main();
}

As I coded responder to close on request with i === 5, I lose this request. IMPORTANT NOTE: when I do NOT specify __timeout in requester, once responder is restarted this request hangs forever. In case when I do NOT call responder.close untill all requests are processed I keep getting new requests, so it does not seems like a solution. Thanks in advance.

Guide contributeur