Kafka 和 EMS 消息批量 ack 的实现
来源:互联网 发布:it学什么好 编辑:程序博客网 时间:2024/06/14 04:19
我们现在用 kafka和 ems两种方式来接收外部消息,之前没接收一条消息就 ack,系统当前消息量大概接近亿级每天,集中在工作时间的八到十个小时。这意味着每个消息都 ack会消耗大量网络资源,拖慢消息处理速度。因此决定用批量 ack来降低网络消耗。
实现过程中碰到一个问题,假设没10条 ack 一次,那如果有37条数据,意味着前10条可以成功 ack,而后 7条由于没有凑够 batchsize有可能会一直不 ack。
对于 kafkaconsumer来说,consumer调用 poll方法主动从服务器获取消息,这个方法可以接受 timeout参数。这时即使没有达到 batch size,依然有机会在 timeout时 act.
而对于 EMS,就有点麻烦。
EMS client有两种消息接收方式。一种是 client主动调用consume方法从服务器上获取消息。这种方式和 kafka一样,可以接受timeout参数,因此不是问题。
问题在于另一种方式,onMessage()它是事件驱动的,不接受 timeout 参数。这样当最后7条消息收到以后它会一直等待后面的消息到来。这时客户端已经接收并处理完前7条,但还没有机会 ack,如果客户端这时挂掉,那么这7条处理过的消息再也没机会被 ack。这会导致消息重复处理。解决办法是开一个守护线程来定时做 ack,由于 EMS ack依赖于具体消息,因此每次收到一条消息都要 cache下来,并且几下最后接收到的时间,然后用这最后一条消息来做 ack。
Kafka和 EMS一样都支持最后一条消息 ack时,前面的消息就自动 ack。
阅读全文
0 0
- Kafka 和 EMS 消息批量 ack 的实现
- ack是什么,如何使用Ack机制,如何关闭Ack机制,基本实现,STORM的消息容错机制,Ack机制
- Kafka实现篇之消息和日志
- java 实现kafka消息生产者和消费者
- 用redis来实现具有ack机制的消息队列
- OMS和EMS的区别
- kafka消息demo的java实现
- 手机短信中 SMS、EMS、MMS和EMS的区别!
- Spring data kafka操作kafka消息的发送和订阅
- kafka和其他消息队列的对比
- TCP之Delay ACK在Linux和Windows上实现的异同-Linux的自适应ACK
- 漫游Kafka实现篇之消息和日志
- 漫游Kafka实现篇之消息和日志
- 漫游Kafka实现篇之消息和日志
- 漫游Kafka实现篇之消息和日志
- Strom 消息可靠性保障机制和Ack原理
- tcp协议ack以及乱序报文暂存的实现--立即ack/延迟ack/捎带ack
- Kafka消息队列实现业务端确认的方案
- MusicPlayer下build.gradle的依赖
- oracle数据库习题1
- Linux C常用头文件及函数
- JAVA 选择结构switch
- 单例模式
- Kafka 和 EMS 消息批量 ack 的实现
- 290. Word Pattern
- Java Scanner next()和nextLine()的区别
- rqnoj 202
- LeetCode 167. Two Sum II
- 机器学习 和 深度学习 的相关概念
- 用Matlab 音量标准化 处理wav文件
- 一点小总结
- css3常用动画大全:translate、scale、opacity、rotate