CN106170013A - 一种基于Redis的Kafka消息唯一性方法 - Google Patents
一种基于Redis的Kafka消息唯一性方法 Download PDFInfo
- Publication number
- CN106170013A CN106170013A CN201610492940.6A CN201610492940A CN106170013A CN 106170013 A CN106170013 A CN 106170013A CN 201610492940 A CN201610492940 A CN 201610492940A CN 106170013 A CN106170013 A CN 106170013A
- Authority
- CN
- China
- Prior art keywords
- redis
- message
- message data
- kafka
- method based
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L67/00—Network arrangements or protocols for supporting network services or applications
- H04L67/01—Protocols
- H04L67/10—Protocols in which an application is distributed across nodes in the network
Landscapes
- Engineering & Computer Science (AREA)
- Computer Networks & Wireless Communication (AREA)
- Signal Processing (AREA)
- Data Exchanges In Wide-Area Networks (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明涉及一种基于Redis的Kafka消息唯一性方法,利用Redis解决Kafka中消息重复消费的问题,所述方法包括下列步骤:Kafka接收消息数据;采用分布式选举算法,对接收的消息数据进行过滤;对过滤后的消息数据进行业务逻辑处理;判断业务逻辑处理是否出错,若是则删除业务逻辑处理出错的消息数据,若否则正常结束。与现有技术相比,本发明具有避免消息重复消费、吞吐量高以及可靠性高等优点。
Description
技术领域
本发明涉及分布式消息发布-订阅系统,尤其是涉及一种基于Redis的Kafka消息唯一性方法。
背景技术
Apache Kafka是分布式消息发布-订阅系统。与传统的消息服务RabbitMQ、ApacheActiveMQ相比吞吐量提高了几个数量级。目前Kafka已广泛在日志处理等系统中使用。
在Kafka使用中,消息的消费者必须自己维护当前消费的消息的位置,比如将位置保存在Zookeeper中。当消费者处理完一批消息后,先提交消息保存位置,然后再读取和处理下一批消息。这样就造成了一个问题,当消费者崩溃时,位置信息还没来得及保存,下一次读取位置会跟上一次提交之后的位置相同,这样就会导致消息重复消费。
在日志处理等系统中,消息重复消费并不是什么大问题,但对于如交易消息等却是不可接收的。这样就极大的限制了Kafka的使用范围。
发明内容
本发明的目的是针对上述问题提供一种避免消息重复消费、吞吐量高以及可靠性高的基于Redis的Kafka消息唯一性方法方法。
本发明的目的可以通过以下技术方案来实现:
一种基于Redis的Kafka消息唯一性方法,利用Redis解决Kafka中消息重复消费的问题,所述方法包括下列步骤:
1)接收一组消息数据;
2)采用分布式选举算法,对步骤1)接收的消息数据进行过滤;
3)分别对过滤后的每条消息数据进行业务逻辑处理;
4)判断步骤3)中的业务逻辑处理是否出错,若是,则进入步骤5),若否,则正常结束;
5)删除出错的消息数据条目。
所述步骤2),采用分布式选举算法进行过滤具体为:
21)为接收到的每个消息数据设置对应的一个UUID;
22)将同一消息数据分别发送至N个Redis中;
23)对N个Redis中的同一消息数据分别调用SETNX命令,记m为大于N/2的最小整数;
24)判断是否有m或大于m个SETNX命令的返回值为0,若是,则过滤该消息数据,若否,则保留该消息数据。
所述Redis的个数N为奇数。
所述SETNX命令包括key和value,调用所述SETNX命令时,将消息数据对应的UUID赋值给key,将当前时间赋值给value。
所述步骤23),调用SETNX命令后,判断key在Redis中是否已存在,若是,则返回值为0,若否,则返回值为1。
与现有技术相比,本发明具有以下有益效果:
(1)解决了Kafka消息重复问题,并且应用逻辑层无需的修改。
(2)Redis具有高性能,整个系统可以保证极高的吞吐量。
(3)采用多Redis实例集群,可容忍N-1个实例故障,有极高的可靠性。
(4)采用分布式选举算法,保证了数据的可靠性。
(5)多个Redis分别部署在不同的物理实体机上,避免了硬件损坏导致该解决方法不可用。
(6)在消息数据业务逻辑处理出错时,删除对应的消息数据,可以允许系统对这条数据再次处理,提高可靠性。
附图说明
图1为本发明的方法示意图。
具体实施方式
下面结合附图和具体实施例对本发明进行详细说明。本实施例以本发明技术方案为前提进行实施,给出了详细的实施方式和具体的操作过程,但本发明的保护范围不限于下述的实施例。
如图1所示,本发明提供了一种基于Redis的Kafka消息唯一性方法,Redis是一个key-value存储系统。它支持多种value类型存储,包括string(字符串)、list(链表)、set(集合)、zset(有序集合)和hash(哈希类型)。利用Redis解决Kafka中消息重复消费的问题,该方法包括下列步骤:
1)Kafka接收一组消息数据。
2)采用分布式选举算法,利用Redis的SETNX命令对步骤1)接收的消息数据进行过滤,具体为:
21)为接收到的消息数据设置一个UUID;
22)将该消息数据分别发送至N个Redis中,N为奇数;
23)对N个Redis中的消息数据分别调用SETNX命令,记m为大于N/2的最小整数;
24)判断是否有m或大于m个SETNX命令的返回值为0,若是则保留该消息数据,若否则过滤该消息数据。
3)对过滤后的每条消息数据进行业务逻辑处理。
4)判断步骤3)中的业务逻辑处理是否出错,若是则进入步骤5),若否则正常结束。
5)调用Redis的DEL命令删除出错的消息数据条目。
SETNX命令包括key和value,调用所述SETNX命令时,将消息数据对应的UUID赋值给key,将当前时间赋值给value。SETNX命令具体为判断key在Redis中是否存在,若是则返回值为0,若否则返回值为1。
步骤2)中使用“分布式选举算法”保证数据可靠性。一份数据会同时写入多个Redis实例(N为奇数),只有当大于N/2个实例操作成功时,才算操作成功。比如N为3,只有当2个或者2个以上实例操作成功时,才算操作成功。多个Redis分别部署在不同的物理实体机上。此算法保证N/2个实例故障,以此来保证系统高可用性。
如取N为5,使用上述步骤解决Kafka重复消息的问题,具体的解决方案为:
由于N为5,因此N/2为2.5,则应使用3个实例。为每个消息都设置一个唯一的UUID。对3个Redis实例分别调用SETNX命令,命令Key为消息UUID,Value为当前时间。如果有2个或者2个以上命令调用返回0,则说明消息未被处理过,系统调用之后的业务逻辑处理代码;否则说明消息已经被处理过,无需执行业务逻辑处理代码。程序根据需求判断业务逻辑处理代码是否运行正常,如果业务逻辑代码处理出错(如调用某个接口失败等),调用Redis的DEL命令删除数据,允许系统对这条数据再次处理。
Claims (5)
1.一种基于Redis的Kafka消息唯一性方法,利用Redis解决Kafka中消息重复消费的问题,其特征在于,所述方法包括下列步骤:
1)接收一组消息数据;
2)采用分布式选举算法,对步骤1)接收的消息数据进行过滤;
3)分别对过滤后的每条消息数据进行业务逻辑处理;
4)判断步骤3)中的业务逻辑处理是否出错,若是,则进入步骤5),若否,则正常结束;
5)删除出错的消息数据条目。
2.根据权利要求1所述的基于Redis的Kafka消息唯一性方法,其特征在于,所述步骤2),采用分布式选举算法进行过滤具体为:
21)为接收到的每个消息数据设置对应的一个UUID;
22)将同一消息数据分别发送至N个Redis中;
23)对N个Redis中的同一消息数据分别调用SETNX命令,记m为大于N/2的最小整数;
24)判断是否有m或大于m个SETNX命令的返回值为0,若是,则过滤该消息数据,若否,则保留该消息数据。
3.根据权利要求2所述的基于Redis的Kafka消息唯一性方法,其特征在于,所述Redis的个数N为奇数。
4.根据权利要求2所述的基于Redis的Kafka消息唯一性方法,其特征在于,所述SETNX命令包括key和value,调用所述SETNX命令时,将消息数据对应的UUID赋值给key,将当前时间赋值给value。
5.根据权利要求4所述的基于Redis的Kafka消息唯一性方法,其特征在于,所述步骤23),调用SETNX命令后,判断key在Redis中是否已存在,若是,则返回值为0,若否,则返回值为1。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610492940.6A CN106170013B (zh) | 2016-06-29 | 2016-06-29 | 一种基于Redis的Kafka消息唯一性方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610492940.6A CN106170013B (zh) | 2016-06-29 | 2016-06-29 | 一种基于Redis的Kafka消息唯一性方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106170013A true CN106170013A (zh) | 2016-11-30 |
CN106170013B CN106170013B (zh) | 2019-06-07 |
Family
ID=58064613
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610492940.6A Active CN106170013B (zh) | 2016-06-29 | 2016-06-29 | 一种基于Redis的Kafka消息唯一性方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106170013B (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108322380A (zh) * | 2017-01-16 | 2018-07-24 | 上海掌门科技有限公司 | 调用数据的方法和装置以及推送信息的方法和装置 |
CN109493076A (zh) * | 2018-11-09 | 2019-03-19 | 武汉斗鱼网络科技有限公司 | 一种Kafka消息唯一消费方法、系统、服务器及存储介质 |
CN111949418A (zh) * | 2020-07-10 | 2020-11-17 | 北京思特奇信息技术股份有限公司 | 一种订阅消息处理方法和装置 |
CN112463403A (zh) * | 2020-11-10 | 2021-03-09 | 银盛支付服务股份有限公司 | 一种基于Redis分布式锁重复通知解决的方法 |
CN112698961A (zh) * | 2020-12-31 | 2021-04-23 | 银盛支付服务股份有限公司 | 一种redis分布式锁在kafka分布式程序中的使用方法 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7707585B2 (en) * | 2004-11-05 | 2010-04-27 | International Business Machines Corporation | Method, system, and program product for monitoring message flow in a message queuing system |
CN102668516A (zh) * | 2011-12-02 | 2012-09-12 | 华为技术有限公司 | 一种云消息服务中实现消息传递的方法和装置 |
CN102955717A (zh) * | 2012-11-05 | 2013-03-06 | 北京奇虎科技有限公司 | 在分布式消息处理系统中的消息管理设备和方法 |
CN104754036A (zh) * | 2015-03-06 | 2015-07-01 | 合一信息技术(北京)有限公司 | 一种基于kafka的消息处理系统及处理方法 |
CN105119810A (zh) * | 2015-08-06 | 2015-12-02 | 北京农信互联科技有限公司 | 一种基于xmpp协议的即时通讯方法及系统 |
CN105227662A (zh) * | 2015-09-30 | 2016-01-06 | 努比亚技术有限公司 | 消息处理方法、装置和系统 |
-
2016
- 2016-06-29 CN CN201610492940.6A patent/CN106170013B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7707585B2 (en) * | 2004-11-05 | 2010-04-27 | International Business Machines Corporation | Method, system, and program product for monitoring message flow in a message queuing system |
CN102668516A (zh) * | 2011-12-02 | 2012-09-12 | 华为技术有限公司 | 一种云消息服务中实现消息传递的方法和装置 |
CN102955717A (zh) * | 2012-11-05 | 2013-03-06 | 北京奇虎科技有限公司 | 在分布式消息处理系统中的消息管理设备和方法 |
CN104754036A (zh) * | 2015-03-06 | 2015-07-01 | 合一信息技术(北京)有限公司 | 一种基于kafka的消息处理系统及处理方法 |
CN105119810A (zh) * | 2015-08-06 | 2015-12-02 | 北京农信互联科技有限公司 | 一种基于xmpp协议的即时通讯方法及系统 |
CN105227662A (zh) * | 2015-09-30 | 2016-01-06 | 努比亚技术有限公司 | 消息处理方法、装置和系统 |
Non-Patent Citations (2)
Title |
---|
郭俊: "Kafka设计解析(二)- Kafka High Availability", 《技术世界》 * |
陈士玉: "合作网站数据资源接入系统的设计与实现", 《中国优秀硕士学位论文全文数据库》 * |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108322380A (zh) * | 2017-01-16 | 2018-07-24 | 上海掌门科技有限公司 | 调用数据的方法和装置以及推送信息的方法和装置 |
CN109493076A (zh) * | 2018-11-09 | 2019-03-19 | 武汉斗鱼网络科技有限公司 | 一种Kafka消息唯一消费方法、系统、服务器及存储介质 |
CN109493076B (zh) * | 2018-11-09 | 2022-06-17 | 武汉斗鱼网络科技有限公司 | 一种Kafka消息唯一消费方法、系统、服务器及存储介质 |
CN111949418A (zh) * | 2020-07-10 | 2020-11-17 | 北京思特奇信息技术股份有限公司 | 一种订阅消息处理方法和装置 |
CN111949418B (zh) * | 2020-07-10 | 2023-10-24 | 北京思特奇信息技术股份有限公司 | 一种订阅消息处理方法和装置 |
CN112463403A (zh) * | 2020-11-10 | 2021-03-09 | 银盛支付服务股份有限公司 | 一种基于Redis分布式锁重复通知解决的方法 |
CN112698961A (zh) * | 2020-12-31 | 2021-04-23 | 银盛支付服务股份有限公司 | 一种redis分布式锁在kafka分布式程序中的使用方法 |
Also Published As
Publication number | Publication date |
---|---|
CN106170013B (zh) | 2019-06-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106170013A (zh) | 一种基于Redis的Kafka消息唯一性方法 | |
KR20060079078A (ko) | 서버 큐잉 시스템 및 방법 | |
EP2921974A1 (en) | Data restoration method and system | |
CN103593257B (zh) | 一种数据备份方法及装置 | |
CN110188103A (zh) | 数据对账方法、装置、设备和存储介质 | |
CN111585913B (zh) | 基于回收令牌的服务流量限制方法及存储介质 | |
US20180121531A1 (en) | Data Updating Method, Device, and Related System | |
CN103503388B (zh) | 一种分布式队列消息读取方法及设备、系统 | |
CN113282580A (zh) | 用于执行定时任务的方法、存储介质及服务器 | |
CN106250229A (zh) | 事件处理的方法及装置 | |
CN108733477B (zh) | 数据集群化处理的方法、装置及设备 | |
CN112860412A (zh) | 业务数据处理方法、装置、电子设备及存储介质 | |
CN105573867A (zh) | 一种MySQL高可用性的实现方法及系统 | |
CN110764705B (zh) | 一种数据的读写方法、装置、设备和存储介质 | |
CN104021033A (zh) | 一种繁忙处理节点的散列方法和系统 | |
CN116451210A (zh) | 权限回收方法、装置、设备及存储介质 | |
CN110535758A (zh) | 一种邮件处理方法及装置 | |
CN111338842A (zh) | 文件备份方法及装置 | |
CN111767299A (zh) | 数据库操作方法、装置、系统、存储介质及电子设备 | |
CN113656374A (zh) | 带有附件的业务报文的处理方法及装置 | |
CN106097104A (zh) | 一种判断分布式系统下互联网数据完整性的方法和系统 | |
CN112231290A (zh) | 一种本地日志的处理方法、装置、设备及存储介质 | |
CN105511813A (zh) | 访问服务器磁盘的方法、装置及系统 | |
CN114900531B (zh) | 数据同步方法、装置和系统 | |
CN115866017B (zh) | 消息处理方法、装置、通信设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |