CN106170013B - 一种基于Redis的Kafka消息唯一性方法 - Google Patents

一种基于Redis的Kafka消息唯一性方法 Download PDF

Info

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
Application number
CN201610492940.6A
Other languages
English (en)
Other versions
CN106170013A (zh
Inventor
马自谦
范桢
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Shanghai Pudong Development Bank Co Ltd Credit Card Center
Original Assignee
Shanghai Pudong Development Bank Co Ltd Credit Card Center
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Shanghai Pudong Development Bank Co Ltd Credit Card Center filed Critical Shanghai Pudong Development Bank Co Ltd Credit Card Center
Priority to CN201610492940.6A priority Critical patent/CN106170013B/zh
Publication of CN106170013A publication Critical patent/CN106170013A/zh
Application granted granted Critical
Publication of CN106170013B publication Critical patent/CN106170013B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L67/00Network arrangements or protocols for supporting network services or applications
    • H04L67/01Protocols
    • H04L67/10Protocols 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消息唯一性方法
技术领域
本发明涉及分布式消息发布-订阅***,尤其是涉及一种基于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为奇数。
CN201610492940.6A 2016-06-29 2016-06-29 一种基于Redis的Kafka消息唯一性方法 Active CN106170013B (zh)

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)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
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 努比亚技术有限公司 消息处理方法、装置和***

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