js-executor: maxBatchSize
This commit is contained in:
parent
35e2ff99c3
commit
0970ce65b4
@ -26,6 +26,9 @@ const acks = Number(config.get('kafka.acks'));
|
||||
const requestTimeout = Number(config.get('kafka.requestTimeout'));
|
||||
const compressionType = (config.get('kafka.requestTimeout') === "gzip") ? CompressionTypes.GZIP : CompressionTypes.None;
|
||||
|
||||
const linger = 5; //milliseconds //TODO move to the config
|
||||
const maxBatchSize = 10; //max messages in batch //TODO move to the config
|
||||
|
||||
let kafkaClient;
|
||||
let kafkaAdmin;
|
||||
let consumer;
|
||||
@ -33,8 +36,8 @@ let producer;
|
||||
|
||||
const configEntries = [];
|
||||
|
||||
let topicMessages = [];
|
||||
let loopSend;
|
||||
let batchMessages = [];
|
||||
let sendLoopInstance;
|
||||
|
||||
function KafkaProducer() {
|
||||
this.send = (responseTopic, scriptId, rawResponse, headers) => {
|
||||
@ -48,36 +51,51 @@ function KafkaProducer() {
|
||||
}]
|
||||
};
|
||||
|
||||
topicMessages.push(message);
|
||||
pushMessageToSendLater(message);
|
||||
return {};
|
||||
}
|
||||
}
|
||||
|
||||
function sendLoopFunction() {
|
||||
loopSend = setInterval(sendProducerMsg, 200);
|
||||
function pushMessageToSendLater(message) {
|
||||
batchMessages.push(message);
|
||||
if (batchMessages.length >= maxBatchSize) {
|
||||
sendMessagesAsBatch();
|
||||
sendLoopWithLinger(); //reset loop function and reschedule new linger
|
||||
}
|
||||
}
|
||||
|
||||
function sendProducerMsg() {
|
||||
if (topicMessages.length > 0) {
|
||||
logger.info('sendProducerMsg from queue response, lenght: [%s]', topicMessages.length );
|
||||
const messagesToSend = topicMessages;
|
||||
topicMessages = [];
|
||||
function sendLoopWithLinger() {
|
||||
if (sendLoopInstance) {
|
||||
logger.debug("Clear sendLoop scheduler. Starting new send loop with linger [%s]", linger);
|
||||
clearInterval(sendLoopInstance);
|
||||
} else {
|
||||
logger.debug("Starting new send loop with linger [%s]", linger)
|
||||
}
|
||||
sendLoopInstance = setInterval(sendMessagesAsBatch, linger);
|
||||
}
|
||||
|
||||
function sendMessagesAsBatch() {
|
||||
if (batchMessages.length > 0) {
|
||||
logger.info('sendMessagesAsBatch, lenght: [%s]', batchMessages.length );
|
||||
const messagesToSend = batchMessages;
|
||||
batchMessages = [];
|
||||
producer.sendBatch({
|
||||
topicMessages: messagesToSend,
|
||||
acks: acks,
|
||||
compression: compressionType
|
||||
}).then(
|
||||
() => {
|
||||
logger.info('Response sent to kafka, length: [%s]', messagesToSend.length );
|
||||
},
|
||||
(err) => {
|
||||
if (err) {
|
||||
logger.error('Failed to send kafka, length: [%s], pending to reprocess msgs', messagesToSend.length );
|
||||
topicMessages = messagesToSend.concat(topicMessages);
|
||||
logger.error(err.stack);
|
||||
}
|
||||
}
|
||||
);
|
||||
() => {
|
||||
logger.info('Response sent to kafka, length: [%s]', messagesToSend.length );
|
||||
},
|
||||
(err) => {
|
||||
logger.error('Failed to send kafka, length: [%s], pending to reprocess msgs', messagesToSend.length );
|
||||
batchMessages = messagesToSend.concat(batchMessages);
|
||||
logger.error(err.stack);
|
||||
}
|
||||
);
|
||||
|
||||
} else {
|
||||
//logger.debug("nothing to send");
|
||||
}
|
||||
}
|
||||
|
||||
@ -156,22 +174,22 @@ function sendProducerMsg() {
|
||||
const { REQUEST_QUEUE_SIZE } = producer.events;
|
||||
const removeListenerRQS = producer.on(REQUEST_QUEUE_SIZE, e => logger.info(`producer REQUEST_QUEUE_SIZE ${e.payload.broker} size ${e.queueSize}`));
|
||||
|
||||
const removeListeners = {}
|
||||
const { FETCH_START } = consumer.events;
|
||||
removeListeners[FETCH_START] = consumer.on(FETCH_START, e => logger.info(`consumer FETCH_START`));
|
||||
const { FETCH } = consumer.events;
|
||||
removeListeners[FETCH] = consumer.on(FETCH, e => logger.info(`consumer FETCH numberOfBatches ${e.payload.numberOfBatches} duration ${e.payload.duration}`));
|
||||
const { START_BATCH_PROCESS } = consumer.events;
|
||||
removeListeners[START_BATCH_PROCESS] = consumer.on(START_BATCH_PROCESS, e => logger.info(`consumer START_BATCH_PROCESS topic ${e.payload.topic} batchSize ${e.payload.batchSize}`));
|
||||
const { END_BATCH_PROCESS } = consumer.events;
|
||||
removeListeners[END_BATCH_PROCESS] = consumer.on(END_BATCH_PROCESS, e => logger.info(`consumer END_BATCH_PROCESS topic ${e.payload.topic} batchSize ${e.payload.batchSize}`));
|
||||
const { COMMIT_OFFSETS } = consumer.events;
|
||||
removeListeners[COMMIT_OFFSETS] = consumer.on(COMMIT_OFFSETS, e => logger.info(`consumer COMMIT_OFFSETS topics ${e.payload.topics}`));
|
||||
// const removeListeners = {}
|
||||
// const { FETCH_START } = consumer.events;
|
||||
// removeListeners[FETCH_START] = consumer.on(FETCH_START, e => logger.info(`consumer FETCH_START`));
|
||||
// const { FETCH } = consumer.events;
|
||||
// removeListeners[FETCH] = consumer.on(FETCH, e => logger.info(`consumer FETCH numberOfBatches ${e.payload.numberOfBatches} duration ${e.payload.duration}`));
|
||||
// const { START_BATCH_PROCESS } = consumer.events;
|
||||
// removeListeners[START_BATCH_PROCESS] = consumer.on(START_BATCH_PROCESS, e => logger.info(`consumer START_BATCH_PROCESS topic ${e.payload.topic} batchSize ${e.payload.batchSize}`));
|
||||
// const { END_BATCH_PROCESS } = consumer.events;
|
||||
// removeListeners[END_BATCH_PROCESS] = consumer.on(END_BATCH_PROCESS, e => logger.info(`consumer END_BATCH_PROCESS topic ${e.payload.topic} batchSize ${e.payload.batchSize}`));
|
||||
// const { COMMIT_OFFSETS } = consumer.events;
|
||||
// removeListeners[COMMIT_OFFSETS] = consumer.on(COMMIT_OFFSETS, e => logger.info(`consumer COMMIT_OFFSETS topics ${e.payload.topics}`));
|
||||
|
||||
const messageProcessor = new JsInvokeMessageProcessor(new KafkaProducer());
|
||||
await consumer.connect();
|
||||
await producer.connect();
|
||||
sendLoopFunction();
|
||||
sendLoopWithLinger();
|
||||
await consumer.subscribe({topic: requestTopic});
|
||||
|
||||
logger.info('Started ThingsBoard JavaScript Executor Microservice.');
|
||||
@ -254,8 +272,8 @@ async function disconnectProducer() {
|
||||
try {
|
||||
logger.info('Stopping loop...');
|
||||
//TODO: send handle msg
|
||||
clearInterval(loopSend);
|
||||
sendProducerMsg();
|
||||
clearInterval(sendLoopInstance);
|
||||
sendMessagesAsBatch();
|
||||
await _producer.disconnect();
|
||||
logger.info('Kafka Producer stopped.');
|
||||
} catch (e) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user