CN106170013B - 一种基于Redis的Kafka消息唯一性方法 - Google Patents
一种基于Redis的Kafka消息唯一性方法 Download PDFInfo
- Publication number
- CN106170013B CN106170013B CN201610492940.6A CN201610492940A CN106170013B CN 106170013 B CN106170013 B CN 106170013B CN 201610492940 A CN201610492940 A CN 201610492940A CN 106170013 B CN106170013 B CN 106170013B
- Authority
- CN
- China
- Prior art keywords
- redis
- message data
- message
- kafka
- filtered
- 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.)
- Active
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 (2)
1.一种基于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,若是,则过滤该消息数据,若否,则保留该消息数据;
所述SETNX命令包括key和value,调用所述SETNX命令时,将消息数据对应的UUID赋值给key,将当前时间赋值给value;
所述步骤23),调用SETNX命令后,判断key在Redis中是否已存在,若是,则返回值为0,若否,则返回值为1。
2.根据权利要求1所述的基于Redis的Kafka消息唯一性方法,其特征在于,所述Redis的个数N为奇数。
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 CN106170013A (zh) | 2016-11-30 |
CN106170013B true 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) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108322380B (zh) * | 2017-01-16 | 2021-07-30 | 上海掌门科技有限公司 | 调用数据的方法和装置以及推送信息的方法和装置 |
CN109493076B (zh) * | 2018-11-09 | 2022-06-17 | 武汉斗鱼网络科技有限公司 | 一种Kafka消息唯一消费方法、***、服务器及存储介质 |
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分布式程序中的使用方法 |
Family Cites Families (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 |
CN102668516B (zh) * | 2011-12-02 | 2014-09-17 | 华为技术有限公司 | 一种云消息服务中实现消息传递的方法和装置 |
CN102955717B (zh) * | 2012-11-05 | 2015-05-20 | 北京奇虎科技有限公司 | 在分布式消息处理***中的消息管理设备和方法 |
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
Also Published As
Publication number | Publication date |
---|---|
CN106170013A (zh) | 2016-11-30 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106170013B (zh) | 一种基于Redis的Kafka消息唯一性方法 | |
CN112650576B (zh) | 资源调度方法、装置、设备、存储介质及计算机程序产品 | |
CN111756601B (zh) | 微服务架构监控方法、装置、计算机设备及可读存储介质 | |
CN103593257B (zh) | 一种数据备份方法及装置 | |
CN110231995B (zh) | 一种基于Actor模型的任务调度方法、装置及存储介质 | |
KR20060079078A (ko) | 서버 큐잉 시스템 및 방법 | |
CN101236515B (zh) | 多核***单核异常的恢复方法 | |
CN107508694B (zh) | 一种集群内的节点管理方法及节点设备 | |
US20180121531A1 (en) | Data Updating Method, Device, and Related System | |
CN108089915A (zh) | 基于消息队列的业务控件化处理的方法及*** | |
CN107239325B (zh) | 单证数据处理方法和装置 | |
CN103503388B (zh) | 一种分布式队列消息读取方法及设备、*** | |
EP2776941B1 (en) | Managing capacity in a data center by suspending tenants | |
CN105573867A (zh) | 一种MySQL高可用性的实现方法及*** | |
CN111737063B (zh) | 双控脑裂的磁盘锁仲裁方法、装置、设备及介质 | |
TWI774060B (zh) | 用於階層式系統之故障排除之裝置、方法及電腦程式產品 | |
CN113901047A (zh) | 一种基于内存数据库的简便集群主从选举方法 | |
CN111367934B (zh) | 数据一致性的检验方法、装置、服务器和介质 | |
CN106502825B (zh) | 数据处理方法及装置 | |
CN116680055A (zh) | 一种异步任务处理方法、装置、计算机设备及存储介质 | |
CN107908370B (zh) | 数据存储方法及装置 | |
CN110535758A (zh) | 一种邮件处理方法及装置 | |
CN115454958A (zh) | 基于人工智能的数据处理方法、装置、设备、***及介质 | |
CN111767299A (zh) | 数据库操作方法、装置、***、存储介质及电子设备 | |
CN105991608B (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 |