CN116866427B - 一种异构消息统一推送方法及系统 - Google Patents

一种异构消息统一推送方法及系统 Download PDF

Info

Publication number
CN116866427B
CN116866427B CN202311126803.7A CN202311126803A CN116866427B CN 116866427 B CN116866427 B CN 116866427B CN 202311126803 A CN202311126803 A CN 202311126803A CN 116866427 B CN116866427 B CN 116866427B
Authority
CN
China
Prior art keywords
message
task
configuration
channel
sending
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
CN202311126803.7A
Other languages
English (en)
Other versions
CN116866427A (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.)
Hangzhou Bizhi Technology Co ltd
Original Assignee
Hangzhou Bizhi Technology Co ltd
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 Hangzhou Bizhi Technology Co ltd filed Critical Hangzhou Bizhi Technology Co ltd
Priority to CN202311126803.7A priority Critical patent/CN116866427B/zh
Publication of CN116866427A publication Critical patent/CN116866427A/zh
Application granted granted Critical
Publication of CN116866427B publication Critical patent/CN116866427B/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/50Network services
    • H04L67/55Push-based network services
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L67/00Network arrangements or protocols for supporting network services or applications
    • H04L67/50Network services
    • H04L67/56Provisioning of proxy services
    • H04L67/565Conversion or adaptation of application format or content

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Networks & Wireless Communication (AREA)
  • Signal Processing (AREA)
  • Information Transfer Between Computers (AREA)

Abstract

本发明公开了一种异构消息统一推送方法及系统,包括:步骤S1:消息相关配置;包括消息渠道配置、消息模版配置和消息任务配置;其中,所述消息渠道配置用于配置渠道发送消息需要的服务端相关配置;所述消息模版配置为配置消息标题和内容;所述消息任务配置用于将一次发送创建为任务,实现任务的复用;步骤S2:发送消息;发送前对消息进行去重、幂、处理和限流处理;步骤S3:存储消息发送记录;记录一次消息发送的参数信息和记录消息发送的结果;步骤S4:异步消息回调处理;采用主动推送的方式将结果通知请求方。本发明通过统一推送系统,可以确保用户接收到一致的消息内容和格式,实现精确的消息投递,提高了消息推送的效率。

Description

一种异构消息统一推送方法及系统
技术领域
本发明涉及计算机软件及数据处理技术领域,尤其是涉及一种异构消息统一推送方法及系统。
背景技术
消息推送主要用于发送通知到用户,例如营销短信投放,验证码接收,服务异常通知,运维告警平台等。本发明提供了一种可以接入多种异构消息渠道的架构设计,例如邮件、短信、电话、钉钉群消息等。由于每种消息渠道接入方式不同,设计一种可扩展,可统一接口发送消息的架构尤为重要。该架构采用适配器模式,责任链模式等设计模式,保证代码符合开闭原则、单一职责、依赖倒置原则。
已有消息推送系统中,代码分散在各个业务系统中,没有专门的消息分发平台,消息推送、分发和业务严重耦合,消息量大时,严重影响业务功能。对比已有的消息推送系统,本发明有以下优势。
一、可扩展性,推送系统需要支持大规模的用户和消息量。为了实现可扩展性,采用了将系统拆分为多个独立的服务和组件,通过水平扩展来处理高流量和大量的并发请求。
二、支持消息推送策略,推送系统具备灵活的消息推送策略。可以根据用户的偏好、定时策略、消息优先级等信息,智能地选择推送方式和时机。
三、实时可靠性,消息推送系统能够以实时或接近实时的方式将消息发送给用户。通过使用高性能的消息队列、高性能内存队列技术,实现了消息的快速传递和即时性响应,确保用户能够及时收到消息。
四、连接消息发送上下游,掌控消息整个生命周期。统一入口,可记录消息的整个链路,当消息发送失败时,可对失败的消息进行补偿发送。
发明内容
针对现有技术存在的问题,本发明的目的在于提供一种异构消息统一推送方法和系统,根据用户定义的推送策略和限流规则,实现了异构消息批量推送、定时推送,使得消息推送过程不影响主流程功能并且易于接入新消息渠道。
为实现上述目的,本发明提供一种异构消息统一推送方法,所述方法包括下列步骤:
步骤S1:消息相关配置;包括消息渠道配置、消息模版配置、消息任务配置;
步骤S2:发送消息;发送前对消息进行去重、幂、处理和限流处理;
步骤S3:存储消息发送记录;记录一次消息发送的参数信息和记录消息发送的结果;
步骤S4:异步消息回调处理;采用主动推送的方式将结果通知请求方。
进一步,步骤S1中,消息渠道配置为配置该渠道发送消息需要的服务端相关配置;
消息模版配置为配置消息标题和内容,支持变量配置,发送消息时,输入消息变量对应变量名称和变量值;
定时推送配置为配置何时发送消息,并根据配置生成推送任务;
限流配置包括按照用户数和发送数量进行限流。
进一步,步骤S1中,使用消息模版code标识唯一模版并提供给业务方使用;消息内容支持的格式包括XML和Markdown。
进一步,步骤S1中,定时推送配置支持Cron表达式;配置了定时发送后,会创建对应的任务,到定时时间后,执行发送消息。
进一步,步骤S2中,发送消息时,首先选择渠道,可以输入渠道code,也可以仅输入渠道类型,系统将按流量自动选择渠道发送消息;然后输入消息容,可直接使用消息模版code,也使可直接输入消息内容和标题;最后输入接收人,接收人可按照业务方需求,增加导入人群功能,并设置人群分组,可实现按照分组发送消息。
进一步,步骤S4中,异步消息回调处理支持两种方式,一种是RPC接口调用,另一种是HTTP接口,直接调用相应的HTTP Url和参数发送请求。
进一步,步骤S2中,其中S1步骤定时发送的具体实现步骤包括如下流程:
步骤S2.1:引入依赖;定时任务使用Quartz框架完成,因此需要Quartz相关依赖。
SpringBoot引入以下依赖
<dependency>
<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
非SpringBoot项目引入Quartz核心包和工具包;
步骤S2.2:添加配置信息;
默认情况下,Quartz用内存记录定时任务信息,应用重新启动后,定时任务信息将会丢失,为任务增加数据库配置信息;
按照Quartz 官方文档,在quartz.properties中增加数据库存储相关配置,并执行数据库初始化脚本;
步骤S2.3:创建保存任务的数据库表,记为任务表;用于存储任务相关参数信息;
步骤S2.4:编写代码。
另一方面,本发明提供一种异构消息统一推送系统,所述系统中执行根据本发明所述的异构消息统一推送方法。
进一步,所述系统包括访问层、调度层、异步处理层、消息推送层和ORM层;系统层次划分清晰,方便水平扩展,高并发场景下,可按照实际使用进行多节点部署。其中
最上层为访问层,业务可以直接调用RESTful API,也可以使用代码自动生成的SDK;
然后,为调度层,用于创建定时发送的任务,实现定时发送的功能;亦可根据消息模版分级,优先调度;
其次,为异步处理层;用于实现消息的异步推送功能;使用消息中间件实现异步功能,或使用EventBus或Disruptor工具完成异步事件驱动功能;
接着,为消息推送层,通过引入线程池提高发送消息的并发度;同时消息到达时,对消息进行分组、去重和消息限流。
最后,为ORM层,本发明使用MyBatis作为ORM框架,实现将数据库和对象之间进行映射。
进一步,数据库业务表包含以下表:消息渠道表:tbl_message_channel,消息模版表:tbl_message_template,消息发送实例:tbl_message_instance,消息任务表:tbl_message_task,消息回调记录表:tbl_message_callback_record,消息发送记录表:tbl_message_record。
本发明有益效果如下:
统一管理:多种消息统一推送系统可以集中管理不同类型的消息,无论是短信、邮件、推送通知还是即时消息,都可以在同一个系统中进行管理和配置。这样可以减少管理成本,简化运维工作。通过统一推送系统,可以确保用户接收到一致的消息内容和格式,这有助于增加用户满意度。
精确的消息投递:消息推送系统能够以实时或接近实时的方式将消息发送给用户。消息发送失败时,增加消息补偿发送机制,减少消息丢失带来的负面影响。
多渠道覆盖:通过多种异构消息统一推送系统,可以覆盖多个渠道,包括短信、邮件、钉钉群通知、飞书消息等。这样可以确保消息能够通过用户常用的通信方式进行传达,提高消息的可达性和曝光率。
提高效率:使用统一推送系统可以提高消息的发送效率和效果。系统集成了批量发送、定时发送、消息免打扰、消息限流,账单统计等功能,提高了发送速度和效率;同时,通过对发送结果的监控和反馈,可以及时调整推送策略,优化消息的传递效果。
简化开发和集成:统一推送系统可以提供统一的接口和SDK,简化消息推送功能的开发和集成过程。开发人员可以直接使用统一的接口来实现消息推送,无需针对每个消息类型进行单独开发和集成。该架构设计提高了代码高内聚,低耦合。该架构使告警和其他模块分离,保证了消息推送不会影响正常业务需求。代码可扩展,中间件根据业务场景选用。通过配置选择是否使用某个中间件,保证了代码的灵活性。
总的来说,多种异构消息统一推送系统可以提供一致的用户体验,精确的消息投递,简单高效,多渠道覆盖,提高了消息推送的效率,同时提高了营销和通讯的效果。消息推送系统从业务系统拆离后,更有利于服务的水平扩展,它优秀的架构设计极大地简化了开发过程。
附图说明
图1示出了根据本发明的异构消息统一推送方法流程图;
图2示出了根据本发明的异构消息统一推送系统架构图。
具体实施方式
下面将结合附图,对本发明的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
在本发明的描述中,需要说明的是,术语“中心”、“上”、“下”、“左”、“右”、“竖直”、“水平”、“内”、“外”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。此外,术语“第一”、“第二”、“第三”仅用于描述目的,而不能理解为指示或暗示相对重要性。
在本发明的描述中,需要说明的是,除非另有明确的规定和限定,术语“安装”、“相连”、“连接”应做广义理解,例如,可以是固定连接,也可以是可拆卸连接,或一体地连接;可以是机械连接,也可以是电连接;可以是直接相连,也可以通过中间媒介间接相连,可以是两个元件内部的连通。对于本领域的普通技术人员而言,可以根据具体情况理解上述术语在本发明中的具体含义。
以下结合附图1-图2对本发明的具体实施方式进行详细说明。应当理解的是,此处所描述的具体实施方式仅用于说明和解释本发明,并不用于限制本发明。
本发明提供了一种统一的消息推送平台,根据用户定义的推送策略和限流规则,实现了消息批量推送、定时推送,同时可扩展实现推送报表和计费功能。
如图1所示,根据本发明的异构消息统一推送方法,包括下列步骤:
步骤S1:消息相关配置,包括消息渠道配置、消息模版配置、消息任务配置。现有技术中,消息渠道配置放到对应服务的配置中心(例如Nacos中),无法灵活变更,用户无法查看渠道配置情况。同时没有消息模版配置,消息内容散落在代码中,若想变更,则需要重新编译代码,重启服务。本发明中增加了消息任务配置,可以将一次发送创建为任务,实现任务的复用;任务中也可增加很多特殊配置,例如定时配置,限流配置等。
其中,消息渠道配置主要配置该渠道发送消息需要的服务端相关配置,例如发送邮件消息时,需要配置邮件服务器地址和端口等信息,使用消息渠道code标识唯一渠道并提供给业务方使用,同时本发明中增加限流配置,某个渠道根据。
消息模版配置主要配置消息标题和内容,支持变量配置,发送消息时,输入消息变量对应变量名称和变量值即可。使用消息模版code标识唯一模版并提供给业务方使用。消息内容支持多种格式,例如xml,markdown等。
消息任务配置,主要包括发送方式:直接发送或定时推送、消息渠道、消息模版、接收人、补偿发送机制:失败重启次数和间隔、限流配置。
其中,定时推送配置主要配置何时发送消息,目前支持cron表达式。配置了定时发送后,会创建Quartz对应的定时任务,到定时时间后,执行发送消息。
接收人配置为可选实现。主要包含接收人和分组,例如发送电话消息时,接收人为手机号。同时可按需实现从excel导入人群的功能,为人群添加分组属性。
限流配置可选择按照用户数和发送数量进行限流。
步骤S2:发送消息;
发送消息时,首先需要对消息进行去重,幂等处理,同时在前置处理中增加消息限流逻辑。前置处理使用时,可按需扩展。
然后传入渠道code,输入消息容:消息内容可直接使用消息模版code,也使可直接输入消息内容和标题,最后输入接收人,接收人可按照业务方需求,设计成可导入人群,并设置人群分组,可以按照分组进行发送消息。
步骤S3:消息发送信息记录;
发送消息时,需要记录一次消息发送的参数信息,存储到消息发送实例表:tbl_message_instance;发送消息后,需要记录消息发送的结果:成功或失败,存储到消息发送记录表:tbl_message_record。
步骤S4:异步消息回调处理;
异步发送后,需要将结果通知请求方,采用主动推送的方式。目前支持两种方式,一种时RPC接口调用,例如微服务中的Dubbo RPC接口;另一种是Http接口,直接调用相应的Http url和参数发送请求即可。
其中步骤S1的具体实现步骤包括如下流程:
步骤S1.1:引入依赖;定时任务使用Quartz框架实现,因此引入Quartz相关依赖包。
SpringBoot项目引入以下依赖
<dependency>
<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
非SpringBoot项目引入核心包和工具包。
<!-- 核心包 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
</dependency>
<!-- 工具包 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
</dependency>
步骤S1.2:添加配置信息;
默认情况下,Quartz用内存记录定时任务信息,应用重新启动后,定时任务信息将会丢失,因此需要为任务增加数据库配置信息;
按照Quartz 官方文档,在quartz.properties中增加数据库存储相关配置,并执行数据库初始化脚本;
步骤S1.3:创建保存任务的数据库表,记为任务表;用于存储任务相关参数信息;
步骤S1.4:编写代码,代码核心逻辑如下:
S1.4.1.任务入库,将任务配置信息保存到数据库的消息任务表:tbl_message_task。
S1.4.2.启动任务:启动任务时,需要设置调度触发时间,该时间是从消息任务配置的定时配置的cron表达式计算得出的,计算出每次任务的具体运行时间;同时任务失败重试时,也调用该步骤实现的方法;
具体包括:
S1.4.2.1.创建JobDetail实例,绑定Job实现类;关键点在于:若可以从Scheduler中获取到JobDetail实例则使用该实例,否则创建新的实例;
S1.4.2.2.指明Job的名称,所在组的名称,以及绑定Job类;
S1.4.2.3.定义调度触发规则,使用cronTrigger规则;调用该方法时,传入具体的任务触发时间;
S1.4.2.4.把作业和触发器注册到任务调度中;根据步骤S1.4.2.1,若为新的实例,则调用重新调度作业的接口:scheduler.rescheduleJob,若为已存在的作业,则调用作业调度接口:scheduler.scheduleJob。
S1.4.2.5.启动,更新启用状态;
S1.4.3.更新任务逻辑,具体如下:
S1.4.3.1.任务表中获取任务;
S1.4.3.2.通过任务唯一标识,删除Quartz中的任务,删除数据库中的任务,最后调用新建任务接口,重建任务。
S1.4.4.删除任务逻辑,具体如下:
S1.4.4.1.停用任务
a.调用quartz删除任务接口;
b.任务置为停用状态。
S1.4.4.2.删除任务表数据
S1.4.5.查询任务列表、获取任务详情。使用任务表的数据作为基础数据进行查询。
S1.4.6.启用/停用任务;
S1.4.6.1.启用使用创建任务中启动任务逻辑;
S1.4.6.2.停用使用删除任务中的停用逻辑。
以上代码为使用Quartz的核心方法:消息任务可在页面上实现任务启动、更新、删除、启用、禁用功能。
图2是根据本发明的异构消息统一推送系统架构图,包括访问层、调度层、异步处理层、消息推送层和ORM层;。其中各层及其关系如下:以上层级以访问的从上到下的顺序展开,访问层调用接口,调度层使用访问层保存的配置进行消息任务调度,消息任务下发后,异步处理层使用消息或事件驱动完成消息异步处理,异步操作引入线程池对消息进行并行发送,以上所有层级的数据通过ORM层存储到数据库中。该发明的关键在于:调度层和消息推送层可独立部署,实现高可用、高并发。
首先,最上层为访问层,业务可以直接调用RESTful API,也可以使用代码自动生成的SDK;
然后,为调度层,此处可以创建定时发送的任务,实现定时发送的功能,定时调度可使用Quartz,也可以选择其他调度框架,实现原理相同。
其次,为异步处理层。这里实现了消息的异步推送功能。使用消息中间件实现异步功能,或使用EventBus、Disruptor等工具完成异步事件驱动功能。通过使用Spring的@ConditionalOnProperty注解配置具体实现方式。
接着,为最关键的消息推送层:由于消息发送较为频繁,同时发送消息中较为耗时的是调用第三方接口进行发送,因此cpu占用时间较少,因此需要引入线程池对发送使用多线程进行处理。同时消息到达时,对消息进行去重,防止消息重复发送。支持了消息限流,可以根据发送数进行限流,也可以根据用户数进行限流。
其中,线程池具体实现流程如下:
步骤100:创建线程池
线程池的核心参数如下:核心线程数为jvm进程拥有的处理器数量,最大线程数为2倍的处理器数量,为防止内存溢出,队列为有界队列,长度为1000。
步骤200:线程池优雅关闭
首先将线程池注册到优雅关闭线程池的连接池中,服务停止时,对所有注册的线程池进行预处理,线程池中的任务在等待n秒后,停止运行。
此处的关键作用在于:异步消费消息时,服务发生异常,线程池中的任务可以正常完成,避免消息出现重复发送的场景。
步骤300:创建线程,并实现消息按照消息渠道进行分发;
创建具体在线程池中运行的线程,线程执行时,根据消息渠道分发至具体的消息处理器中;
其中消息去重逻辑如下:
异步消息重复发送场景:若消息中间件没有ack前,消息系统异常重启时,可能会重复消费。
本发明通过使用Kafka中间件,防止消息重复消费,具体实现如下:
Kafka 使用消息偏移量来标识每个消息在一个特定分区中的位置。消费者跟踪消费的消息的偏移量。消费者将偏移量存储在外部存储系统中(如数据库或磁盘文件),以便在发生重启或重试时,可以使用存储的偏移量来恢复消费进度。当消费者处理完一条消息后,将该消息的偏移量提交到 Kafka 的内部存储系统中。这样,即使消费者发生故障或重启,它可以使用已提交的偏移量按照之前的位置继续消费,避免重复消费。
同步消息消息重复发送场景:发送消息后,消息系统还没返回消息发送结果给调用方时,消息系统异常重启时,可能会重复消费。
本发明使用发送人+消息内容+消息标题+接收人标识消息的唯一性,使用滑动窗口实现三分钟内重复发送超出三次时,对消息进行去重。
本发明还基于redis中zset的滑动窗口去重,做到严格控制单位时间内的频次;并使用lua脚本来保证原子性和减少网络io的损耗,使用雪花算法生成zset的唯一value,score使用的是当前的时间戳。
具体lua脚本如下:
--KEYS[1]: 限流 key
--ARGV[1]: 限流窗口,毫秒
--ARGV[2]: 当前时间戳(作为score)
--ARGV[3]: 阈值
--ARGV[4]: score 对应的唯一value
-- 1\. 移除开始时间窗口之前的数据
redis.call('zremrangeByScore', KEYS[1], 0, ARGV[2]-ARGV[1])
-- 2\. 统计当前元素数量
local res = redis.call('zcard', KEYS[1])
-- 3\. 是否超过阈值
if (res == nil) or (res < tonumber(ARGV[3])) then
redis.call('zadd', KEYS[1], ARGV[2], ARGV[4])
redis.call('expire', KEYS[1], ARGV[1]/1000)
return 0
else
return 1
end
本发明使用消息任务配置中的限流配置,利用guava下的工具类RateLimiter进行限流。使用方式如下,
RateLimiter rateLimiter = RateLimiter.create(rateLimitConfig);
-- 发送数限流
rateLimiter.acquire(1);
-- 用户数限流
rateLimiter.acquire(taskInfo.getReceiver().size());
最后,为ORM层,本发明使用MyBatis作为ORM框架,实现将数据库和对象之间进行映射。
数据库业务表主要包含以下表:消息渠道表:tbl_message_channel,消息模版表:tbl_message_template,消息发送实例:tbl_message_instance,消息任务表tbl_message_task,消息回调记录表:tbl_message_callback_record,消息发送记录表:tbl_message_record
具体描述为如下:
消息渠道表:
用于存储消息渠道的信息,例如短信、邮件、推送通知等渠道。
可包含字段:渠道名称、渠道code、渠道类型等。
消息模版表:关键在于消息中使用${}进行变量设置,发送消息时替换${}变量内容。
用于存储消息模板的信息,模板包含了消息内容的结构和变量。
可包含字段:模板标题、模板名称、模板内容、创建时间等。
消息发送实例表:
用于存储消息发送的实例信息,表示对特定用户的具体消息实例化。
可包含字段:请求ID、发送参数信息、执行方式(同步或异步)、发送时间等。
消息任务表:
用于存储消息发送的任务信息,表示需要发送的消息批次或定时任务。
可包含字段:任务ID、任务名称、cron表达式、状态等。
消息回调记录表:本发明特有,可以记录回调失败记录,有益于上层调用做补偿逻辑:例如回调失败,主动拉取一次消息发送结果。
用于存储消息发送后的回调记录信息,记录了消息回调执行情况。
可包含字段:请求ID、发送结果、回调时间、回调失败重试次数、回调失败间隔、回调结果等。
消息发送记录表:本发明特有,可以用于记录异步发送消息的送达情况,可用于账单统计场景:将消息发送结果定时推送到Hive数据库中,每月跑一次Hive脚本统计对账。
用于存储消息的发送历史记录信息,记录了每个消息的发送详细信息和结果。
可包含字段:请求ID、渠道、接收人、发送时间、发送状态等。
以上提供了一种基本的消息数据库设计方案,根据实际需求,结合业务逻辑和数据关系进行调整和扩展。在设计过程中,可以考虑索引、外键关联等数据库优化技术,以提高查询和操作性能。
核心类设计
类设计主要涉及到两个部分,一部分是发送时的参数校验、参数组装、根据消息渠道路由到相应的处理器、发送MQ消息、注册异步处理事件等,这些步骤可按照需求进行自由组合,例如同步发送时,选择根据消息渠道路由到相应的处理器,而不需要发送异步MQ、注册异步处理事件;异步发送使用中间件时,选择发送MQ消息,而不需要注册异步处理事件。由此,本发明在软件架构设计上使用责任链模式设计发送时类设计,即方便扩展,又可以重用。
另一部分是,消息处理器类设计。消息发送需要按照渠道路由到指定的消息处理器中,因此使用缺省适配器模式进行开发。具体实现如下:
定义消息处理器接口,定义消息发送的处理方法;
定义抽象消息处理器,实现消息处理器接口。定义构造器,构造器中将当前渠道注册到Spring容器中,Key为渠道类型,value为具体的消息处理器,此处可实现按照渠道路由到指定的消息处理器功能;定义抽象方法:获取当前消息渠道,具体消息发送处理方法;定义公共方法:参数校验,异常处理,异常保存等。
定义具体消息处理器,实现消息处理器接口,继承抽象消息处理器,按照每个渠道不同的实现逻辑,实现获取当前消息渠道接口,实现消息发送处理方法,也可按需增加参数校验逻辑。基于以上架构,简化了接入新的消息渠道的操作,仅需要新增一个具体的消息处理器即可。
本发明的关键点如下:
本发明架构设计实现了中间件可插拔,简单项目可不使用中间件,大型项目中可直接使用中间件,也可以替换为业务中使用的中间件,极易扩展。
本发明遵循单一职责原理,将消息推送从复杂业务中抽离出来,实现了多种异构消息统一发送的功能。
本发明符合开闭原则,对修改关闭,对新增消息渠道开放,可实现灵活接入新的渠道,且不影响主流程功能。除此之外,本发明默认增加了发送http请求的入口,业务方可自定义实现新的发送逻辑,通过消息推送平台进行统一发送和记录,方便用户统计消息发送情况。
本发明接入了邮件,阿里云短信,钉钉群消息,飞书群消息,阿里云语音等发送渠道,支持同步和异步两种发送方式。消息发送前,会对消息进行去重和限流,保证消息不重复和消息系统的高可用。消息发送时支持多线程,较好的利用了CPU。同时还支持定时推送。消息发送后,记录发送实例,用于记录一次发送的参数信息。大部分第三方消息发送功能都是异步的,将异步发送的结果存储消息送达状态中,供用户查询和定位问题。通过以上记录很便捷的帮用户统计某个模版的发送数量,某个时间段的发送数量等,也可以帮助用户统计计费消息。
本发明可扩展实现的功能。
本发明可根据渠道使用情况,将流量分发至同一渠道的不通配置中。消息计费,可将MySQL数据库通过数据同步任务抽取至Hive库中,进行统计计算。
流量监控,监控发送消息接口,可以展示接口的QPS等情况。
本发明的效果
本发明的目的是提供一个独立的消息推送系统,该系统可接入多种消息渠道,例如短信,电话,邮件,钉钉群消息等,用户可按需选择某种渠道进行发送。消息渠道可扩展,当现有的渠道不满足用户需求时,业务方可自定义消息发送逻辑。消息推送拆分出单独的服务,实现了业务隔离,同时消息对象也可以独立向上扩展,例如对消息发送内容进行报表输出,消息统计计费等。
总的来说,多种异构消息统一推送系统可以提供一致的用户体验,精确的消息投递,简单高效,多渠道覆盖,提高了消息推送的效率,同时提高了营销和通讯的效果。消息推送系统从业务系统拆离后,更有利于服务的水平扩展,它优秀的架构设计极大地简化了开发过程。
在本说明书的描述中,参考术语“实施例”、“示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不必须针对的是相同的实施例或示例。此外,本领域的技术人员可以在不产生矛盾的情况下,将本说明书中描述的不同实施例或示例以及其中的特征进行结合或组合。
上述内容虽然已经示出和描述了本发明的实施例,可以理解的是,上述实施例是示例性的,不能理解为对本发明的限制,本领域的普通技术人员在本发明的范围内可以对上述实施例进行变化、修改、替换和变型等更新操作。

Claims (10)

1.一种异构消息统一推送方法,其特征在于,所述方法包括下列步骤:
步骤S1:消息相关配置;包括消息渠道配置、消息模版配置和消息任务配置;其中,所述消息渠道配置用于配置渠道发送消息需要的服务端相关配置;所述消息模版配置为配置消息标题和内容,支持变量配置,发送消息时,输入消息变量对应变量名称和变量值;所述消息任务配置用于将一次发送创建为任务,实现任务的复用;
步骤S2:发送消息;发送前对消息进行去重、幂处理和限流处理;同时在前置处理中增加消息限流逻辑,然后传入渠道code,输入消息内容;
步骤S3:存储消息发送记录;记录一次消息发送的参数信息和记录消息发送的结果;
步骤S4:异步消息回调处理;采用主动推送的方式将结果通知请求方;
其中,步骤S1中,具体处理步骤为:
S1.4.1.任务入库,将任务配置信息保存到数据库的消息任务表:tbl_message_task;
S1.4.2.启动任务:启动任务时,需要设置调度触发时间,该时间是从消息任务配置的定时配置的cron表达式计算得出的,计算出每次任务的具体运行时间;同时任务失败重试时,也调用该步骤实现的方法;
具体包括:
S1.4.2.1.创建JobDetail实例,绑定Job实现类;若可以从Scheduler中获取到JobDetail实例则使用该实例,否则创建新的实例;
S1.4.2.2.指明Job的名称,所在组的名称,以及绑定Job类;
S1.4.2.3.定义调度触发规则,使用cronTrigger规则;调用该方法时,传入具体的任务触发时间;
S1.4.2.4.把作业和触发器注册到任务调度中;根据步骤S1.4.2.1,若为新的实例,则调用重新调度作业的接口:scheduler.rescheduleJob,若为已存在的作业,则调用作业调度接口:scheduler.scheduleJob;
S1.4.2.5.启动,更新启用状态;
S1.4.3.更新任务逻辑,具体如下:
S1.4.3.1.任务表中获取任务;
S1.4.3.2.通过任务唯一标识,删除Quartz中的任务,删除数据库中的任务,最后调用新建任务接口,重建任务;
S1.4.4.删除任务逻辑,具体如下:
S1.4.4.1.停用任务:
a.调用quartz删除任务接口;
b.任务置为停用状态;
S1.4.4.2.删除任务表数据;
S1.4.5.查询任务列表、获取任务详情;使用任务表的数据作为基础数据进行查询;
S1.4.6.启用/停用任务:
S1.4.6.1.启用使用创建任务中启动任务逻辑;
S1.4.6.2.停用使用删除任务中的停用逻辑;
引入线程池对发送使用多线程进行处理,线程池具体实现流程如下:
步骤100:创建线程池
线程池的核心参数为:核心线程数为jvm进程拥有的处理器数量,最大线程数为2倍的处理器数量;
步骤200:线程池优雅关闭
首先将线程池注册到优雅关闭线程池的连接池中,服务停止时,对所有注册的线程池进行预处理,线程池中的任务在等待n秒后,停止运行;
异步消费消息时,服务发生异常,线程池中的任务可以正常完成,避免消息出现重复发送的场景;
步骤300:创建线程,并实现消息按照消息渠道进行分发;
创建具体在线程池中运行的线程,线程执行时,根据消息渠道分发至具体的消息处理器中;
通过使用Kafka中间件,防止消息重复消费,具体实现如下:
Kafka 使用消息偏移量来标识每个消息在一个特定分区中的位置,消费者跟踪消费的消息的偏移量,消费者将偏移量存储在外部存储系统中,以便在发生重启或重试时,使用存储的偏移量来恢复消费进度;当消费者处理完一条消息后,将该消息的偏移量提交到Kafka 的内部存储系统中;即使消费者发生故障或重启,能给使用已提交的偏移量按照之前的位置继续消费,避免重复消费;
同时,基于redis中zset的滑动窗口去重,控制单位时间内的频次;并使用lua脚本来保证原子性和减少网络io的损耗,使用雪花算法生成zset的唯一value,score使用的是当前的时间戳。
2.根据权利要求1所述的异构消息统一推送方法,其特征在于,步骤S1中,还包括:定时推送配置为配置何时发送消息;限流配置包括按照用户数和发送数量进行限流。
3.根据权利要求2所述的异构消息统一推送方法,其特征在于,步骤S1中,使用消息模版code标识唯一模版并提供给业务方使用;消息内容支持的格式包括XML和Markdown;消息内容和标题支持变量。
4.根据权利要求2所述的异构消息统一推送方法,其特征在于,步骤S1中,定时推送配置支持Cron表达式;配置了定时发送后,会创建对应的任务,到定时时间后,执行发送消息。
5.根据权利要求1所述的异构消息统一推送方法,其特征在于,步骤S2中,发送消息时,可通过消息渠道code,选择发送渠道,也可以输入消息渠道类型,自动根据流量选择渠道发送;消息内容,可直接使用消息模版code,也可以直接输入消息内容和标题;接收人可按照业务方需求,增加导入人群功能,并设置人群分组,可实现按照分组发送消息。
6.根据权利要求1所述的异构消息统一推送方法,其特征在于,步骤S4中,异步消息回调处理支持两种方式,一种是RPC接口调用,另一种是HTTP接口,直接调用相应的HTTP Url和参数发送请求。
7.根据权利要求1所述的异构消息统一推送方法,其特征在于,步骤S2中,其中定时消息的具体实现步骤包括如下流程:
步骤S2.1:引入Quartz相关依赖,实现消息定时发送;
步骤S2.2:添加配置信息;
默认情况下,Quartz用内存记录定时任务信息,应用重新启动后,定时任务信息将会丢失,为任务增加数据库配置信息;
按照Quartz 官方文档,在quartz.properties中增加数据库存储相关配置,并执行数据库初始化脚本;
步骤S2.3:创建保存任务的数据库表,记为任务表;用于存储任务相关参数信息;
步骤S2.4:编写代码。
8.一种异构消息统一推送系统,其特征在于,所述系统中执行根据权利要求1-7任一项所述的异构消息统一推送方法。
9.根据权利要求8所述的异构消息统一推送系统,其特征在于,所述系统包括访问层、调度层、异步处理层、消息推送层和ORM层;其中:
最上层为访问层,业务可以直接调用RESTful API,也可以使用代码自动生成的SDK;
然后,为调度层,用于创建定时发送的任务,实现定时发送的功能;
其次,为异步处理层;用于实现消息的异步推送功能;使用消息中间件实现异步功能,或使用EventBus或Disruptor工具完成异步事件驱动功能;
接着,为消息推送层,通过引入线程池提高发送消息的并发度;同时消息到达时,对消息进行分组、去重和消息限流;
最后,为ORM层,本发明使用MyBatis作为ORM框架,实现将数据库和对象之间进行映射。
10.根据权利要求9所述异构消息统一推送系统,其特征在于,其中,数据库业务表包含以下表:
消息渠道表:tbl_message_channel,消息模版表:tbl_message_template,消息发送实例:tbl_message_instance,消息任务表tbl_message_task,消息回调记录表:tbl_message_callback_record,消息发送记录表:tbl_message_record。
CN202311126803.7A 2023-09-04 2023-09-04 一种异构消息统一推送方法及系统 Active CN116866427B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202311126803.7A CN116866427B (zh) 2023-09-04 2023-09-04 一种异构消息统一推送方法及系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202311126803.7A CN116866427B (zh) 2023-09-04 2023-09-04 一种异构消息统一推送方法及系统

Publications (2)

Publication Number Publication Date
CN116866427A CN116866427A (zh) 2023-10-10
CN116866427B true CN116866427B (zh) 2023-12-12

Family

ID=88234478

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202311126803.7A Active CN116866427B (zh) 2023-09-04 2023-09-04 一种异构消息统一推送方法及系统

Country Status (1)

Country Link
CN (1) CN116866427B (zh)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN118368332B (zh) * 2024-06-14 2024-08-23 深圳市睿创科数码有限公司 一种智慧园区安防警示信息的推送方法及系统

Citations (15)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2001016733A2 (en) * 1999-08-31 2001-03-08 Accenture Llp System, method, and article of manufacture for a request batcher in a transaction services patterns environment
JP2002063146A (ja) * 2000-08-15 2002-02-28 Nippon Telegr & Teleph Corp <Ntt> メッセージ処理の原子性保証方法及び装置
CN107277171A (zh) * 2017-07-28 2017-10-20 山东浪潮商用系统有限公司 一种基于quartz的可定制消息发送方法
CN110189206A (zh) * 2019-06-04 2019-08-30 苏州程旅网络科技有限公司 后台异步下单系统及下单方法
CN111342982A (zh) * 2020-02-28 2020-06-26 海信集团有限公司 一种集成多种消息发送的方法及系统
CN111934986A (zh) * 2020-07-31 2020-11-13 银盛支付服务股份有限公司 一种异步消息终端推送解决方法及系统
CN111931105A (zh) * 2020-07-20 2020-11-13 银盛支付服务股份有限公司 一种kafka消费指定推送时间数据处理方法
CN112311868A (zh) * 2020-10-27 2021-02-02 上海淇馥信息技术有限公司 消息触达方法、装置和电子设备
CN112948174A (zh) * 2021-02-03 2021-06-11 江苏苏宁物流有限公司 消息处理方法、装置、计算机设备和存储介质
CN114189478A (zh) * 2021-12-01 2022-03-15 浪潮云信息技术股份公司 一种基于滑动窗口算法的分布式限流实现方法及系统
CN114257636A (zh) * 2021-12-10 2022-03-29 国网江西省电力有限公司信息通信分公司 一种统一消息发布系统
WO2022109450A1 (en) * 2020-11-23 2022-05-27 Ov Loop, Inc. Making payments through electronic channels
CN115641130A (zh) * 2022-08-31 2023-01-24 杭州云象网络技术有限公司 基于改进雪花算法生成交易记录id的方法、装置及设备
CN116033007A (zh) * 2022-11-16 2023-04-28 金钱猫科技股份有限公司 一种消息推送管理方法及系统
CN116266831A (zh) * 2022-09-09 2023-06-20 烟台海颐软件股份有限公司 一种消息调度方法

Patent Citations (15)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2001016733A2 (en) * 1999-08-31 2001-03-08 Accenture Llp System, method, and article of manufacture for a request batcher in a transaction services patterns environment
JP2002063146A (ja) * 2000-08-15 2002-02-28 Nippon Telegr & Teleph Corp <Ntt> メッセージ処理の原子性保証方法及び装置
CN107277171A (zh) * 2017-07-28 2017-10-20 山东浪潮商用系统有限公司 一种基于quartz的可定制消息发送方法
CN110189206A (zh) * 2019-06-04 2019-08-30 苏州程旅网络科技有限公司 后台异步下单系统及下单方法
CN111342982A (zh) * 2020-02-28 2020-06-26 海信集团有限公司 一种集成多种消息发送的方法及系统
CN111931105A (zh) * 2020-07-20 2020-11-13 银盛支付服务股份有限公司 一种kafka消费指定推送时间数据处理方法
CN111934986A (zh) * 2020-07-31 2020-11-13 银盛支付服务股份有限公司 一种异步消息终端推送解决方法及系统
CN112311868A (zh) * 2020-10-27 2021-02-02 上海淇馥信息技术有限公司 消息触达方法、装置和电子设备
WO2022109450A1 (en) * 2020-11-23 2022-05-27 Ov Loop, Inc. Making payments through electronic channels
CN112948174A (zh) * 2021-02-03 2021-06-11 江苏苏宁物流有限公司 消息处理方法、装置、计算机设备和存储介质
CN114189478A (zh) * 2021-12-01 2022-03-15 浪潮云信息技术股份公司 一种基于滑动窗口算法的分布式限流实现方法及系统
CN114257636A (zh) * 2021-12-10 2022-03-29 国网江西省电力有限公司信息通信分公司 一种统一消息发布系统
CN115641130A (zh) * 2022-08-31 2023-01-24 杭州云象网络技术有限公司 基于改进雪花算法生成交易记录id的方法、装置及设备
CN116266831A (zh) * 2022-09-09 2023-06-20 烟台海颐软件股份有限公司 一种消息调度方法
CN116033007A (zh) * 2022-11-16 2023-04-28 金钱猫科技股份有限公司 一种消息推送管理方法及系统

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
hive数据仓库;重逢之时;CSDN;全文 *
基于Spring、Hibernate、Dubbo的消息推送中间件的设计;汪琳;;现代计算机(专业版)(第30期);全文 *
实现定时任务(包含管理界面);饭一碗;CSDN;全文 *

Also Published As

Publication number Publication date
CN116866427A (zh) 2023-10-10

Similar Documents

Publication Publication Date Title
US8204870B2 (en) Unwired enterprise platform
US9432455B2 (en) Synchronizing events between mobile devices and servers
US20190266537A1 (en) Systems and methods for incident queue assignment and prioritization
CN101448247B (zh) 在远程设备上更新数据
CN107729139B (zh) 一种并发获取资源的方法和装置
CN102291446B (zh) 向应用程序通知状态变化的灵活体系结构
JP5391276B2 (ja) インテリジェント移動体デバイス管理クライアント
CN105190555B (zh) 集中式任务调度
CN110221901A (zh) 容器资源创建方法、装置、设备及计算机可读存储介质
US8719780B2 (en) Application server with a protocol-neutral programming model for developing telecommunications-based applications
US10698745B2 (en) Adapter extension for inbound messages from robotic automation platforms to unified automation platform
CN109684054A (zh) 信息处理方法及装置、电子设备及存储器
US20120131191A1 (en) Mobile communication device, server, and method of facilitating resource reservations
US9852220B1 (en) Distributed workflow management system
CN116866427B (zh) 一种异构消息统一推送方法及系统
CN110532074A (zh) 一种多租户模式SaaS服务集群环境的任务调度方法及系统
CN112069265A (zh) 配置数据的同步方法、业务数据系统、计算机系统和介质
CN112261101B (zh) Mqtt消息中心引入规则引擎的方法
CN107609086B (zh) 一种app推送方法及其引擎系统
CN110096258A (zh) 一种基于Terraform的OpenStack基础设施架构管理的方法
CN102377853B (zh) 一种移动终端应用、界面窗口及业务的管理装置及方法
CN108984290A (zh) 任务调度方法和系统
WO2024037132A1 (zh) 工作流处理方法、装置、设备、存储介质和程序产品
CN113743879A (zh) 一种自动化规则处理方法、系统以及相关设备
CN113783913A (zh) 一种消息推送管理方法和装置

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