CN111930528A - 消息中间件的消息写入方法、装置、设备及可读存储介质 - Google Patents
消息中间件的消息写入方法、装置、设备及可读存储介质 Download PDFInfo
- Publication number
- CN111930528A CN111930528A CN202010806295.7A CN202010806295A CN111930528A CN 111930528 A CN111930528 A CN 111930528A CN 202010806295 A CN202010806295 A CN 202010806295A CN 111930528 A CN111930528 A CN 111930528A
- Authority
- CN
- China
- Prior art keywords
- offset
- message
- thread
- file
- written
- 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.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 76
- 230000004044 response Effects 0.000 claims abstract description 29
- 230000015654 memory Effects 0.000 claims description 83
- 238000004590 computer program Methods 0.000 claims description 5
- 230000007717 exclusion Effects 0.000 abstract description 11
- 238000013507 mapping Methods 0.000 description 41
- 238000012545 processing Methods 0.000 description 8
- 238000004891 communication Methods 0.000 description 7
- 238000010586 diagram Methods 0.000 description 4
- 238000005516 engineering process Methods 0.000 description 2
- 238000004140 cleaning Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000000750 progressive effect Effects 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/52—Program synchronisation; Mutual exclusion, e.g. by means of semaphores
- G06F9/526—Mutual exclusion algorithms
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/546—Message passing systems or structures, e.g. queues
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本申请实施例提供一种消息中间件的消息写入方法、装置、设备及可读存储介质,响应于第一线程的消息,查询第一偏移量,基于第一偏移量和第一线程待写入的消息的长度,获取的第二偏移量,进一步,本实施例使用自旋锁,将当前的文件偏移量更新为第二偏移量,并且响应于更新成功,向第一线程反馈所述第一偏移量,第一偏移量用于第一线程向所述消息中间件写入所述消息。本方法基于自旋锁的特性,使用自旋锁更新当前的文件偏移量,具有互斥性,可以将消息写入的互斥区间从整个写入过程,缩减到写入位置的分配,从而提高消息中间件消息写入的并发程度,实现优化写入性能的目的。
Description
技术领域
本申请涉及电子信息领域,尤其涉及一种消息中间件的消息写入方法、装置、设备及可读存储介质。
背景技术
大型的网络活动可能会产生较高的流量脉冲,从而导致流量洪峰,目前,解决流量洪峰问题的最佳方式,是利用消息中间件将收到的消息保存下来,以供业务系统平滑地将消息取出来处理。
消息中间件通常有三种存储方式:存储到结构化数据库中、存储到键值数据库中、存储到文件系统,并且以上三种方式的存储速度从大到小通常依次是:文件系统、键值数据库、结构化数据库。在采用文件系统存储消息时,为了达到更高的消息写入性能,通常采用顺序写而非随机写,并且使用内存映射文件来提高磁盘读写访问性能。
基于文件系统顺序写的消息存储方案,为了保证多线程并发处理消息写入请求的正确性,会引入一个互斥锁来保证多线程写入消息时不相互影响。单个线程内的写入流程为:先申请互斥锁,有且仅有一个线程能申请,其他线程进行等待;申请成功的线程执行消息写入;写入完成后不论成功或失败均立即释放互斥锁,使得其他待写入线程有可能能申请到互斥锁继续写入消息。
但是,由于互斥锁的存在,多线程写入变成了串行写入,没有发挥出多线程的并发能力,因此,目前引入互斥锁的消息中间件的消息写入方法写入性能较低。
发明内容
本申请提供了一种消息中间件的消息写入方法、装置、设备及可读存储介质,目的在于提高消息中间件消息写入的并发程度。
为了实现上述目的,本申请提供了以下技术方案:
一种消息中间件的消息写入方法,包括:
响应于第一线程的消息写入请求,查询第一偏移量,所述第一偏移量为当前的文件偏移量;
基于所述第一偏移量和所述第一线程待写入的消息的长度,获取第二偏移量;
使用自旋锁,将所述当前的文件偏移量更新为所述第二偏移量;
响应于更新成功,向所述第一线程反馈所述第一偏移量,所述第一偏移量用于所述第一线程向所述消息中间件写入所述消息。
可选地,使用自旋锁,将所述当前的文件偏移量更新为所述第二偏移量,包括:
使用比较并交换CAS技术,将所述当前的文件偏移量更新为所述第二偏移量。
可选地,基于所述第一偏移量和所述第一线程待写入的消息的长度,获取第二偏移量,包括:
计算作为文件偏移量的第一数值,所述第一数值为所述第一偏移量和所述第一线程待写入的消息的长度之和;
如果所述第一偏移量与所述第一数值位于同一文件,将所述第一数值作为所述第二偏移量。
可选地,还包括:
如果所述第一偏移量与所述第一数值没有位于同一文件,将下一文件的起始偏移量与所述消息的长度之和,作为所述第二偏移量。
可选地,还包括:
响应于更新不成功,重新查询所述第一偏移量以及重新获取所述第二偏移量,并将所述当前的文件偏移量更新为所述第二偏移量。
可选地,在所述向所述第一线程反馈所述第一偏移量之后,还包括:
存储所述第一线程写入的所述消息的内容。
可选地,在所述存储所述第一线程写入的所述消息的内容之前,还包括:
计算作为文件偏移量的第二数值,所述第二数值为所述第一偏移量和所述第一线程待写入的消息的长度之和;
如果所述第一偏移量与所述第二数值没有位于同一文件,在当前文件的剩余空间填充预设的字符。
一种消息中间件的消息写入装置,包括:
查询单元,用于响应于第一线程的消息写入请求,查询第一偏移量,所述第一偏移量为当前的文件偏移量;
偏移量获取单元,用于基于所述第一偏移量和所述第一线程待写入的消息的长度,获取第二偏移量;
更新单元,用于使用自旋锁,将所述当前的文件偏移量更新为所述第二偏移量;
反馈单元,用于响应于更新成功,向所述第一线程反馈所述第一偏移量,所述第一偏移量用于所述第一线程向所述消息中间件写入所述消息。
一种消息中间件的消息写入设备,包括:存储器和处理器;
所述存储器,用于存储程序;
所述处理器,用于执行所述程序,实现如上所述的消息中间件的消息写入方法的各个步骤。
一种可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时,实现如上所述的消息中间件的消息写入方法的各个步骤。
由上述技术方案可以看出,本申请实施例提供一种消息中间件的消息写入方法、装置、设备及可读存储介质,响应于第一线程的消息,查询第一偏移量,第一偏移量为当前的文件偏移量,指示当前的文件写入位置,因此,基于第一偏移量和第一线程待写入的消息的长度,获取的第二偏移量,可以指示在当前的文件写入位置写入第一线程待写入的消息后的位置,进一步,本实施例使用自旋锁,将当前的文件偏移量更新为第二偏移量,并且响应于更新成功,向第一线程反馈所述第一偏移量,第一偏移量用于第一线程向所述消息中间件写入所述消息。可见,本方法基于自旋锁的特性,使得使用自旋锁更新当前的文件偏移量,具有互斥性,即同一时刻,只能允许依据第一线程的第一偏移量和待写入消息的长度,更新当前的偏移量,因此,即使多个线程并行发送消息写入请求,同一时刻,也只能依据一个线程的第一偏移量,锁定更新后的当前文件偏移量。所以,可以将消息写入的互斥区间从整个写入过程,缩减到写入位置的分配,从而提高消息中间件消息写入的并发程度,实现优化写入性能的目的。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本申请实施例提供的一种消息中间件的消息写入方法的具体实施方式的流程示意图;
图2为本申请实施例提供的一种消息中间件的消息写入方法的流程示意图;
图3为本申请实施例提供的一种消息中间件的消息写入装置的结构示意图;
图4为本申请实施例提供的一种消息中间件的消息写入设备的结构示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
本申请实施例提供的消息中间件的消息写入方法应用于采用文件系统存储消息的应用场景下,使用内存映射文件来提高磁盘读写访问性能,将消息顺序写入内存映射文件,进一步需要说明的是,本实施例提供的消息写入方法可以适用于多个线程并发处理消息写入请求,消息中间件同时响应于不同线程的消息写入请求,将消息写入内存映射文件,其中,内存映射文件可以预先创建,或者在写入过程中实时创建。本实施例,以消息中间件处理其中一个线程(记为第一线程)的消息写入请求为例,介绍本申请提供的消息中间件的消息写入方法的一种具体实施方式。
图1为本申请实施例提供的一种消息中间件的消息写入方法的流程示意图,如图1所示,本方法具体可以包括:
S101、响应于第一线程的消息写入请求,查询第一偏移量。
本实施例中,第一线程的消息写入请求中至少包括第一线程待写入的消息的信息,其中包括待写入消息的长度。
本实施例中,第一偏移量为当前的文件偏移量。其中,文件偏移量相对于所有内存映射文件整体的全局偏移量,则,当前的内存映射文件偏移量为全部内存映射文件的开始处(默认为0)到内当前可供写入消息的位置(记为写入位置)的字节数,需要说明的是,本实施例将消息顺序写入各内存映射文件,所以可以理解为,位于当前写入位置之前的各个内存映射文件的存储空间均已被占用。
需要说明的是,本实施例中的可供写入消息的文件以内存映射文件为例,实际应用中可以为其他类型的文件。
S102、计算作为文件偏移量的第一数值。
本实施例中,第一数值的计算方法为,将第一偏移量和第一线程待写入的消息的长度之和作为第一数值。例如,第一偏移量为100,指示内存映射文件W1的写入位置与起始位置的字节数为100,第一线程的消息写入请求中待写入的消息长度为200,则第一数值为300(100+200)。
需要说明的是,第一数值表示在第一偏移量所指示的写入位置写入第一线程待写入的消息后,内存映射文件被占用的字节数。
S103、判断第一数值与第一偏移量是否位于同一内存映射文件。
本实施例中,为了方便管理,通常将存储文件设置为固定内存量的内存映射文件,由于内存映射文件的内存量有限,可能存在内存溢出的情况。
所以,本实施例判断第一数值与第一偏移量是否位于同一内存映射文件,可选的,可以计算第一序号以及第二序号,其中,第一序号指示第一数值位于的内存映射文件的序号,第二序号指示第一偏移量位于的内存映射文件的序号。具体地,第一序号等于第一数值除以固定内存量并取整,第二序号等于第一偏移量除以固定内存量并取整。进一步,判断第一序号和第二序号是否为同一数值,若第一序号等于第二序号,则说明第一数值与第一偏移量位于同一内存映射文件,若第一序号不等于第二序号,则说明第一数值与第一偏移量没有位于同一内存映射文件。
接上例,第一数值为300,第一偏移量为100,假设内存映射文件的固定内存量为80,则第一序号为3(300除以80并取整),表示第一数值位于的序号为3的内存映射文件,第二序号为1(100除以80并取整),表示第一偏移量位于序号为1的内存映射文件。可见,第一数值与第一偏移量没有位于同一内存映射文件,此时若在第一偏移量所指示的写入位置写入第一线程待写入的消息,会发生内存溢出。
S104、如果第一偏移量与第一数值位于同一内存映射文件,将第一数值作为第二偏移量。
S105、如果第一偏移量与第一数值没有位于同一内存映射文件,将下一内存映射文件的起始偏移量与消息的长度之和,作为第二偏移量。
需要说明的是,当第一偏移量与第一数值没有位于同一内存映射文件,说明第一偏移量指示的内存映射文件不足以写入全部的第一线程待写入的消息。为了避免同一线程的待写入的消息写入不同内存映射文件导致的消息清理困难问题,本实施例将第一线程的待写入的消息写入下一内存映射文件。
本实施例中,下一内存映射文件的起始偏移量默认为0,也即,下一内存映射文件为没有被占用的内存映射文件。则,第二偏移量的数值等于待写入的消息的长度。
S106、使用自旋锁,将当前的文件偏移量更新为第二偏移量。
自旋锁是专为防止多处理器并发而引入的一种锁,它在内核中大量应用于中断处理等部分。其中,CAS(Compare and swap,比较并交换)技术是自旋锁的核心操作。本实施例中,使用比较并交换CAS技术,将当前的文件偏移量更新为第二偏移量。
使用CAS技术,将当前的文件偏移量更新为第二偏移量的方法为:将第一偏移量替换为第二偏移量即可。具体的实现过程参照现有技术。
需要说明的是,CAS技术解决的问题是保证原子操作。原子操作指的是最小不可拆分的操作,原子操作一旦开始,就不能被打断,直到操作完成。在多线程环境下,原子操作是保证线程安全的重要手段。
本实施例目的在于并行处理多个线程的消息写入请求,以其中的第一线程为例,当针对第一线程,计算得到第二偏移量后,需要在第一偏移量指示的写入位置写入第一线程的待写入的消息,写入第一线程的待写入的消息的操作可以视为原子操作,不能被打断。本实施例中,使用自旋锁,将当前的文件偏移量更新为第二偏移量后,在处理其他线程的消息写入请求时,第二偏移量所指示的写入位置之前的内存映射文件的内存均被第一线程占用。
需要说明的是,本实施例中,消息中间件同时响应多个线程的消息写入请求,也即针对多个线程,并行完成上述S101~S106。基于自旋锁的特性,使得使用自旋锁更新当前的文件偏移量,具有互斥性,即同一时刻,只能允许依据第一线程的第一偏移量和待写入消息的长度,更新当前的偏移量,因此,即使多个线程并行发送消息写入请求,同一时刻,也只能依据一个线程的第一偏移量,锁定更新后的当前文件偏移量。针对任一线程的消息写入请求,本实施例在更新成功的情况下,执行S107,在更新不成功的情况下,执行S108。
S107、响应于更新成功,向第一线程反馈第一偏移量。
当更新成功后,当前的文件偏移量更新为第二偏移量,第一偏移量用于第一线程向消息中间件写入消息,本实施例中,第一偏移量指示当前的写入位置。
S108、响应于更新不成功,重新查询第一偏移量以及重新获取第二偏移量,并将当前的文件偏移量更新为第二偏移量。
由上,当多个线程同时查询第一偏移量并获取第二偏移量,存在更新不成功的情况,例如,当针对第一线程,将当前的文件偏移量(第一偏移量)更新为获取的第二偏移量成功后,若针对其他线程的当前的文件偏移量也是第一偏移量,则,更新其他线程的当前偏移量不成功。本实施例中,当更新不成功,则重新执行S101~S106,即重新查询第一偏移量以及重新获取第二偏移量,并将当前的文件偏移量更新为第二偏移量。
例如,响应于第一线程的消息写入请求查询第一偏移量为P1,以及获取第二偏移量为P2,同时响应于第二线程的消息写入请求查询第一偏移量为P1,以及获取第二偏移量为P3,则针对第一线程,使用自旋锁将当前的文件偏移量更新为第二偏移量P2成功后,针对第二线程,使用自旋锁将当前的文件偏移量更新为第二偏移量P3不成功。此时,响应于第二线程的消息写入请求,重新执行S101~S106。
S109、计算作为文件偏移量的第二数值。
其中,第二数值为第一偏移量和第一线程待写入的消息的长度之和。一般地,第二数值与第一数值为同一数值。
S110、判断第一偏移量与第二数值是否位于同一内存映射文件。
具体判断方法可以参照上述S103。
S111、如果第一偏移量与第二数值位于同一内存映射文件,在内存映射文件中写入第一线程待写入的消息。
当第一偏移量与第二数值位于同一内存映射文件,则说明在该内存映射文件的剩余空间充足,可以将第一线程待写入的消息完全写入。本实施例将第一线程待写入的消息写入该内存映射文件即可。
S112、如果第一偏移量与第二数值没有位于同一内存映射文件,在当前内存映射文件的剩余空间填充预设的字符。
当第一偏移量与第二数值没有位于同一内存映射文件,则说明在该内存映射文件的剩余空间不充足,不足以将第一线程待写入的消息完全写入,所以为了避免同一线程的待写入消息写入不同文件,本实施例在当前内存映射文件的剩余空间填充预设的字符。需要说明的是,在当前内存映射文件的剩余空间填充预设的字符,能够保证读取消息时能将其识别为无效内容而非有效消息。
S113、在新的内存映射文件中写入第一线程待写入的消息。
本实施例的应用场景中,可以同时处理多个线程的消息写入请求,当写入不同线程的待写入消息,并且其中至少两个线程的第一偏移量与第二数值没有位于同一内存映射文件,则存在至少两个线程的待写入消息均需要写入新的内存映射文件。当新的内存映射文件需要创建时,为避免同时创建相同名称的内存映射文件,本实施例中,由预设的创建单元(例如消息中间件或其他文件创建装置)分别为每一线程待写入的消息创建新的内存映射文件。
由此,本实施中,如果第一线程的第一偏移量与第二数值没有位于同一内存映射文件,则在第一线程创建的新的内存映射文件中写入第一线程待写入的消息。
需要说明的是,当存在预先创建的内存映射文件,则可以直接在预先创建的内存映射文件中直接写入第一线程待写入的消息。
S114、存储第一线程写入的第一线程待写入的消息的内容。
由上述技术方案可以看出,本申请实施例提供一种消息中间件的消息写入方法、装置、设备及可读存储介质,响应于第一线程的消息,查询第一偏移量,第一偏移量为当前的文件偏移量,指示当前的文件写入位置,因此,基于第一偏移量和第一线程待写入的消息的长度,获取的第二偏移量,可以指示在当前的文件写入位置写入第一线程待写入的消息后的位置,进一步,本实施例使用自旋锁,将当前的文件偏移量更新为第二偏移量,并且响应于更新成功,向第一线程反馈第一偏移量,第一偏移量用于第一线程向消息中间件写入消息。可见,本方法基于自旋锁的特性,使得使用自旋锁更新当前的文件偏移量,具有互斥性,即同一时刻,只能允许依据第一线程的第一偏移量和待写入消息的长度,更新当前的偏移量,因此,即使多个线程并行发送消息写入请求,同一时刻,也只能依据一个线程的第一偏移量,锁定更新后的当前文件偏移量。所以,可以将消息写入的互斥区间从整个写入过程,缩减到写入位置的分配,从而提高消息中间件的消息写入的并发程度,实现优化写入性能的目的。
进一步,当第一偏移量与第一数值没有位于同一内存映射文件,本方法将下一内存映射文件的起始偏移量与消息的长度之和,作为第二偏移量。由此,避免第一线程的待写入消息写入不同的内存映射文件。由此,兼顾了清理过期消息文件的高效性以及减少对写入消息的性能影响。
需要说明的是,图1为本申请实施例提供的消息中间件的消息写入方法的可选的一种具体实施方式,在其他应用场景下,可以有其他的具体实施方式,下述将本方法概括总结为图2所示的消息中间件的消息写入方法,如图2所示,本方法具体包括以下步骤:
S201、响应于第一线程的消息写入请求,查询第一偏移量。
本实施例中,第一偏移量为当前的文件偏移量。需要说明的是,第一线程的消息写入请求中至少包括第一线程待写入的消息的信息,其中包括待写入消息的长度。当前的文件偏移量为,内存映射文件的开始处(默认为0)到内存映射文件当前可供写入消息的位置(记为写入位置)的字节数。
需要说明的是,本方案应用于同时处理多个线程的消息写入请求,多个线程的第一偏移量可能相同。
S202、基于第一偏移量和第一线程待写入的消息的长度,获取第二偏移量。
第一线程待写入的消息的长度可以从获取的消息写入请求中解析得到,获取第二偏移量的方法可以参照上述S102~S105。
S203、使用自旋锁,将当前的文件偏移量更新为第二偏移量。
自旋锁是专为防止多处理器并发而引入的一种锁,它在内核中大量应用于中断处理等部分,基于自旋锁的特性,本实施例使用自旋锁更新当前的文件偏移量,具有互斥性,即同一时刻,只能允许依据第一线程的第一偏移量和待写入消息的长度,更新当前的偏移量,因此,即使多个线程并行发送消息写入请求,同一时刻,也只能依据一个线程的第一偏移量,锁定更新后的当前文件偏移量。
S204、响应于更新成功,向第一线程反馈第一偏移量。
当更新成功后,当前的文件偏移量更新为第二偏移量,第一偏移量用于第一线程向消息中间件写入消息,本实施例中,第一偏移量指示第一线程当前的写入位置。
由上述技术方案可以看出,本申请实施例提供一种消息中间件的消息写入方法、装置、设备及可读存储介质,响应于第一线程的消息,查询第一偏移量,第一偏移量为当前的文件偏移量,指示当前的文件写入位置,因此,基于第一偏移量和第一线程待写入的消息的长度,获取的第二偏移量,可以指示在当前的文件写入位置写入第一线程待写入的消息后的位置,进一步,本实施例使用自旋锁,将当前的文件偏移量更新为第二偏移量,并且响应于更新成功,向第一线程反馈第一偏移量,第一偏移量用于第一线程向消息中间件写入消息。可见,本方法基于自旋锁的特性,使得使用自旋锁更新当前的文件偏移量,具有互斥性,即同一时刻,只能允许依据第一线程的第一偏移量和待写入消息的长度,更新当前的偏移量,因此,即使多个线程并行发送消息写入请求,同一时刻,也只能依据一个线程的第一偏移量,锁定更新后的当前文件偏移量。所以,可以将消息写入的互斥区间从整个写入过程,缩减到写入位置的分配,从而提高消息中间件消息写入的并发程度,实现优化写入性能的目的。
本申请实施例还提供了一种消息中间件的消息写入装置,下面对本申请实施例提供的消息中间件的消息写入装置进行描述,下文描述的消息中间件的消息写入装置与上文描述的消息中间件的消息写入方法可相互对应参照。
请参阅图3,示出了本申请实施例提供的一种消息中间件的消息写入装置的结构示意图,如图3所示,该装置可以包括:
查询单元301,用于响应于第一线程的消息写入请求,查询第一偏移量,所述第一偏移量为当前的文件偏移量;
偏移量获取单元302,用于基于所述第一偏移量和所述第一线程待写入的消息的长度,获取第二偏移量;
更新单元303,用于使用自旋锁,将所述当前的文件偏移量更新为所述第二偏移量;
反馈单元304,用于响应于更新成功,向所述第一线程反馈所述第一偏移量,所述第一偏移量用于所述第一线程向所述消息中间件写入所述消息。
可选地,更新单元用于使用自旋锁,将所述当前的文件偏移量更新为所述第二偏移量,包括:更新单元具体用于:
使用比较并交换CAS技术,将所述当前的文件偏移量更新为所述第二偏移量。
可选地,偏移量获取单元用于基于所述第一偏移量和所述第一线程待写入的消息的长度,获取第二偏移量,包括:偏移量获取单元具体用于:
计算作为文件偏移量的第一数值,所述第一数值为所述第一偏移量和所述第一线程待写入的消息的长度之和;
如果所述第一偏移量与所述第一数值位于同一文件,将所述第一数值作为所述第二偏移量。
可选地,偏移量获取单元用于基于所述第一偏移量和所述第一线程待写入的消息的长度,获取第二偏移量,还包括:偏移量获取单元具体用于:
如果所述第一偏移量与所述第一数值没有位于同一文件,将下一文件的起始偏移量与所述消息的长度之和,作为所述第二偏移量。
可选地,本装置还包括偏移量更新单元,用于响应于更新不成功,重新查询所述第一偏移量以及重新获取所述第二偏移量,并将所述当前的文件偏移量更新为所述第二偏移量。
可选地,本装置还包括:存储单元,用于在所述向所述第一线程反馈所述第一偏移量之后,存储所述第一线程写入的所述消息的内容。
可选地,本装置还包括字符填充单元,字符填充单元用于:
在所述存储所述第一线程写入的所述消息的内容之前,计算作为文件偏移量的第二数值,所述第二数值为所述第一偏移量和所述第一线程待写入的消息的长度之和;
如果所述第一偏移量与所述第二数值没有位于同一文件,在当前文件的剩余空间填充预设的字符。
本申请实施例还提供了一种消息中间件的消息写入设备,请参阅图4,示出了该消息中间件的消息写入设备的结构示意图,该设备可以包括:至少一个处理器401,至少一个通信接口402,至少一个存储器403和至少一个通信总线404;
在本申请实施例中,处理器401、通信接口402、存储器403、通信总线404的数量为至少一个,且处理器401、通信接口402、存储器403通过通信总线404完成相互间的通信;
处理器401可能是一个中央处理器CPU,或者是特定集成电路ASIC(ApplicationSpecific Integrated Circuit),或者是被配置成实施本发明实施例的一个或多个集成电路等;
存储器403可能包含高速RAM存储器,也可能还包括非易失性存储器(non-volatile memory)等,例如至少一个磁盘存储器;
其中,存储器存储有程序,处理器可执行存储器存储的程序,实现本申请实施例提供的消息中间件的消息写入方法,包括:
响应于第一线程的消息写入请求,查询第一偏移量,所述第一偏移量为当前的文件偏移量;
基于所述第一偏移量和所述第一线程待写入的消息的长度,获取第二偏移量;
使用自旋锁,将所述当前的文件偏移量更新为所述第二偏移量;
响应于更新成功,向所述第一线程反馈所述第一偏移量,所述第一偏移量用于所述第一线程向所述消息中间件写入所述消息。
可选地,使用自旋锁,将所述当前的文件偏移量更新为所述第二偏移量,包括:
使用比较并交换CAS技术,将所述当前的文件偏移量更新为所述第二偏移量。
可选地,基于所述第一偏移量和所述第一线程待写入的消息的长度,获取第二偏移量,包括:
计算作为文件偏移量的第一数值,所述第一数值为所述第一偏移量和所述第一线程待写入的消息的长度之和;
如果所述第一偏移量与所述第一数值位于同一文件,将所述第一数值作为所述第二偏移量。
可选地,还包括:
如果所述第一偏移量与所述第一数值没有位于同一文件,将下一文件的起始偏移量与所述消息的长度之和,作为所述第二偏移量。
可选地,还包括:
响应于更新不成功,重新查询所述第一偏移量以及重新获取所述第二偏移量,并将所述当前的文件偏移量更新为所述第二偏移量。
可选地,在所述向所述第一线程反馈所述第一偏移量之后,还包括:
存储所述第一线程写入的所述消息的内容。
可选地,在所述存储所述第一线程写入的所述消息的内容之前,还包括:
计算作为文件偏移量的第二数值,所述第二数值为所述第一偏移量和所述第一线程待写入的消息的长度之和;
如果所述第一偏移量与所述第二数值没有位于同一文件,在当前文件的剩余空间填充预设的字符。
本申请实施例还提供一种可读存储介质,该可读存储介质可存储有适于处理器执行的计算机程序,计算机程序被处理器执行时,实现本申请实施例提供的消息中间件的消息写入方法,包括:
响应于第一线程的消息写入请求,查询第一偏移量,所述第一偏移量为当前的文件偏移量;
基于所述第一偏移量和所述第一线程待写入的消息的长度,获取第二偏移量;
使用自旋锁,将所述当前的文件偏移量更新为所述第二偏移量;
响应于更新成功,向所述第一线程反馈所述第一偏移量,所述第一偏移量用于所述第一线程向所述消息中间件写入所述消息。
可选地,使用自旋锁,将所述当前的文件偏移量更新为所述第二偏移量,包括:
使用比较并交换CAS技术,将所述当前的文件偏移量更新为所述第二偏移量。
可选地,基于所述第一偏移量和所述第一线程待写入的消息的长度,获取第二偏移量,包括:
计算作为文件偏移量的第一数值,所述第一数值为所述第一偏移量和所述第一线程待写入的消息的长度之和;
如果所述第一偏移量与所述第一数值位于同一文件,将所述第一数值作为所述第二偏移量。
可选地,还包括:
如果所述第一偏移量与所述第一数值没有位于同一文件,将下一文件的起始偏移量与所述消息的长度之和,作为所述第二偏移量。
可选地,还包括:
响应于更新不成功,重新查询所述第一偏移量以及重新获取所述第二偏移量,并将所述当前的文件偏移量更新为所述第二偏移量。
可选地,在所述向所述第一线程反馈所述第一偏移量之后,还包括:
存储所述第一线程写入的所述消息的内容。
可选地,在所述存储所述第一线程写入的所述消息的内容之前,还包括:
计算作为文件偏移量的第二数值,所述第二数值为所述第一偏移量和所述第一线程待写入的消息的长度之和;
如果所述第一偏移量与所述第二数值没有位于同一文件,在当前文件的剩余空间填充预设的字符。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本申请。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本申请的精神或范围的情况下,在其它实施例中实现。因此,本申请将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
Claims (10)
1.一种消息中间件的消息写入方法,其特征在于,包括:
响应于第一线程的消息写入请求,查询第一偏移量,所述第一偏移量为当前的文件偏移量;
基于所述第一偏移量和所述第一线程待写入的消息的长度,获取第二偏移量;
使用自旋锁,将所述当前的文件偏移量更新为所述第二偏移量;
响应于更新成功,向所述第一线程反馈所述第一偏移量,所述第一偏移量用于所述第一线程向所述消息中间件写入所述消息。
2.根据权利要求1所述的方法,其特征在于,所述使用自旋锁,将所述当前的文件偏移量更新为所述第二偏移量,包括:
使用比较并交换CAS技术,将所述当前的文件偏移量更新为所述第二偏移量。
3.根据权利要求1或2所述的方法,其特征在于,所述基于所述第一偏移量和所述第一线程待写入的消息的长度,获取第二偏移量,包括:
计算作为文件偏移量的第一数值,所述第一数值为所述第一偏移量和所述第一线程待写入的消息的长度之和;
如果所述第一偏移量与所述第一数值位于同一文件,将所述第一数值作为所述第二偏移量。
4.根据权利要求3所述的方法,其特征在于,还包括:
如果所述第一偏移量与所述第一数值没有位于同一文件,将下一文件的起始偏移量与所述消息的长度之和,作为所述第二偏移量。
5.根据权利要求1或2所述的方法,其特征在于,还包括:
响应于更新不成功,重新查询所述第一偏移量以及重新获取所述第二偏移量,并将所述当前的文件偏移量更新为所述第二偏移量。
6.根据权利要求1或2所述的方法,其特征在于,在所述向所述第一线程反馈所述第一偏移量之后,还包括:
存储所述第一线程写入的所述消息的内容。
7.根据权利要求6所述的方法,其特征在于,在所述存储所述第一线程写入的所述消息的内容之前,还包括:
计算作为文件偏移量的第二数值,所述第二数值为所述第一偏移量和所述第一线程待写入的消息的长度之和;
如果所述第一偏移量与所述第二数值没有位于同一文件,在当前文件的剩余空间填充预设的字符。
8.一种消息中间件的消息写入装置,其特征在于,包括:
查询单元,用于响应于第一线程的消息写入请求,查询第一偏移量,所述第一偏移量为当前的文件偏移量;
偏移量获取单元,用于基于所述第一偏移量和所述第一线程待写入的消息的长度,获取第二偏移量;
更新单元,用于使用自旋锁,将所述当前的文件偏移量更新为所述第二偏移量;
反馈单元,用于响应于更新成功,向所述第一线程反馈所述第一偏移量,所述第一偏移量用于所述第一线程向所述消息中间件写入所述消息。
9.一种消息中间件的消息写入设备,其特征在于,包括:存储器和处理器;
所述存储器,用于存储程序;
所述处理器,用于执行所述程序,实现如权利要求1~7中任一项所述的消息中间件的消息写入方法的各个步骤。
10.一种可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时,实现如权利要求1~7中任一项所述的消息中间件的消息写入方法的各个步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010806295.7A CN111930528A (zh) | 2020-08-12 | 2020-08-12 | 消息中间件的消息写入方法、装置、设备及可读存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010806295.7A CN111930528A (zh) | 2020-08-12 | 2020-08-12 | 消息中间件的消息写入方法、装置、设备及可读存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN111930528A true CN111930528A (zh) | 2020-11-13 |
Family
ID=73310682
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010806295.7A Pending CN111930528A (zh) | 2020-08-12 | 2020-08-12 | 消息中间件的消息写入方法、装置、设备及可读存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111930528A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114089912A (zh) * | 2021-10-19 | 2022-02-25 | 银联商务股份有限公司 | 基于消息中间件的数据处理方法及装置、存储介质 |
CN115113931A (zh) * | 2022-07-22 | 2022-09-27 | 瀚博半导体(上海)有限公司 | 数据处理系统、方法、人工智能芯片、电子设备和介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103645942A (zh) * | 2013-12-12 | 2014-03-19 | 北京奇虎科技有限公司 | 基于消息队列的共享内存写入及读取方法和系统 |
CN109271106A (zh) * | 2018-08-31 | 2019-01-25 | 华为技术有限公司 | 消息存储、读取方法及装置、服务器、存储介质 |
CN109471743A (zh) * | 2018-11-12 | 2019-03-15 | 深圳前海微众银行股份有限公司 | 日志收集方法、装置及计算机可读存储介质 |
-
2020
- 2020-08-12 CN CN202010806295.7A patent/CN111930528A/zh active Pending
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103645942A (zh) * | 2013-12-12 | 2014-03-19 | 北京奇虎科技有限公司 | 基于消息队列的共享内存写入及读取方法和系统 |
CN109271106A (zh) * | 2018-08-31 | 2019-01-25 | 华为技术有限公司 | 消息存储、读取方法及装置、服务器、存储介质 |
CN109471743A (zh) * | 2018-11-12 | 2019-03-15 | 深圳前海微众银行股份有限公司 | 日志收集方法、装置及计算机可读存储介质 |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114089912A (zh) * | 2021-10-19 | 2022-02-25 | 银联商务股份有限公司 | 基于消息中间件的数据处理方法及装置、存储介质 |
CN114089912B (zh) * | 2021-10-19 | 2024-05-24 | 银联商务股份有限公司 | 基于消息中间件的数据处理方法及装置、存储介质 |
CN115113931A (zh) * | 2022-07-22 | 2022-09-27 | 瀚博半导体(上海)有限公司 | 数据处理系统、方法、人工智能芯片、电子设备和介质 |
CN115113931B (zh) * | 2022-07-22 | 2023-02-14 | 瀚博半导体(上海)有限公司 | 数据处理系统、方法、人工智能芯片、电子设备和介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108648078B (zh) | 一种交易预处理方法、装置及电子设备 | |
CN108363806B (zh) | 数据库的多版本并发控制方法、装置、服务器及存储介质 | |
CN110188110B (zh) | 一种构建分布式锁的方法及装置 | |
CN110473100B (zh) | 一种基于区块链系统的交易处理方法及装置 | |
CN111897825A (zh) | 分布式事务处理方法和装置 | |
US11132294B2 (en) | Real-time replicating garbage collection | |
US9348659B2 (en) | Lock resolution for distributed durable instances | |
CN113127212B (zh) | 一种在区块链中处理交易的方法和装置 | |
CN108572876B (zh) | 一种读写锁的实现方法及装置 | |
CN111427859B (zh) | 一种消息处理方法、装置、电子设备及存储介质 | |
CN111930528A (zh) | 消息中间件的消息写入方法、装置、设备及可读存储介质 | |
CN110008041B (zh) | 一种消息处理方法及装置 | |
CN109933609B (zh) | 一种批量生成id的方法及终端 | |
CN104219235A (zh) | 一种分布式交易请求方法及装置 | |
US9170837B2 (en) | Transaction concurrent execution control system, method and program for carrying out a control of concurrently executing a transaction, including measuring execution time from starting to ending of transaction execution | |
US10313477B2 (en) | System and method for use of a non-blocking process with a resource pool in a computing environment | |
US11113251B2 (en) | Transaction manager | |
US10318520B2 (en) | System and method for reducing communications overhead in a distributed transactions environment by modifying implementation of the transaction end function | |
CN113342507B (zh) | 一种分布式锁服务实现方法、装置及计算机设备 | |
CN111124751B (zh) | 数据恢复方法及系统、数据存储节点、数据库管理节点 | |
CN113496732A (zh) | 用于分布式读/写锁定的系统和方法 | |
CN111679895A (zh) | 分布式定时任务的执行方法、装置、设备及可读存储介质 | |
CN110059115B (zh) | 一种数据读取方法和装置 | |
CN115858668A (zh) | 分布式事务处理方法、装置、电子装置及存储介质 | |
CN114647655A (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 | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20201113 |
|
RJ01 | Rejection of invention patent application after publication |