参考:https://kafka.js.org/docs
确保同一个消息发送到同一个partition,一个topic,一个partition,一个consumer,内部单线程消费
1.封装kafkaUtil类

const {
Kafka,
logLevel
} = require('kafkajs')
//const cache = require('../conn/redis.js');
const kafka = new Kafka({
clientId: 'my-app',
brokers: [
"lcoalhost:8092",
"localhost:8093",
"localhost:8094",
"lcoalhost:8095",
"localhost:8096",
],
retry: {
retries: 8
},
logLevel: logLevel.ERROR
})
/**
* 如果groupId已存在重复的,建立不同的kafka实例会报错
*/
/**
* kafka生产者发送消息
* messages: [{
value: 'Hello KafkaJS user!',
}, {
value: 'Hello KafkaJS user2!',
}],
*/ exports.producer = async (topic, groupId, msg) => {
try {
const producer = kafka.producer({
groupId: groupId
})
await producer.connect()
await producer.send({
topic: topic,
messages: msg,
acks: 1
})
} catch (error) {
throw error;
} } exports.consumer = async (topic, groupId, callback) => {
try {
const consumer = kafka.consumer({
groupId: groupId
})
await consumer.connect()
await consumer.subscribe({
topic: topic
})
await consumer.run({
autoCommit: true,
eachMessage: async ({
topic,
partition,
message
}) => {
//防止重复消费数据
await consumer.commitOffsets([{
topic: topic,
partition: partition,
offset: Number(message.offset) + 1
}])
let msg = message.value.toString()
console.log(72, '消费者接收到的数据为:', msg);
callback(msg);
}
})
} catch (err) {
throw err;
}
}

2.producer.js

const kafka = require('./kafkaUtil');
(async function () {
const topic = 'MY——TOPIC1'
const groupId = 'MY——TOPIC1'
try {
for (let i = 0; i < 10000; i++) {
await new Promise((resolve, reject) => {
setTimeout(async () => {
resolve(1)
}, 1000)
}).then(async () => {
console.log('发送的数据为:', i)
await kafka.producer(topic, groupId, [{
key: "a",//key值为了保证消费者按照生产者生产的数据顺序,消费数据,key值必须一致;如果不需要消费者按照生产的顺序消费,key去掉即可,参考: https://www.zhihu.com/question/266390197
value: `${i}`
}])
})
}
} catch (error) {
console.log(14, error)
throw error;
} })()

3.consumer.js

const kafka = require('./kafkaUtil');
(async function () {
const fs = require('fs');
let count = 1;
const topic = 'MY——TOPIC1'
const groupId = 'MY——TOPIC1'
try {
await kafka.consumer(topic, groupId, async (msg) => {
let str = `第${count}接收到的数据为:${msg}`;
count++;
fs.writeFileSync(`${process.cwd()}/test01.txt`, str, {
flag: 'a',
})
console.log(str)
})
} catch (error) {
console.log(14, error)
throw error;
}
})()

经实际测试,没有发现消费问题。如有发现问题,请多多指教,谢谢。。。  

 

nodejs中的kafkajs,消费顺序,不重复消费的更多相关文章

  1. r-mq实现顺序消费,不重复消费

    根据订单号,同一订单号的消息,会被发送到同一个topic下的同一个queue,发送端的有序,会导致topic中消息的有序,而consumer和queue是一对多?的关系.可以保证topic中的有顺序的 ...

  2. Kafka丢数据、重复消费、顺序消费的问题

    面试官:今天我想问下,你觉得Kafka会丢数据吗? 候选者:嗯,使用Kafka时,有可能会有以下场景会丢消息 候选者:比如说,我们用Producer发消息至Broker的时候,就有可能会丢消息 候选者 ...

  3. 实际业务处理 Kafka 消息丢失、重复消费和顺序消费的问题

    关于 Kafka 消息丢失.重复消费和顺序消费的问题 消息丢失,消息重复消费,消息顺序消费等问题是我们使用 MQ 时不得不考虑的一个问题,下面我结合实际的业务来和你分享一下解决方案. 消息丢失问题 比 ...

  4. Kafka中的消息是否会丢失和重复消费(转)

    在之前的基础上,基本搞清楚了Kafka的机制及如何运用.这里思考一下:Kafka中的消息会不会丢失或重复消费呢?为什么呢? 要确定Kafka的消息是否丢失或重复,从两个方面分析入手:消息发送和消息消费 ...

  5. rocketmq总结(消息的顺序、重复、事务、消费模式)

    rocketmq总结(消息的顺序.重复.事务.消费模式) 参考: http://www.cnblogs.com/wxd0108/p/6038543.html https://www.cnblogs.c ...

  6. nodejs中mysql用法

    nodejs也算是一篇脚本了我们来看nodejs如何使用mysql数据库了有了它们两组合感觉还是非常的不错哦,下面一起来看nodejs中使用mysql数据库的示例,希望能够帮助到各位. <scr ...

  7. nodejs中如何使用mysql数据库[node-mysql翻译]

    nodejs中如何使用mysql数据库 db-mysql因为node-waf: not found已经不能使用,可以使用mysql代替. 本文主要是[node-mysql]: https://www. ...

  8. Kafka如何保证百万级写入速度以及保证不丢失不重复消费

    一.如何保证百万级写入速度: 目录 1.页缓存技术 + 磁盘顺序写 2.零拷贝技术 3.最后的总结 “这篇文章来聊一下Kafka的一些架构设计原理,这也是互联网公司面试时非常高频的技术考点. Kafk ...

  9. RocketMQ(消息重发、重复消费、事务、消息模式)

    分布式开放消息系统(RocketMQ)的原理与实践 RocketMQ基础:https://github.com/apache/rocketmq/tree/rocketmq-all-4.5.1/docs ...

  10. 探索RocketMQ的重复消费和乱序问题

    前言 在之前的MQ专题中,我们已经解决了消息中间件的一大难题,消息丢失问题. 但MQ在实际应用中不是说保证消息不丢失就万无一失了,它还有两个令人头疼的问题:重复消费和乱序. 今天我们就来聊一聊这两个常 ...

随机推荐

  1. 如何实现基于GPIO按键的长按,短按,双击

    不同的架构实现并不相同,所以我分成了两中:STM32平台和其他平台: STM32平台 首先要分析:该如何判断当前的按键状态:单机和双击是通过在有限时间内是否有新的按动作产生 -- 所以需要一个记录按键 ...

  2. U盘插上电脑上后自动备份文件

    缘由 一直有个不好的习惯,将所有文件都存在个人U盘,下班直接拔了就回家. 前久把U盘插入MacBook后,U盘就无法读数据了,搞了很久也没搞定. 当然了,里面的数据也无法使用了. 所以,现在的想法: ...

  3. PVE使用vlan

  4. NGAC下一代访问控制

    NGAC,即下一代访问控制,采用将访问决定数据建模为图形的方法.NGAC 可以实现系统化.策略一致的访问控制方法,以高精细度授予或拒绝用户管理能力. 在这张图中,我们可以看到 /hr-docs 文件夹 ...

  5. 【layui】下拉控件dropdown 简单的使用

    官方网站地址: http://test.microanswer.cn/page/dropdown.html 1.代码 layui.use(['index', 'table', 'form', 'dro ...

  6. docker compose服务编排简介、基于发布包构建多个webapi容器 和 基于镜像实现Nginx反向代理webapi

    一. docker compose服务编排简介 1. 背景 微服务架构的应用系统中一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,维护的工作量会很大: A. 要创建镜 ...

  7. verilog Signed与赋值形式

    `timescale 1ns/1ps module test; reg signed[3:0] uu; reg signed[3:0] dd; reg [2:0] extract; reg [4:0] ...

  8. SAP适合医疗器械行业的公司、工厂吗?

    医疗器械行业在我国国民经济中发展情况良好,未来发展前景也很看好.但竞争力不强,在GMP要求下消耗大量的人力.物力是我国医疗器械企业需要面对的巨大压力,在这种情况下,企业如何充分利用网络经济和信息手段加 ...

  9. SourceInsight4.0修改字体大小

    SourceInsight4.0修改字体大小 1.右键Options->Preferences.如图所示,然后找到Syntax Decorations选项,点击File Types 2.点击Fi ...

  10. fsck.fat 检查修复(MS-DOS)fat类型文件系统

    使用方式 fsck.fat [option] DEVICE 例如 fsck.fat -aw /dev/usba0 fsck.fat 检查fat文件系统的一致性,并选择性的尝试修复他们. 如下文件系统问 ...