一种基于共享内存的消息传递方法转让专利

申请号 : CN202110329895.3

文献号 : CN112711491B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 石永恒王凤雷王锋平林世颖时春

申请人 : 江苏未来智慧信息科技有限公司

摘要 :

本发明公开了一种基于共享内存的消息传递方法,属于消息中间件技术领域,包括以共享内存为数据存放载体,消息传递服务过程由服务器的业务进程调用api完成;将共享内存封装成消息通道,对消息通道进行标记;在执行消息的读写操作时,使用批量读写功能,通过判断通道的标记,获取当前通道有无数据,对于消息不可丢失的场景,将无法及时处理而又不能丢弃的消息发送到分布式消息系统kafka中进行保存,解决了高速的在进程间传递数据的技术问题,本发明利用共享内存作为数据存放的载体。将共享内存封装成消息通道,配合系统信号量,内存锁,内存标记以及时序控制,可以高速的在进程间传递数据。进程间的消息传递速度即为内存拷贝的速度。

权利要求 :

1.一种基于共享内存的消息传递方法,其特征在于:包括以共享内存为数据存放载体,为消息传递双方提供急速的消息传递服务;

消息传递服务过程由服务器的业务进程调用api完成;

将共享内存封装成消息通道,对消息通道进行标记;

在执行消息的读写操作时,使用批量读写功能,一次性读写多条数据;

在执行消息的读操作时,通过判断通道的标记,获取当前通道有无数据:有数据,则读取数据;无数据,则跳过当前通道,读取并判断下一个通道的标记;

对于消息不可丢失的场景,将无法及时处理而又不能丢弃的消息发送到分布式消息系统kafka中进行保存;

在执行消息的读操作时,在服务器的进程中同时执行0或多个通道的数据发送操作和0或1个通道的数据接收操作;

进程之间自由组合,将一个进程的输出通道配置成另外一个进程的输入通道,从而完成消息在进程之间的传递;

进程使用的时候规定0或多个发送通道,0或1个接受通道;若发送或接受通道数为0,表示当前进程没有发送或者接受需求,数据只是单向流动;对于存在多个发送通道的情况,使用默认的分流方法,将数据轮流发送至对应的通道或根据业务进程自己决定将数据发送至哪个通道;

进程之间自由组合通道,将一个进程的输出通道配置成另外一个进程的输入通道从而实现消息在进程之间的传递;若一个进程配置多个输出通道则可实现消息的分发;若多个进程的输出配置为一个通道即实现消息的聚合;

进程之间通过原子锁操作实现对通道的顺序访问;进程有加解锁的操作,加锁时进程需将自身的进程号写入通道信息;为防止进程在释放锁之前因故障退出导致其他进程饿死等待,等待进程若超时等不到锁,就会自行判断持有锁的进程是否存在,若不存在则直接删除锁。

2.如权利要求1所述的一种基于共享内存的消息传递方法,其特征在于:在将共享内存封装成消息通道时,预先明确通道的个数以及通道的大小;

消息只存在于通道中,在执行读写操作时首先明确指明读写的是哪一个通道。

3.如权利要求2所述的一种基于共享内存的消息传递方法,其特征在于:在执行读写操作,根据通道的标记来指明读写的是哪一个通道。

4.如权利要求1所述的一种基于共享内存的消息传递方法,其特征在于:所述通道包括通道头段和通道数据段,通道头段包括当前通道编号、通道容量、头指针位置、尾指针位置、锁位、持有锁的进程号位和通道数据指示标记,通道数据指示标记包括头标记和尾标记;

通道数据段用于存放消息的具体数据,消息的具体数据包括消息头和消息体,消息头包括消息的长度信息,消息体包括消息的数据内容。

5.如权利要求4所述的一种基于共享内存的消息传递方法,其特征在于:所述通道中的数据按照环队列存放,由所述通道头段中的所述头标记和所述尾标记指示当前的数据存储状态。

6.如权利要求5所述的一种基于共享内存的消息传递方法,其特征在于:所述通道中的数据按照环队列存放时,当所述头标记等于所述尾标记的时候,所述通道为空;当所述头标记加1对所述通道大小取模后等于所述尾标记的时候,所述通道为满;所述通道中的数据大小为所述头标记和所述尾标记之间的差值。

7.如权利要求6所述的一种基于共享内存的消息传递方法,其特征在于:对于1对N的通道配置方法,消息发送端使用广播方法广播信息,即一个消息对所有的接收端发送。

8.如权利要求7所述的一种基于共享内存的消息传递方法,其特征在于:所述服务器的进程之间通过原子锁操作实现对通道的顺序访问。

说明书 :

一种基于共享内存的消息传递方法

技术领域

[0001] 本发明属于消息中间件技术领域,涉及一种基于共享内存的消息传递方法。

背景技术

[0002] Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的
处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统、低延迟的实时系统、
storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等等,用scala语言编写,
Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。
[0003] 在消息中间件方面,市面上有不少开源的产品,比如说基于分布式,磁盘存储的kafka,基于内存的rabbitMQ,rocketMQ,redis等等。开源产品在绝大多数的后台的解决集
成方案中,都能比较好的连接异构平台,对后台压力进行很好的削峰,平谷作用。
[0004] 这些产品的设计目标一般在于可靠性,大吞吐量,高并发。部署模式一般都需要一台或多台broker提供单例或集群式服务。业务模块想使用消息服务的时候需要进行c/s模
式的网络通信。这也造成了类似产品有比较慢的消息响应速度,即从发送端发送消息到接
收端接收消息之间的时间间隔较长。在单纯只需要简单的后端进程间消息通信的场合也显
得过重(需要单独部署服务器),响应较慢。在某些对于要求急速响应的场合拉高了消息时
延。

发明内容

[0005] 本发明的目的是提供一种基于共享内存的消息传递方法,解决了高速的在进程间传递数据的技术问题。
[0006] 为实现上述目的,本发明采用如下技术方案:
[0007] 一种基于共享内存的消息传递方法,包括以共享内存为数据存放载体,为消息传递双方提供急速的消息传递服务;
[0008] 消息传递服务过程由服务器的业务进程调用api完成;
[0009] 将共享内存封装成消息通道,对消息通道进行标记;
[0010] 在执行消息的读写操作时,使用批量读写功能,一次性读写多条数据;
[0011] 在执行消息的读操作时,通过判断通道的标记,获取当前通道有无数据:有数据,则读取数据;无数据,则跳过当前通道,读取并判断下一个通道的标记;
[0012] 对于消息不可丢失的场景,将无法及时处理而又不能丢弃的消息发送到分布式消息系统kafka中进行保存。
[0013] 优选的,在将共享内存封装成消息通道时,预先明确通道的个数以及通道的大小;
[0014] 消息只存在与通道中,在执行读写操作时首先明确指明读写的是哪一个通道。
[0015] 优选的,在执行读写操作,根据通道的标记来指明读写的是哪一个通道。
[0016] 优选的,所述通道包括通道头段和通道数据段,通道头段包括当前通道编号、通道容量、头指针位置、尾指针位置、锁位、持有锁的进程号位和通道数据指示标记,通道数据指
示标记包括头标记和尾标记;
[0017] 通道数据段用于存放消息的具体数据,消息的具体数据包括消息头和消息体,消息头包括消息的长度信息,消息体包括消息的数据内容。
[0018] 优选的,所述通道中的数据按照环队列存放,由所述通道头段中的所述头标记和所述尾标记指示当前的数据存储状态。
[0019] 优选的,所述通道中的数据按照环队列存放时,当所述头标记等于所述尾标记的时候,所述通道为空;当所述头标记加1对所述通道大小取模后等于所述尾标记的时候,所
述通道为满;所述通道中的数据大小为所述头标记和所述尾标记之间的差值。
[0020] 优选的,在执行消息的读操作时,在服务器的进程中同时执行0或多个通道的数据发送操作和0或1个通道的数据接收操作;
[0021] 进程之间自由组合,将一个进程的输出通道配置成另外一个进程的输入通道,从而完成消息在进程之间的传递。
[0022] 优选的,对于1对N的通道配置方法,消息发送端使用广播方法广播信息,即一个消息对所有的接收端发送。
[0023] 优选的,所述服务器的进程之间通过原子锁操作实现对通道的顺序访问。
[0024] 本发明的有益效果:
[0025] 本发明所述的一种基于共享内存的消息传递方法,解决了高速的在进程间传递数据的技术问题,本发明利用共享内存作为数据存放的载体。将共享内存封装成消息通道,配
合系统信号量,内存锁,内存标记以及时序控制,可以高速的在进程间传递数据。进程间的
消息传递速度即为内存拷贝的速度。本发明无broker,消息之间的传递无需通过服务转接,
直接由客户端通过API实现,大大降低了传统开源消息中间件的消息时延。本发明适合在单
个主机的多个后台进程之间实现快速消息传输,本发明对于后台进程间要求轻量,高效的
通信场合,进程之间的通信效率比使用市面上的开源产品大幅度提高,配置简单,使用方
便,对于同构的后台进程可以直接传递二进制数据对象,无需业务进程进行序列化和反序
列化,对应用开发者更友好,对于服务型后台,数据在进程间处理会有更短的延迟,客户端
会有更快的调用反馈。

附图说明

[0026] 图1为本发明用于系统数据服务中的消息传递的流程图;
[0027] 图2为本发明用于NOSQL数据库的服务通信的流程图。

具体实施方式

[0028] 下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于
本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他
实施例,都属于本发明保护的范围。
[0029] 实施例1:
[0030] 如图1所示的一种基于共享内存的消息传递方法,包括以共享内存为数据存放载体,为消息传递双方提供急速的消息传递服务;
[0031] 消息传递服务过程由服务器的业务进程调用api完成;
[0032] 将共享内存封装成消息通道,对消息通道进行标记;
[0033] 在执行消息的读写操作时,使用批量读写功能,一次性读写多条数据;
[0034] 在执行消息的读操作时,通过判断通道的标记,获取当前通道有无数据:有数据,则读取数据;无数据,则跳过当前通道,读取并判断下一个通道的标记;
[0035] 对于消息不可丢失的场景,将无法及时处理而又不能丢弃的消息发送到分布式消息系统kafka中进行保存。
[0036] 优选的,在将共享内存封装成消息通道时,预先明确通道的个数以及通道的大小;
[0037] 消息只存在与通道中,在执行读写操作时首先明确指明读写的是哪一个通道。
[0038] 优选的,在执行读写操作,根据通道的标记来指明读写的是哪一个通道。
[0039] 优选的,所述通道包括通道头段和通道数据段,通道头段包括当前通道编号、通道容量、头指针位置、尾指针位置、锁位、持有锁的进程号位和通道数据指示标记,通道数据指
示标记包括头标记和尾标记;
[0040] 通道数据段用于存放消息的具体数据,消息的具体数据包括消息头和消息体,消息头包括消息的长度信息,消息体包括消息的数据内容。
[0041] 优选的,所述通道中的数据按照环队列存放,由所述通道头段中的所述头标记和所述尾标记指示当前的数据存储状态。
[0042] 优选的,所述通道中的数据按照环队列存放时,当所述头标记等于所述尾标记的时候,所述通道为空;当所述头标记加1对所述通道大小取模后等于所述尾标记的时候,所
述通道为满;所述通道中的数据大小为所述头标记和所述尾标记之间的差值。
[0043] 本实施例中,头标记写入,尾标记读出。
[0044] 优选的,在执行消息的读操作时,在服务器的进程中同时执行0或多个通道的数据发送操作和0或1个通道的数据接收操作;
[0045] 进程之间自由组合,将一个进程的输出通道配置成另外一个进程的输入通道,从而完成消息在进程之间的传递。
[0046] 进程使用的时候可以根据具体需要规定0或多个发送通道,0或1个接受通道。若发送或接受通道数为0,表示当前进程没有发送或者接受需求,数据只是单向流动。对于存在
多个发送通道的情况,可以使用默认的分流方法,将数据轮流发送至对应的通道。也可以根
据业务进程自己决定将数据发送至哪个通道。
[0047] 进程之间可以自由组合通道,将一个进程的输出通道配置成另外一个进程的输入通道即可实现消息在进程之间的传递。如一个进程配置多个输出通道则可实现消息的分
发。若多个进程的输出配置为一个通道即实现消息的聚合。
[0048] 优选的,对于1对N的通道配置方法,消息发送端使用广播方法广播信息,即一个消息对所有的接收端发送。
[0049] 1对N的通道配置方法用于处理一些系统级的通知。
[0050] 优选的,所述服务器的进程之间通过原子锁操作实现对通道的顺序访问。在本实施例中进程有加解锁的操作,加锁时进程需将自身的进程号写入通道信息。为防止进程在
释放锁之前因故障退出导致其他进程饿死等待,等待进程若超时等到不到锁,就会自行判
断持有锁的进程是否存在,若不存在则直接删除锁。
[0051] 本发明轻量级,无需部署服务端程序,所有操作均由业务进程调用api完成,以共享内存为数据存放载体,为消息传递双方提供急速的消息传递服务。
[0052] 本发明提供工具用于创建,查看,打印所有的通道信息以及消息查看功能。
[0053] 本实施例的一个具体的应用场景中,如图1所示为本发明用于系统数据服务中的消息传递:
[0054] 后台系统主要分为网络服务进程与数据处理进程。进程之间由消息中间件相连,由于网络服务进程与数据处理进程之间有速度上的不匹配,所以后送的消息通道配置为1
对N。
[0055] 系统工作流程如下:
[0056] 网络服务接受到业务侧请求后,调用协议解码模块判断消息边界,将完整的消息截取后发送至消息中间件的某个消息通道。
[0057] 发送的通道策略为系统默认的顺序分发。
[0058] 数据处理进程接收到消息后,读取消息内容,并根据消息内容进行业务处理,同时生成回复消息,并将回复消息打包写入回送的通道。
[0059] 网络服务进程如果判断回送通道中有消息,则读出消息并将消息发送至业务侧的调用者。
[0060] 实施例2:
[0061] 实施例2与实施例1之间的不同之处在于,如图2所示,实施例2为本发明用于NOSQL数据库的服务通信的场景,具体工作流程如下:
[0062] 客户端可以为跨网服务的listener,同主机访问的console,以及同主机内访问的程序api,每个客户端初始化的时候根据自己的客户端id初始化自己的读取通道。
[0063] 服务端从一个通道接受数据请求,处理后将消息回写入对应客户端的通道中。
[0064] 图2中,Dblistener为数据库监听程序,DbConsole为数据库控制台,Db API为数据库应用程序接口,DbServer为数据库服务器。
[0065] 本发明所述的一种基于共享内存的消息传递方法,解决了高速的在进程间传递数据的技术问题,本发明利用共享内存作为数据存放的载体。将共享内存封装成消息通道,配
合系统信号量,内存锁,内存标记以及时序控制,可以高速的在进程间传递数据。进程间的
消息传递速度即为内存拷贝的速度。本发明无broker,消息之间的传递无需通过服务转接,
直接由客户端通过API实现,大大降低了传统开源消息中间件的消息时延。本发明适合在单
个主机的多个后台进程之间实现快速消息传输,本发明对于后台进程间要求轻量,高效的
通信场合,进程之间的通信效率比使用市面上的开源产品大幅度提高,配置简单,使用方
便,对于同构的后台进程可以直接传递二进制数据对象,无需业务进程进行序列化和反序
列化,对应用开发者更友,对于服务型后台,数据在进程间处理会有更短的延迟,客户端会
有更快的调用反馈。
[0066] 在本发明中描述的任何过程或方法描述可以被理解为,表示包括一个或更多个用于实现定制逻辑功能或过程的步骤的可执行指令的代码的模块、片段或部分,并且本发明
的优选实施方式的范围包括另外的实现,其中可以不按所示出或讨论的顺序,包括根据所
涉及的功能按基本同时的方式或按相反的顺序,来执行功能,这应被本发明的实施例所属
技术领域的技术人员所理解。
[0067] 在本发明中描述的逻辑和/或步骤,例如,可以被认为是用于实现逻辑功能的可执行指令的定序列表,可以具体实现在任何计算机可读介质中,以供指令执行系统、装置或设
备(如基于计算机的系统、包括处理器的系统或其他可以从指令执行系统、装置或设备取指
令并执行指令的系统)使用,或结合这些指令执行系统、装置或设备而使用。就本说明书而
言,"计算机可读介质"可以是任何可以包含、存储、通信、传播或传输程序以供指令执行系
统、装置或设备或结合这些指令执行系统、装置或设备而使用的装置。计算机可读介质的更
具体的示例(非穷尽性列表)包括以下:具有一个或多个布线的电连接部(电子装置),便携
式计算机盘盒(磁装置),随机存取存储器(RAM),只读存储器(ROM),可擦除可编辑只读存储
器(ePROM或闪速存储器),光纤装置,以及便携式光盘只读存储器(CDROM)。另外,计算机可
读介质甚至可以是可在其上打印所述的程序的纸或其他合适的介质,因为可以例如通过对
纸或其他介质进行光学扫描,接着进行编辑、解译或必要时以其他合适方式进行处理来以
电子方式获得所述的程序,然后将其存储在计算机存储器中。
[0068] 应当理解,本发明的各部分可以用硬件、软件、固件或它们的组合来实现。在上述实施方式中,多个步骤或方法可以用存储在存储器中且由合适的指令执行系统执行的软件
或固件来实现。如,如果用硬件来实现和在另一实施方式中一样,可用本领域公知的下列技
术中的任一项或他们的组合来实现:具有用于对数据模块实现逻辑功能的逻辑门电路的离
散逻辑电路,具有合适的组合逻辑门电路的专用集成电路,可编程门阵列(PGA),现场可编
程门阵列(FPGA)等。
[0069] 本技术领域的普通技术人员可以理解实现上述实施例方法携带的全部或部分步骤是可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介
质中,该程序在执行时,包括方法实施例的步骤之一或其组合。
[0070] 此外,在本发明各个实施例中的各功能单元可以集成在一个处理模块中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个模块中。上述集成的模
块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。所述的集成的模块
如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算
机可读取存储介质中。
[0071] 尽管上面已经示出和描述了本发明的实施例,可以理解的是,上述实施例是示例性的,不能理解为对本发明的限制,本领域的普通技术人员在本发明的范围内可以对上述
实施例进行变化、修改、替换和变型。