nodejs中的kafkajs,消费顺序,不重复消费
参考: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,消费顺序,不重复消费的更多相关文章
- r-mq实现顺序消费,不重复消费
根据订单号,同一订单号的消息,会被发送到同一个topic下的同一个queue,发送端的有序,会导致topic中消息的有序,而consumer和queue是一对多?的关系.可以保证topic中的有顺序的 ...
- Kafka丢数据、重复消费、顺序消费的问题
面试官:今天我想问下,你觉得Kafka会丢数据吗? 候选者:嗯,使用Kafka时,有可能会有以下场景会丢消息 候选者:比如说,我们用Producer发消息至Broker的时候,就有可能会丢消息 候选者 ...
- 实际业务处理 Kafka 消息丢失、重复消费和顺序消费的问题
关于 Kafka 消息丢失.重复消费和顺序消费的问题 消息丢失,消息重复消费,消息顺序消费等问题是我们使用 MQ 时不得不考虑的一个问题,下面我结合实际的业务来和你分享一下解决方案. 消息丢失问题 比 ...
- Kafka中的消息是否会丢失和重复消费(转)
在之前的基础上,基本搞清楚了Kafka的机制及如何运用.这里思考一下:Kafka中的消息会不会丢失或重复消费呢?为什么呢? 要确定Kafka的消息是否丢失或重复,从两个方面分析入手:消息发送和消息消费 ...
- rocketmq总结(消息的顺序、重复、事务、消费模式)
rocketmq总结(消息的顺序.重复.事务.消费模式) 参考: http://www.cnblogs.com/wxd0108/p/6038543.html https://www.cnblogs.c ...
- nodejs中mysql用法
nodejs也算是一篇脚本了我们来看nodejs如何使用mysql数据库了有了它们两组合感觉还是非常的不错哦,下面一起来看nodejs中使用mysql数据库的示例,希望能够帮助到各位. <scr ...
- nodejs中如何使用mysql数据库[node-mysql翻译]
nodejs中如何使用mysql数据库 db-mysql因为node-waf: not found已经不能使用,可以使用mysql代替. 本文主要是[node-mysql]: https://www. ...
- Kafka如何保证百万级写入速度以及保证不丢失不重复消费
一.如何保证百万级写入速度: 目录 1.页缓存技术 + 磁盘顺序写 2.零拷贝技术 3.最后的总结 “这篇文章来聊一下Kafka的一些架构设计原理,这也是互联网公司面试时非常高频的技术考点. Kafk ...
- RocketMQ(消息重发、重复消费、事务、消息模式)
分布式开放消息系统(RocketMQ)的原理与实践 RocketMQ基础:https://github.com/apache/rocketmq/tree/rocketmq-all-4.5.1/docs ...
- 探索RocketMQ的重复消费和乱序问题
前言 在之前的MQ专题中,我们已经解决了消息中间件的一大难题,消息丢失问题. 但MQ在实际应用中不是说保证消息不丢失就万无一失了,它还有两个令人头疼的问题:重复消费和乱序. 今天我们就来聊一聊这两个常 ...
随机推荐
- [iOS] 随手记录 IDFA 的一些相关内容
IDFA IDFA,广告标识符,类似于这一台设备的唯一性标识符,一般提供给第三方去做一些广告的关联. 但如果用户完全 重置系统,或者 "还原位置与隐私" 这个广告标示符会重新生成 ...
- Metasploit渗透测试框架一
Metasploit简介 Metasploit是一个渗透测试平台,使您能够查找,利用和验证漏洞.该平台还有Metasploit Pro. Metasploit是一个免费的.可下载的框架,本身自带数百已 ...
- win10如何设置共享媒体流?
一.win10设置媒体流共享 1 电脑开机后,点击右下角的"网络连接-网络和Internet设置". 2 进入设置界面后,点击"网络和共享中心". ...
- 《《《PLSQL Developer编辑器怎么设置圆括号高亮
转载:PLSQL Developer编辑器怎么设置圆括号高亮-百度经验 (baidu.com) 为了在plsql中调代码好调 LSQL Developer编辑器怎么设置圆括号高亮?有时候对PLSQL ...
- docker登录Ubuntu出现error storing credentials - err: exit status 1, out: `Cannot autolaunch D-Bus without X11 $DISPLAY`的解决方法
命令行登录docker时,在Ubuntu 18.04下可能会出现 error storing credentials - err: exit status 1, out: `Cannot autola ...
- 多线程问题sleep与wait
涉及到的三个方法:wait():一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器notify():一旦执行此方法,就会唤醒被wait的一个线程.如果有多个线程被wait,就唤醒优先级高:not ...
- IaaS--区域和可用区(何恺铎《深入浅出云计算》笔记整理)
[关键概念] IaaS(Infrastructure as a Service):即"基础设施即服务",一般指云计算所提供的计算.存储.网络等基本底层能力.是基于软件技术对物理硬件 ...
- jwt二次加密失败原因(Bad “options.expiresIn“ option the payload already has an “exp“ property.)
在写vue+nodejs项目的校验token时,出现了次错误 然后想了想问题所在: 第一次加密的时候使用jwt.sign(value,秘钥,{}),会返回一个字符串,然后当前端跳转别的发送请求时,会将 ...
- BUU刷题记录
[GWCTF 2019]mypassword xss+csp 打开页面可以注册登录 登进去提示不是sql注入 然后提示源码 看一下 然后有段后端代码写道了注释里 <!-- if(is_array ...
- Outlook配置文件位置
[HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles ...