/* * node-rdkafka - Node.js wrapper for RdKafka C/C++ library * * Copyright (c) 2016 Blizzard Entertainment * * This software may be modified and distributed under the terms * of the MIT license. See the LICENSE.txt file for details. */ var Writable = require('stream').Writable; var Kafka = require('../'); var count = 0; var total = 0; var store = []; var host = process.argv[2] || 'localhost:9092'; var topic = process.argv[3] || 'test'; var stream = Kafka.createReadStream({ 'metadata.broker.list': host, 'group.id': 'node-rdkafka-benchs', 'fetch.wait.max.ms': 100, 'fetch.message.max.bytes': 1024 * 1024, 'enable.auto.commit': false // paused: true, }, { 'auto.offset.reset': 'earliest' }, { fetchSize: 16, topics: [topic] }); // Track how many messages we see per second var interval; var isShuttingDown = false; stream .on('error', function(err) { console.log('Shutting down due to error'); console.log(err.stack); shutdown(); }) .once('data', function(d) { interval = setInterval(function() { if (isShuttingDown) { clearInterval(interval); } console.log('%d messages per second', count); if (count > 0) { // Don't store ones when we didn't get data i guess? store.push(count); // setTimeout(shutdown, 500); } count = 0; }, 1000).unref(); }) .on('end', function() { // Can be called more than once without issue because of guard var console.log('Shutting down due to stream end'); shutdown(); }) .pipe(new Writable({ objectMode: true, write: function(message, encoding, cb) { count += 1; total += 1; setImmediate(cb); } })); process.once('SIGTERM', shutdown); process.once('SIGINT', shutdown); process.once('SIGHUP', shutdown); function shutdown() { if (isShuttingDown) { return; } clearInterval(interval); isShuttingDown = true; if (store.length > 0) { var calc = 0; for (var x in store) { calc += store[x]; } var mps = parseFloat(calc * 1.0/store.length); console.log('%d messages per second on average', mps); } // Destroy the stream stream.destroy(); stream.once('end', function() { console.log('total: %d', total); }); }