CN108769099B - 一种消息中间件的消息去重的实现方法 - Google Patents
一种消息中间件的消息去重的实现方法 Download PDFInfo
- Publication number
- CN108769099B CN108769099B CN201810288150.5A CN201810288150A CN108769099B CN 108769099 B CN108769099 B CN 108769099B CN 201810288150 A CN201810288150 A CN 201810288150A CN 108769099 B CN108769099 B CN 108769099B
- Authority
- CN
- China
- Prior art keywords
- message
- middleware
- consumer
- redis
- queue
- 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
Images
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/02—Protocols based on web technology, e.g. hypertext transfer protocol [HTTP]
-
- 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
-
- 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
- H04L67/104—Peer-to-peer [P2P] networks
- H04L67/1074—Peer-to-peer [P2P] networks for supporting data block transmission mechanisms
- H04L67/1078—Resource delivery mechanisms
-
- 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/50—Network services
- H04L67/55—Push-based network services
Landscapes
- Engineering & Computer Science (AREA)
- Computer Networks & Wireless Communication (AREA)
- Signal Processing (AREA)
- Information Transfer Between Computers (AREA)
Abstract
一种消息中间件的消息去重的实现方法,所述方法包括:采用Redis的列表结构作为消息中间件的消息队列;创建生产者***和消费者***的订阅模型;采用Redis的集合存放已存在消息的标识,当消息中间件收到新消息时,根据消息的主题,在对应的集合中查询该消息的标识是否已存在,若存在则忽略所述消息,若不存在则将所述消息追加入所述消息队列中。
Description
技术领域
本发明涉及消息处理技术领域,更具体地,涉及一种消息中间件的消息去重的实现方法。
背景技术
消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式***的集成,通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。
在生产者消费者场景中,消息中间件的三大要素为:生产者、消息、消费者。其中生产者生产消息,并将消息通过消息中间件发送给消息中间件去消费。消息中间件作为消息的中间方,负责维护消费者的主题订阅关系,同时负责接受消息生产方发来的消息,并根据消息主题向消费者推送消息。传统的消息中间件如Kafka等,在某些需求场景下,并不能很好的满足***需求。比如消息去重的场景,这种场景下消费方不希望重复消费同样的消息。
Redis是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的应用程序编程接口(API)。Redis支持存储的数值类型很多,包括字符串(string)、列表(list)、集合(set)、有序集合(zset)和哈希类型(hash)。Redis也可以作为消息中间件,然而,现有技术中并没有基于Redis的具有消息去重功能的消息中间件。
发明内容
针对上述问题中的至少一个,根据本发明的一个方面,本发明提供了一种消息中间件的消息去重的实现方法,所述方法包括:
采用Redis的列表结构作为消息中间件的消息队列;
创建生产者***和消费者***的订阅模型;
采用Redis的集合存放已存在消息的标识(id),当消息中间件收到新消息时,根据消息的主题,在对应的集合中查询该消息的标识(id)是否已存在,若存在则忽略所述消息,若不存在则将所述消息追加入所述消息队列中。
其中,所述消息中间件以超文本传输协议(HTTP)服务为载体,消费者和生产者通过调用所述消息中间件的应用程序编程接口(API)进行消息的发送和获取。
其中,消费者通过调用所述消息中间件的应用程序编程接口(API)来向所述消息中间件注册订阅关系。
在一些实施例中,所述订阅模型的属性包括:
消费者的接受订阅消息地址;
消费者可接受的消息报文结构;
消费者订阅的主题;
消费失败的处理策略。
在一些实施例中,所述消息中间件收到消息后,扫描Redis消息队列,根据所述订阅模型,取出消费者订阅的主题对应的消息,并根据消费者可接受的消息报文结构对发送报文进行处理。
在一些实施例中,所述消息中间件对发送报文进行处理后,尝试调用消费者接受消息的应用程序编程接口(API),若消费成功,则将消息推送给消费者;若消费失败,则根据配置的消费失败的处理策略进行处理。
在一些实施例中,所述订阅模型的属性还包括:消息是否去重推送;若设定为消息去重推送,则根据所述消息去重机制对消息进行去重处理。
其中,将消息追加入所述消息队列中时,将消息加入所述消息队列的最左端。所述消息中间件取出消息推送给消费者时,从所述消息队列最右端弹出消息。
本发明另一方面提供了一种根据如前所述的方法实现消息去重的消息中间件。
基于上述技术方案可知,本发明取得了如下有益效果中的至少一个:
本发明提出的一种消息中间件的消息去重的实现方法,使得消息能够高效、精准的在消息中间件侧进行消息去重,减轻了消费者***的计算压力,也使消息中间件的各个职能***职责更明确,交互效率更高。
附图说明
图1为根据本发明的一个实施例的消息中间件的消息去重的工作流程图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将对本发明的技术方案进行清楚、完整地描述。显然,所描述的实施例是本发明的一部分实施例,而不是全部的实施例。基于所描述的本发明的实施例,本领域普通技术人员在无需创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。
除非另外定义,本发明使用的技术术语或者科学术语应当为本发明所属领域内具有一般技能的人士所理解的通常意义。
根据本发明的一方面,提供了一种消息中间件的消息去重的实现方法,所述方法包括:
采用Redis的列表(List)结构作为消息中间件的消息队列;
创建生产者***和消费者***的订阅模型;
采用Redis的集合(Set)存放已存在消息的标识(id),当消息中间件收到新消息时,根据消息的主题,在对应的集合中查询该消息的标识(id)是否已存在,若存在则忽略这条消息,若不存在则将消息追加入消息队列中。其中,将消息追加入消息队列中时,将消息加入消息队列的最左端。消息中间件取出消息推送给消费者时,从消息队列的最右端弹出消息。
其中,消息中间件以超文本传输协议(HTTP)服务为载体,消费者和生产者通过调用消息中间件的应用程序编程接口(API)进行消息的发送和获取。消费者通过调用消息中间件的应用程序编程接口(API)来向消息中间件注册订阅关系。
在一些实施例中,订阅模型的属性包括:
消费者的接受订阅消息地址;
消费者可接受的消息报文结构;
消费者订阅的主题;
消费失败的处理策略。
在一些实施例中,消息中间件收到消息后,扫描Redis消息队列,根据订阅模型,取出消费者订阅的主题对应的消息,并根据消费者可接受的消息报文结构对发送报文进行处理。
在一些实施例中,消息中间件对发送报文进行处理后,尝试调用消费者接受消息的应用程序编程接口(API),若消费成功,则将消息推送给消费者;若消费失败,则根据配置的消费失败的处理策略进行处理。
在一些实施例中,订阅模型的属性还包括:消息是否去重推送;若设定为消息去重推送,则根据消息去重机制对消息进行去重处理。
本发明另一方面提供了一种根据如前所述的方法实现的消息中间件。
下面结合附图对本发明的一个具体实施例做进一步的详细描述。图1为根据本发明的一个实施例的消息中间件的消息去重的工作流程图,其具体步骤如下。
S1,消费者向消息中间件注册订阅关系。
本实施例中,消息中间件基于Redis数据库,采用Redis的列表(List)结构充当消息队列。本实施例中的消息中间件以超文本传输协议(HTTP)服务为载体,消费者通过调用消息中间件的应用程序编程接口(API)来向消息中间件注册订阅关系。
因Redis具有卓越的性能和便易的客户端应用程序编程接口(API),消费者和生产者可以灵活地调用消息中间件的应用程序编程接口(API)进行消息的发送和获取。
本实施例中,生产者***和消费者***的订阅模型包括以下属性:
(1)消费者的接受订阅消息地址;
(2)消费者可接受的消息报文结构;
(3)消费者订阅的主题;
(4)消费失败的处理策略;
(5)消息是否去重推送。
本实施例中,上述订阅模型中的(5)设定为消息去重推送,后续步骤中将根据消息去重机制对消息进行去重处理。
S2、生产者将消息发送给消息中间件。
本实施例中,生产者将消息发送给消息中间件后,消息中间件根据上述的订阅模型进行处理,以下为去重处理以外的处理方式。
本实施例中,消息中间件根据收到的消息,扫描Redis消息队列,根据上述订阅模型中的(3),取出消费者订阅的主题对应的消息;并根据上述订阅模型中的(2),将发送报文处理为消费者可接受的消息报文结构。接着根据上述订阅模型中的(1),尝试调用消费者接受消息的应用程序编程接口(API),若消费成功,则本次消息推送成功;若消费失败,则根据上述订阅模型中的(4),即消费失败的处理策略来处理。例如,消费失败的处理策略可以为不处理或者消息重发。
S3、消息中间件去Redis的集合(Set)中进行查重。
本实施例中,消息查重的原理是同样的消息都有唯一的标识(id),每个消息队列的键(key)都对应一个集合,采用Redis的集合(Set)数据结构存放已存在消息的标识(id),当消息中间件收到新消息时,根据消息的主题,在该主题对应的集合(Set)中查询该消息的标识(id)是否已存在,若已存在则转入步骤S4a,否则转入步骤S4b。
本实施例中,采用Redis的SISMEMBER命令进行查重,如:
SISMEMBER key val
该命令的作用是查询值val是否为集合中的一员,如果是返回1,否则返回0。
本实施例中采用Redis的集合(Set)数据结构对消息标识(id)进行保存,Redis的集合(Set)结构的SISMEMBER命令的时间复杂度是O(1),因此无论这个集合(Set)中有多少个元素,查重操作总是一个基本操作,使得消息能够高效、精准的在消息中间件侧进行消息去重,减轻了消费者***的计算压力,也使消息中间件的各个职能***职责更明确,交互效率更高。
S4a、中间件不对消息进行处理。
即不将重复的消息发送给消费者,完成消息的去重。
S4b、将消息队列加入Redis中。
本实施例中,消息采用LPUSH命令加入队列的最左端,如:
LPUSH key val
S5b、消息中间件将消息推送给消费者,完成消息的去重推送。
本实施例中,消息中间件取出消息推送给消费者的时,采用RPOP命令从队列最右端弹出消息,如:
RPOP key
本实施例中,利用了Redis队列的先入先出(FIFO)特性,可以保障消息的消费顺序和生产顺序一致。
以上所述的具体实施例,对本发明的目的、技术方案和有益效果进行了进一步详细说明,应理解的是,以上所述仅为本发明的具体实施例而已,并不用于限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (9)
1.一种消息中间件的消息去重的实现方法,所述方法包括:
消息中间件基于Redis数据库,采用Redis的列表结构作为所述消息中间件的消息队列;其中,所述消息中间件以超文本传输协议服务为载体,消费者和生产者通过调用所述消息中间件的应用程序编程接口进行消息的发送和获取;
创建生产者***和消费者***的订阅模型;
采用Redis的集合存放已存在消息的标识,当消息中间件收到新消息时,根据消息的主题,在对应的集合中查询该消息的标识是否已存在,若存在则忽略所述消息,若不存在则将所述消息追加入所述消息队列中。
2.根据权利要求1所述的方法,其中,消费者通过调用所述消息中间件的应用程序编程接口来向所述消息中间件注册订阅关系。
3.根据权利要求1所述的方法,其中,所述订阅模型的属性包括:
消费者的接受订阅消息地址;
消费者可接受的消息报文结构;
消费者订阅的主题;
消费失败的处理策略。
4.根据权利要求3所述的方法,还包括,所述消息中间件收到消息后,扫描Redis消息队列,根据所述订阅模型,取出消费者订阅的主题对应的消息,并根据消费者可接受的消息报文结构对发送报文进行处理。
5.根据权利要求4所述的方法,还包括,所述消息中间件对发送报文进行处理后,尝试调用消费者接受消息的应用程序编程接口,若消费成功,则将消息推送给消费者;若消费失败,则根据配置的消费失败的处理策略进行处理。
6.根据权利要求3所述的方法,所述订阅模型的属性还包括:消息是否去重推送;若设定为消息去重推送,则根据所述方法对消息进行去重处理。
7.根据权利要求1所述的方法,将消息追加入所述消息队列中时,将消息加入所述消息队列的最左端。
8.根据权利要求1所述的方法,所述消息中间件取出消息推送给消费者时,从所述消息队列的最右端弹出消息。
9.一种根据权利要求1-8中任一项所述的方法实现消息去重的消息中间件。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810288150.5A CN108769099B (zh) | 2018-04-02 | 2018-04-02 | 一种消息中间件的消息去重的实现方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810288150.5A CN108769099B (zh) | 2018-04-02 | 2018-04-02 | 一种消息中间件的消息去重的实现方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108769099A CN108769099A (zh) | 2018-11-06 |
CN108769099B true CN108769099B (zh) | 2021-09-07 |
Family
ID=63980793
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810288150.5A Active CN108769099B (zh) | 2018-04-02 | 2018-04-02 | 一种消息中间件的消息去重的实现方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108769099B (zh) |
Families Citing this family (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109445965B (zh) * | 2018-11-07 | 2021-06-22 | 北京明朝万达科技股份有限公司 | 由Redis和MySQL实现的消息处理方法和设备 |
CN110225118A (zh) * | 2019-06-13 | 2019-09-10 | 浪潮软件股份有限公司 | 实现消息一次送达的消息中间件辅助***及消息传送*** |
CN110232054B (zh) * | 2019-06-19 | 2021-07-20 | 北京百度网讯科技有限公司 | 日志传输***及流式日志传输方法 |
CN110572461A (zh) * | 2019-09-11 | 2019-12-13 | 宝付网络科技(上海)有限公司 | 一种基于生产与消费模式的中间服务*** |
CN110505315A (zh) * | 2019-09-27 | 2019-11-26 | 北京锐安科技有限公司 | 数据处理方法、装置、设备及存储介质 |
CN113220981A (zh) * | 2020-02-06 | 2021-08-06 | 北京沃东天骏信息技术有限公司 | 一种优化缓存的方法和装置 |
CN113542314B (zh) * | 2020-04-13 | 2022-07-08 | 烽火通信科技股份有限公司 | 一种基于关键字过滤的订阅模式实现方法及*** |
CN112463403A (zh) * | 2020-11-10 | 2021-03-09 | 银盛支付服务股份有限公司 | 一种基于Redis分布式锁重复通知解决的方法 |
CN112637046A (zh) * | 2020-12-18 | 2021-04-09 | 北京房天下嘉居网络技术有限公司 | 消息推送方法及路由装置 |
CN112597249B (zh) * | 2020-12-26 | 2023-06-20 | 湖南快乐阳光互动娱乐传媒有限公司 | 一种业务数据的同步分发存储方法及*** |
CN113360487A (zh) * | 2021-06-03 | 2021-09-07 | 上海微盟企业发展有限公司 | 一种消息去重方法及相关装置 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104463259A (zh) * | 2013-09-22 | 2015-03-25 | 何阳 | 基于rfid中间件的图书馆管理*** |
WO2015162225A1 (fr) * | 2014-04-23 | 2015-10-29 | Bouygues Telecom | Procédés d'échange de données avec un équipement comprenant des moyens de communication radio |
CN106293968A (zh) * | 2016-08-04 | 2017-01-04 | 华中科技大学 | 一种基于Kafka消息中间件的双向通信***及方法 |
CN107026917A (zh) * | 2017-06-16 | 2017-08-08 | 智者四海(北京)技术有限公司 | 用于消息推送的方法及*** |
CN108965355A (zh) * | 2017-05-18 | 2018-12-07 | 北京京东尚科信息技术有限公司 | 用于数据传输的方法、装置及计算机可读存储介质 |
-
2018
- 2018-04-02 CN CN201810288150.5A patent/CN108769099B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104463259A (zh) * | 2013-09-22 | 2015-03-25 | 何阳 | 基于rfid中间件的图书馆管理*** |
WO2015162225A1 (fr) * | 2014-04-23 | 2015-10-29 | Bouygues Telecom | Procédés d'échange de données avec un équipement comprenant des moyens de communication radio |
CN106293968A (zh) * | 2016-08-04 | 2017-01-04 | 华中科技大学 | 一种基于Kafka消息中间件的双向通信***及方法 |
CN108965355A (zh) * | 2017-05-18 | 2018-12-07 | 北京京东尚科信息技术有限公司 | 用于数据传输的方法、装置及计算机可读存储介质 |
CN107026917A (zh) * | 2017-06-16 | 2017-08-08 | 智者四海(北京)技术有限公司 | 用于消息推送的方法及*** |
Also Published As
Publication number | Publication date |
---|---|
CN108769099A (zh) | 2018-11-06 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108769099B (zh) | 一种消息中间件的消息去重的实现方法 | |
CA2451875C (en) | System and method for improved client server communications of email messages | |
AU2003268734B2 (en) | System and method for improved synchronization between a server and a client | |
CA2452527C (en) | Method for streaming data between a server and a client | |
US8984530B2 (en) | Queued message dispatch | |
US9294307B2 (en) | Synchronization of conversation data | |
US10579595B2 (en) | Method and device for calling a distributed file system | |
US10122665B2 (en) | Distributed synchronization data in a message management service | |
US20180253458A1 (en) | Synergizing real-time and polling connectors for data ingestion | |
US9246859B2 (en) | Peer-to-peer collaboration of publishers in a publish-subscription environment | |
US9674127B2 (en) | Selective message republishing to subscriber subsets in a publish-subscribe model | |
CN112882842A (zh) | 一种基于redis存储作为消息中间件的数据传输方法 | |
US8874675B2 (en) | Message thread management using dynamic pointers | |
CN108255621A (zh) | 一种基于binlog的MySQL增量消息解析方法 | |
CN111641700A (zh) | 基于Ceph对象存储元数据的管理及检索的实现方法 | |
CN111416823A (zh) | 一种数据传输方法和装置 | |
CN114090288A (zh) | 一种数据推送方法及装置 | |
CN113783913A (zh) | 一种消息推送管理方法和装置 | |
CN116633874A (zh) | 基于阻塞队列的消息处理方法、装置、设备及存储介质 | |
CN114827171B (zh) | 信息同步方法、装置、计算机设备和存储介质 | |
CN107040455B (zh) | 一种基于redis的即时消息通讯方法和*** | |
CN114265638B (zh) | 基于插件兼容的通信方法、装置、设备及存储介质 | |
US8266312B2 (en) | Method of streaming size-constrained valid XML | |
EP2963548B1 (en) | Method for enhancing the reliability of a telecommunications network, system, telecommunications network and program | |
US20170346753A1 (en) | Method and device for forwarding data messages |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |