You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

100 lines
3.3 KiB

  1. const Kafka = require("../lib/index.js");
  2. const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
  3. const sendData = async (producer, totalMessages) => {
  4. const topic = "node";
  5. const msg = "dkfljaskldfajkldsjfklasdjfalk;dsjfkl;asjfdskl;fjda;lkfjsdklfsajlkfjdsklfajsklfjsklanklsalkjkljkasfak";
  6. const buffer = Buffer.from(msg);
  7. const key = "test";
  8. for (let n = 0; n < totalMessages; ++n) {
  9. let bufferIsFull = false;
  10. do {
  11. bufferIsFull = false;
  12. try {
  13. producer.produce(topic, -1, buffer, key, null, n);
  14. }
  15. catch (error) {
  16. // Based on config, and messages, this will execute once
  17. if (error.code === Kafka.CODES.ERRORS.ERR__QUEUE_FULL) {
  18. producer.poll();
  19. // The wait introduces 11-12 seconds of latency when dr_cb is true
  20. const start = process.hrtime();
  21. await wait(50);
  22. const latency = process.hrtime(start);
  23. console.info(`Wait took ${latency[0]} seconds`);
  24. bufferIsFull = true;
  25. } else {
  26. throw error;
  27. }
  28. }
  29. } while (bufferIsFull);
  30. }
  31. console.log("Finished producing");
  32. };
  33. const verifyReports = async (reports, reportsComplete, totalMessages) => {
  34. const reportsTimeout = new Promise((resolve, reject) => {
  35. setTimeout(() => {
  36. reject("Delivery report timed out");
  37. }, 10000);
  38. });
  39. await Promise.race([reportsComplete, reportsTimeout]);
  40. await wait(500); // wait for some more delivery reports.
  41. if (reports.length === totalMessages) {
  42. console.log("Reports count match");
  43. } else {
  44. console.error("Reports count doesn't match");
  45. return;
  46. }
  47. for(let n = 0; n < totalMessages; ++n) {
  48. if(reports[n].opaque !== n) {
  49. console.error("Expect message number does not match");
  50. }
  51. }
  52. };
  53. const run = async () => {
  54. const reports = [];
  55. const totalMessages = 1000100;
  56. const producer = new Kafka.Producer({
  57. "batch.num.messages": 50000,
  58. "compression.codec": "lz4",
  59. "delivery.report.only.error": false,
  60. "dr_cb": true,
  61. "metadata.broker.list": "localhost:9092",
  62. "message.send.max.retries": 10000000,
  63. "queue.buffering.max.kbytes": 2000000,
  64. "queue.buffering.max.messages": 1000000,
  65. "queue.buffering.max.ms": 0,
  66. "socket.keepalive.enable": true,
  67. }, {});
  68. producer.setPollInterval(100);
  69. producer.on("event.log", (obj) => console.log(obj));
  70. const reportsComplete = new Promise((resolve) => {
  71. producer.on("delivery-report", (err, report) => {
  72. reports.push(report);
  73. if(reports.length === totalMessages) {
  74. resolve();
  75. }
  76. });
  77. });
  78. const readyPromise = new Promise((resolve) => {
  79. producer.on("ready", async () => {
  80. console.log("Producer is ready");
  81. resolve();
  82. });
  83. producer.connect();
  84. });
  85. await readyPromise;
  86. await sendData(producer, totalMessages);
  87. await verifyReports(reports, reportsComplete, totalMessages);
  88. process.exit(0);
  89. };
  90. run().catch((err) => {
  91. console.error(err);
  92. });