js-executor: Refactoring Kafka executor for use async/await

This commit is contained in:
Vladyslav_Prykhodko 2021-06-09 13:30:28 +03:00
parent ff7fa6237f
commit dd74824570

View File

@ -36,11 +36,10 @@ let producer;
const configEntries = []; const configEntries = [];
let batchMessages = []; let batchMessages = [];
let batchResolvers = [];
let sendLoopInstance; let sendLoopInstance;
function KafkaProducer() { function KafkaProducer() {
this.send = (responseTopic, scriptId, rawResponse, headers) => { this.send = async (responseTopic, scriptId, rawResponse, headers) => {
logger.debug('Pending queue response, scriptId: [%s]', scriptId); logger.debug('Pending queue response, scriptId: [%s]', scriptId);
const message = { const message = {
topic: responseTopic, topic: responseTopic,
@ -51,60 +50,50 @@ function KafkaProducer() {
}] }]
}; };
return pushMessageToSendLater(message); await pushMessageToSendLater(message);
} }
} }
function pushMessageToSendLater(message) { async function pushMessageToSendLater(message) {
let resolver;
const promise = new Promise((resolve, reject) => {
resolver = resolve;
});
batchMessages.push(message); batchMessages.push(message);
batchResolvers.push(resolver);
if (batchMessages.length >= maxBatchSize) { if (batchMessages.length >= maxBatchSize) {
sendMessagesAsBatch(); await sendMessagesAsBatch(true);
sendLoopWithLinger(); //reset loop function and reschedule new linger
} }
return promise;
} }
function sendLoopWithLinger() { function sendLoopWithLinger() {
if (sendLoopInstance) { if (sendLoopInstance) {
logger.debug("Clear sendLoop scheduler. Starting new send loop with linger [%s]", linger); clearTimeout(sendLoopInstance);
clearInterval(sendLoopInstance);
} else { } else {
logger.debug("Starting new send loop with linger [%s]", linger) logger.debug("Starting new send loop with linger [%s]", linger)
} }
sendLoopInstance = setInterval(sendMessagesAsBatch, linger); sendLoopInstance = setTimeout(sendMessagesAsBatch, linger);
} }
function sendMessagesAsBatch() { async function sendMessagesAsBatch(isImmediately) {
if (sendLoopInstance) {
logger.debug("sendMessagesAsBatch: Clear sendLoop scheduler. Starting new send loop with linger [%s]", linger);
clearTimeout(sendLoopInstance);
}
sendLoopInstance = null;
if (batchMessages.length > 0) { if (batchMessages.length > 0) {
logger.debug('sendMessagesAsBatch, length: [%s]', batchMessages.length); logger.debug('sendMessagesAsBatch, length: [%s], %s', batchMessages.length, isImmediately ? 'immediately' : '');
const messagesToSend = batchMessages; const messagesToSend = batchMessages;
const resolvers = batchResolvers;
batchMessages = []; batchMessages = [];
batchResolvers = []; try {
producer.sendBatch({ await producer.sendBatch({
topicMessages: messagesToSend, topicMessages: messagesToSend,
acks: acks, acks: acks,
compression: compressionType compression: compressionType
}).then( })
() => {
logger.debug('Response batch sent to kafka, length: [%s]', messagesToSend.length); logger.debug('Response batch sent to kafka, length: [%s]', messagesToSend.length);
for (let i = 0; i < resolvers.length; i++) { } catch(err) {
resolvers[i]();
}
},
(err) => {
logger.error('Failed batch send to kafka, length: [%s], pending to reprocess msgs', messagesToSend.length); logger.error('Failed batch send to kafka, length: [%s], pending to reprocess msgs', messagesToSend.length);
logger.error(err.stack); logger.error(err.stack);
batchMessages = messagesToSend.concat(batchMessages); batchMessages = messagesToSend.concat(batchMessages);
batchResolvers = resolvers.concat(batchResolvers); //promises will never be rejected. Will retry forever
} }
);
} }
sendLoopWithLinger();
} }
(async () => { (async () => {
@ -285,9 +274,8 @@ async function disconnectProducer() {
producer = null; producer = null;
try { try {
logger.info('Stopping loop...'); logger.info('Stopping loop...');
//TODO: send handle msg clearTimeout(sendLoopInstance);
clearInterval(sendLoopInstance); await sendMessagesAsBatch();
sendMessagesAsBatch();
await _producer.disconnect(); await _producer.disconnect();
logger.info('Kafka Producer stopped.'); logger.info('Kafka Producer stopped.');
} catch (e) { } catch (e) {