dashersw/cote

Prevent responder from getting new requests

Open

#228 aperta il 18 set 2020

Vedi su GitHub
 (5 commenti) (1 reazione) (0 assegnatari)JavaScript (184 fork)github user discovery
enhancementhelp wanted

Metriche repository

Star
 (2388 star)
Metriche merge PR
 (Metriche PR in attesa)

Descrizione

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.

Guida contributor