首页> 中国专利> 一种云消息服务中实现消息传递的方法和装置

一种云消息服务中实现消息传递的方法和装置

摘要

本发明实施例提供一种云消息服务中实现消息传递的方法和设备,该方法包括:接收第一分布式程序发送的消息,在分布式Key-Value存储系统中存储所述消息携带的消息数据,并递增所述消息对应的消息队列的发送消息序列号;接收第二分布式程序读取消息数据的请求,在所述分布式Key-Value存储系统中读取所述消息数据,将读取的所述消息数据发送给所述第二分布式程序,并在所述消息数据为所述消息队列的接收消息序列号对应的消息数据时,递增所述消息队列的接收消息序列号。本发明实施例通过为消息队列设置发送消息序列号和接收消息序列号,当第一分布式程序发送消息数据时,云消息服务设备按照消息队列的发送消息序列号在分布式Key-Value存储系统中存储接收到的消息数据,并递增修改发送消息序列号;当第二分布式程序请求接收消息数据时,云消息服务设备按照消息队列的接收消息序列号读取消息数据,并递增修改接收消息序列号。从而实现了云消息服务的高可用性和伸缩性要求,同时又保障了消息传递的顺序保证。

著录项

  • 公开/公告号CN102668516A

    专利类型发明专利

  • 公开/公告日2012-09-12

    原文格式PDF

  • 申请/专利权人 华为技术有限公司;

    申请/专利号CN201180003087.2

  • 发明设计人 邓金波;樊荣;赵军;

    申请日2011-12-02

  • 分类号H04L29/08(20060101);H04L12/58(20060101);

  • 代理机构

  • 代理人

  • 地址 518129 广东省深圳市龙岗区坂田华为总部办公楼

  • 入库时间 2023-12-18 06:28:50

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2014-09-17

    授权

    授权

  • 2012-11-07

    实质审查的生效 IPC(主分类):H04L29/08 申请日:20111202

    实质审查的生效

  • 2012-09-12

    公开

    公开

说明书

技术领域

本发明实施例涉及通信技术领域,并且更具体地,涉及数据安全通道 的处理方法及设备。本发明实施例涉及IT技术领域,并且更具体地,涉及 云消息服务中实现消息传递的方法和装置。

背景技术

随着云计算和移动互联网等技术的发展,部署在数据中心的各类服务 器、PC机、移动设备等构成一个复杂的全球规模的分布式系统,云消息服 务就是采用消息中间件为这个分布式系统提供通信的服务。

云消息服务首先应实现消息中间件的高可用性和伸缩性,保证能够为 大量的用户提供不间断的服务能力,并且能够根据负载变化动态调整资源; 其次是在保证前者的情况下提供消息传递的顺序保证。

云消息服务中实现高可用性和伸缩性的一种通常方法是使用分布式的 Key-Value(键值对)存储系统实现数据的存储,但是该方法并不能提供顺 序保证:实现云消息服务的云消息服务设备中每条消息都有多个副本存储 在多个服务器上,当分布式程序从云消息服务设备上接收消息时,云消息 服务设备一般基于带权重的随机选择算法来选择一部分服务器获取消息, 如果分布式程序持续向云消息服务设备请求接收消息,那么按照选择算法 最终将会遍历所有的服务器,所有消息都会返回给分布式程序,但是由于 每次请求都是选择一部分服务器来获取消息,也就无法保证接收消息的顺 序与发送消息的顺序相同。而很多程序对顺序保证存在要求,不能提供有 效顺序保证的云消息服务存在应用上的局限性。

如上所述,目前的消息中间件系统,还无法实现在满足云消息服务对 于高可用性和伸缩性的要求的同时,又能够提供很好的顺序保证,从而造 成云消息服务在应用上的局限性。

发明内容

本发明实施例提供了一种云信息服务中实现消息传递的方法和装置, 能够在保障云消息服务的高可用性和伸缩性要求的同时,提供很好的顺序 保证。

一方面,提供了一种云消息服务中实现消息传递的方法,包括,接收 第一分布式程序发送的消息,在分布式Key-Value存储系统中存储该消息携 带的消息数据,并递增所述消息对应的消息队列的发送消息序列号;接收 第二分布式程序读取消息数据的请求,在分布式Key-Value存储系统中读取 消息数据,将读取的消息数据发送给第二分布式程序,并在该消息数据为 该消息队列的接收消息序列号对应的消息数据时,递增该消息队列的接收 消息序列号。

另一方面,提供了一种云消息服务设备,包括:接口单元,用于接收 第一分布式程序发送的消息;接收第二分布式程序读取消息数据的请求, 以及将存储单元读取的消息数据发送给所述第二分布式程序;消息队列管 理单元,用于通知存储单元存储接口单元接收的消息携带的消息数据,并 递增所述消息对应的消息队列的发送消息序列号;根据接口单元接收的所 述读取消息数据的请求,通知所述存储单元读取消息数据,并在读取所述 消息队列的接收消息序列号对应的消息数据成功时,递增所述消息队列的 接收消息序列号。所述存储单元,包括分布式Key-Value存储系统,用于进 行所述消息数据的存储或读取。

本发明实施例通过为每个消息队列设置一个发送消息序列号和一个接 收消息序列号,当第一分布式程序发送消息数据时,云消息服务设备接收 数据并生成包含发送消息队列发送消息序列号的键值Key,用消息数据作 为数值Value,在分布式Key-Value存储系统中存储消息数据,并递增修改消 息队列的发送消息序列号;当第二分布式程序请求接收消息数据时,云消 息服务设备按照消息队列的接收消息序列号在分布式Key-Value存储系统 中读取消息数据,并递增修改消息队列的接收消息序列号。实现了云消息 服务的高可用性和伸缩性要求,同时又保障了消息传递的顺序保证。

附图说明

为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述中 所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是 本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳 动的前提下,还可以根据这些附图获得其他的附图。

图1是本发明实施例在分布式系统中实现云消息服务的系统架构图。

图2是本发明实施例中消息队列的元数据的结构示意图。

图3是本发明实施例中消息数据在Key-Value存储系统中的存储格式示 意图。

图4是根据本发明一个实施例的云消息服务中实现消息传递的方法。

图5是根据本发明另一个实施例的云消息服务中由分布式程序选择消 息传递提供顺序保证的方法。

图6是根据本发明一个实施例的云消息服务设备的框图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进 行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而 不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有 作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范 围。

首先对顺序保证进行简单说明。顺序保证是指,在进行通信的分布式 程序之间,分布式程序接收消息的顺序应与发送消息的顺序相同,不能出 现乱序,例如,分布式程序发送4条消息的顺序是:消息A-消息B-消息 C-消息D,则分布式程序接收这4条消息的顺序也应该是:消息A-消息B- 消息C-消息D,而不能是其他顺序,绝大多数分布式程序都要求能够提供 顺序保证。

图1是本发明实施例在分布式系统中实现云消息服务的系统架构图。 下面描述的本发明实施例可应用于图1所示的云消息服务系统架构中。

如图1所示,分布式程序发送消息数据给云消息服务设备或从云消息 服务设备中获取消息数据,从而实现分布式程序之间的消息传递。分布式 程序在分布式模块上运行,分布式程序之间的消息传递实际上是通过分布 式模块间的消息传递进行传递,同一分布式模块上运行的分布式程序之间 进行消息传递也要通过云消息服务设备。云消息服务设备主要分为三个部 分:对消息队列进行维护管理、进行消息传递的消息队列管理单元,实现 消息相关的数据存储的存储单元,以及与分布式程序接口的接口单元。

如图2所示,本发明实施例中为每个消息队列设置一个发送消息序列 号和一个接收消息序列号作为消息队列的元数据。当然,根据应用需要, 每个消息队列还可能设置是否保序、未读取成功消息序列号、消息队列长 度等一个或多个其他元数据。发送消息序列号和接收消息序列号均为一个 从初始状态开始递增的序列,两者的初始状态应该一致,如均从0开始递 增,或均从1开始递增。分布式程序每发送一条消息到消息队列中,该消 息队列的发送消息序列号就递增加一,分布式程序每从一个消息队列中接 收一条消息,该消息队列的接收消息序列号就递增加一。定义一个消息序 列号的最大值,当发送消息序列号超过消息序列号最大值时,发送消息序 列号进行反转,即重新从初始状态,例如0开始计数,同样的,接收消息 序列号超过消息序列号最大值时也会进行发转。当一个消息队列的接收消 息序列号小于发送消息序列号,或接收消息序列号大于发送消息序列号但 发送消息队列号比接收消息序列号多进行了一次反转时,表示该消息队列 中仍然存在未被分布式程序接收的消息,分布式程序可以从该消息队列接 收消息,当接收消息序列号等于发送消息序列号时,表示消息队列中的消 息已经被接收完了,则不会从该消息队列读取消息给分布式程序。一般, 消息序列号最大值会设置足够大,以避免出现反转的发送消息序列号接收 消息数据并递增,最终超过少反转一次的接收消息序列号而导致未读取的 消息数据被覆盖的情况。

如图3所示,消息数据在分布式Key-Value存储系统中进行存储时,用 包含消息序列号的信息组成Key,具体组成规则中至少要包含消息队列标 识、消息序列号,例如Key的组成可以为消息队列标识+消息序列号,或为 消息序列号+消息队列标识,并可根据需要添加其他信息作为Key的前缀或 后缀等,例如消息长度。用接收到的分布式程序消息中携带的消息数据作 为Value,云消息服务设备接收的分布式程序所发送的消息一般会携带消息 队列名称、消息数据,有时也会包含时间戳、数字签名等信息,本发明实 施例中仅指保存消息数据部分,当然,根据实际应用的消息传递需要也可 以保存消息携带的其他信息。因此,实现了在分布式Key-Value存储系统中 存储和访问消息数据,通过包含消息序列号的Key直接定位查找到分布式 存储系统中的消息数据。

分布式程序发送消息时,云消息服务设备修改消息队列的发送消息序 列号,并把发送消息序列号作为消息序列号按照规则生成Key,按照所生 成的Key在分布式Key-Value存储系统中进行消息数据的存储。分布式程 序需要接收消息时,云消息服务设备把消息队列的接收消息序列号作为消 息序列号按照规则生成Key,按照所生成的Key到分布式Key-Value存储系 统中读取消息数据,从而实现了消息传递的顺序保证。

此外,程序通过消息中间件进行消息传递,往往还有分发保证的要求。 分发保证的模型一般分为三种:最多一次分发、至少一次分发和严格一次 分发。最多一次分发是指:对于每一条消息,向消息中间件请求接收消息 的分布式程序最多只会接收到一次,但可能会出现接收不到的情况。至少 一次分发是指:对于每一条消息,向消息中间件请求接收消息的分布式程 序一定可以接收到,但可能会出现重复接收的情况。严格一次分发是指: 对于每一条消息,向消息中间件请求接收消息的分布式程序一定可以接收 到,并且只会接收到一次。通常来说,大多数应用程序期望严格一次分发 的保证。

云消息服务中实现高可用性和伸缩性的通常方法是使用分布式的 Key-Value存储系统进行消息数据的存储,但是该方法并不能提供分发保 证:云消息服务设备中每条消息数据都有多个副本存储在多个服务器上, 当分布式程序从云消息服务设备上接收消息数据时,云消息服务设备一般 基于带权重的随机选择算法来选择一部分服务器获取消息数据,分布式程 序持续向云消息服务设备请求接收消息数据,那么最终将会遍历所有的服 务器,所有消息数据都会返回给程序,如果一次分布式程序请求接收消息 数据,而存储了被接收消息数据副本的某个服务器发生故障,那么故障服 务器上的这条消息数据的状态不会变为已接收或者删除,在下一次请求接 收消息数据时,该服务器从故障状态恢复之后,这条消息数据就会被重复 接收,也就是会出现重复消息,只能保证至少一次分发。而很多应用程序 对分发保证存在要求,不能提供严格一次分发保证的云消息服务存在应用 上的局限性。综上所述,目前的消息中间件系统,还不能在既满足云消息 服务的高可用性和伸缩性的要求,又能够提供很好的顺序保证,并进一步 提供分发保证的能力,从而造成云消息服务在应用上的局限性。

每个消息队列都设置了至少包括消息队列标识、发送消息序列号、接 收消息序列号的元数据,可以将消息队列的元数据存储在关系型数据库中, 借助关系型数据库的特点保证元数据操作的事务性,即当云消息服务中多 个程序或者多个服务器节点需要同时更新一个消息队列的元数据时,所有 操作将被作为一个单独的操作对待,要么成功完成,要么根本不执行,不 会出现一部分成功一部分失败的情况,也就不会出现元数据操作重复的情 况,按照不会操作重复的消息队列的发送消息序列号、接收消息序列号进 行消息数据的读取,也就避免了出现重复消息,从而实现了严格一次的分 发保证能力。

本发明实施例在图1所述的系统架构上,当第一分布式程序发送消息 数据时,云消息服务设备接收消息数据,按照消息队列的发送消息序列号 在分布式Key-Value存储系统中存储消息数据,并递增修改发送消息序列 号;当第二分布式程序请求接收消息数据时,云消息服务设备按照消息队 列的接收消息序列号读取消息数据,并递增修改接收消息序列号,实现了 云消息服务的消息传递的顺序保证。从而满足了云消息服务的高可用性和 伸缩性要求,同时又实现了消息的顺序保证。

并进一步地,可以通过将消息队列的包括消息队列标识、发送消息序 列号、接收消息序列号的元数据存储在关系型数据库中实现严格一次的分 发保证能力。从而满足了云消息服务的高可用性和伸缩性要求,又同时保 障了消息的顺序保证及分发保证。

图4是本发明一个实施例云消息服务中实现消息传递的方法。

401,接收第一分布式程序发送的消息,在分布式Key-Value存储系统 中存储所接收消息携带的消息数据,并递增消息所对应的消息队列的发送 消息序列号。

可以采用如下的方法,接收到第一分布式程序发送的消息,消息携带 包含需要传递消息数据的消息队列的消息队列标识,用该消息队列的发送 消息序列号生成包含消息序列号的键值Key,键值Key中至少要包含消息 队列标识、消息序列号,具体格式可以为消息队列标识+消息序列号,或为 消息序列号+消息队列标识,并可根据业务需要添加其他信息,如消息长度 等。从而按照所生成的Key在分布式Key-Value存储系统中存储收到的消 息携带的消息数据,并将该消息队列的发送消息序列号递增加一。

402,接收第二分布式程序读取消息数据的请求,在分布式Key-Value 存储系统中读取消息数据,将读取的消息数据发送给第二分布式程序,并 在该消息数据为该消息队列的接收消息序列号对应的消息数据时,递增该 消息队列的接收消息序列号。

假如消息数据读取方式为读取的是该消息队列的接收消息序列号对应 的消息数据,此时,需要递增该消息队列的接收消息序列号。

可以采用如下的方法,接收第二分布式程序读取消息数据的请求,请 求中包含读取消息数据的消息队列标识,当该消息队列的接收消息序列号 不等于发送消息序列号时,用接收消息序列号生成键值Key,当然,此处 生成Key的格式应与接收消息数据时生成键值Key一致,按照所生成的Key 在分布式Key-Value存储系统中读取消息数据,若读取成功,则将读取的消 息数据传递给第二分布式程序,并将该消息队列的接收消息序列号递增加 一。当该消息队列的接收消息序列号等于发送消息序列号时,不读取消息 数据。第二分布式程序读取消息数据请求也可能一次申请读取多条消息数 据,这时的实现方法和上面类似,只是会重复进行多次读取消息数据和修 改接收消息序列号的操作。

当然,消息队列的发送消息序列号和接收消息序列号均会定义一个最 大值,如果消息序列号超过定义的最大值,则消息序列号会进行反转,即 重新从初始值开始计数。例如,消息序列号的最大值定义为255,初始值为 0,当发送消息序列号为255时又接收到一条消息,此时会把消息队列的发 送消息序列号修改为0。上述的401、402步骤中,对消息序列号进行递增 处理时,如果达到了消息序列号的最大值,则将消息序列号进行反转处理。

本实施例中优选地将消息队列的元数据存储在关系型数据库中,实现 消息传递的严格一次的分发保证能力。也可以以消息队列标识作为键值 Key,元数据作为Value存储在分布式Key-Value存储系统中。相应地,步 骤401、402会到关系型数据库或分布式Key-Value存储系统中读取或修改 元数据。上述元数据中至少包含消息队列标识、发送消息序列号、接收消 息序列号信息。

本发明实施例在当第一分布式程序发送消息数据时,云消息服务设备 按照消息队列的发送消息序列号在分布式Key-Value存储系统中存储消息, 并递增修改消息队列的发送消息序列号;当第二分布式程序请求接收消息 数据时,云消息服务设备根据消息队列的接收消息序列号读取消息数据, 并递增修改消息队列的接收消息序列号,实现了云消息服务的消息传递的 顺序保证。并进一步地,通过在关系型数据库中存储和修改消息队列的元 数据,提供了严格一次的分发保证能力,从而保障了消息传递的顺序保证 及严格一次分发保证。

图5是根据本发明另一个实施例的云消息服务中由分布式程序选择是 否需要消息传递提供顺序保证的方法。图5中在读取消息数据不成功时, 由分布式程序选择是否需要消息传递提供顺序保证,来确定消息数据的读 取顺序,本实施例在图4所示实施例的基础上对其中的402步骤进行了细 化,而接收第一分布式程序发送消息数据的步骤与图4所示实施例中401 步骤的方法基本相同,因此省略了接收第一分布式程序发送消息数据步骤 的图示和描述。

501,接收第二分布式程序读取消息数据的请求,在分布式Key-Value 存储系统中读取消息。

可以采用如下的方法,接收第二分布式程序读取消息数据的请求,请 求中包含读取消息数据的消息队列标识,当该消息队列的接收消息序列号 不等于发送消息序列号时,用接收消息序列号生成键值Key,生成Key的 格式应与接收消息数据时生成Key的格式一样,按照所生成的Key在分布 式Key-Value存储系统中读取消息数据。当该消息队列的接收消息序列号等 于发送消息序列号时,不读取消息数据。

502,501步骤中在分布式Key-Value存储系统中读取消息数据是否成 功。

当存储消息数据的一个或多个存储系统节点发生故障等情况,会导致 云消息服务设备读取消息数据不成功。

503,如果502步骤中读取消息数据不成功,则进一步判断该第二分布 式程序的消息传递是否需要顺序保证。

第二分布式程序是否需要消息传递的顺序保证可以根据该消息队列的 元数据“是否保序”的值来判断,值为是则表示需要顺序保证,为否则表 示不需要顺序保证。进一步地,消息队列的“是否保序”的值可以由分布 式程序通过命令消息设置,此处的分布式程序可以是消息传递中发送消息 数据的第一分布式程序也可以是接收消息数据的第二分布式程序。例如, 第一分布式程序发送包含需要保序指示的参数的命令消息,将消息队列的 “是否保序”的值设为是。也可以在第二分布式程序读取消息数据的请求 中或者在第一分布式程序发送消息数据的消息中提供参数设置消息队列 “是否保序”的值,例如在第二分布式程序读取消息数据的请求中包含参 数指示需要保序,则将消息队列“是否保序”的值置为是。

此外,判断第二分布式程序是否需要消息传递的顺序保证也可以根据 第二分布式程序在读取消息数据的请求中包含的指示是否保序的参数,当 指示保序则表示需要顺序保证,指示不保序则表示不需要顺序保证。

如果确定该第二分布式程序消息传递需要提供顺序保证,则本次消息 数据读取流程结束,不会修改接收消息序列号。这样,在进行下次消息数 据读取流程时,按照接收消息序列号会继续读取本次未读取的消息数据, 直到成功读取到该消息数据为止,从而实现顺序保证。

504,如果503步骤中确定该第二分布式程序消息传递不需要提供顺序 保证,则记录读取不成功的消息序列号,读取下一接收消息序列号的消息 数据。

具体可以为,在该消息队列的未读取成功消息序列号中添加本次未读 取成功的消息序列号,并递增消息队列的接收消息序列号,读取下一个接 收消息序列号的消息数据,直至读取消息数据成功或消息队列中已无消息 数据可读,即该消息队列的接收消息序列号等于发送消息序列号。

505,将读取的消息数据返回给第二分布式程序,并修改消息队列的接 收消息序列号。

具体可以为,将读取成功的消息数据返回给第二分布式程序,并修改 该消息队列的接收消息序列号为读取成功的消息序列号加1。

正常的消息数据读取方式中,读取的是该消息队列的接收消息序列号 对应的消息数据,此时,需要递增该消息队列的接收消息序列号,即该消 息队列的接收消息序列号为读取成功的消息序列号加1。

同样的,消息队列的接收消息序列号会定义一个最大值,如果接收消 息序列号超过定义的最大值,则消息序列号会进行反转,即重新从初始值 开始计数。

在本发明实施例中,进一步地,在步骤501中接收到第二分布式程序 读取消息数据的请求,会首先确定该消息队列中是否有原读取不成功被跳 过的未读消息数据,如有则读取该消息数据。具体实施方式可以为判断该 消息队列的元数据“未读取成功消息序列号”是否为空,如有未读取成功 的消息数据,则从未读取成功消息序列号中获取一个消息序列号,采用该 消息序列号生成键值Key,按照所生成的Key在分布式Key-Value存储系统 中读取消息数据,如果读取成功则将读取的消息数据传递给第二分布式程 序,并在该消息队列的未读取成功消息序列号中删除本次已读取的消息序 列号,本次消息数据读取过程结束。如读取不成功则继续从未读取成功消 息序列号中获取下一个消息序列号,直至读取消息数据成功或未读取成功 消息序列号中已没有新的消息序列号可以进行消息数据读取。如该消息队 列的未读取成功消息序列号为空或未读取成功消息序列号中所有消息序列 号对应的消息数据均读取不成功,则按照正常的消息数据读取方式读取该 消息队列的接收消息序列号对应的消息数据。

第二分布式程序读取消息数据请求也可能一次申请读取多条消息数 据,这时的实现方法和上面类似,只是会重复进行多次读取消息数据和修 改接收消息序列号的操作。

本发明实施例中键值Key至少要包含消息队列标识、消息序列号,具 体格式可以为消息队列标识+消息序列号,或为消息序列号+消息队列标识, 并可根据业务需要添加其他信息,如消息长度等,在分布式Key-Value存储 系统中存储第一分布式模块发送的消息数据与读取消息数据给第二分布式 程序时生成键值Key的格式应相同。

本实施例中优选地将消息队列的元数据存储在关系型数据库中,也可 以以消息队列标识作为键值Key,元数据作为Value存储在分布式Key-Value 存储系统中。相应地,会到关系型数据库或分布式Key-Value存储系统中读 取或修改元数据。上述元数据中至少包含消息队列标识、发送消息序列号、 接收消息序列号、是否保序、未读取成功消息序列号等信息。

本发明实施例在第一分布式程序发送消息数据时,在分布式Key-Value 存储系统中存储消息数据,并递增修改消息队列的发送消息序列号;在第 二分布式程序请求消息数据时,根据消息队列的接收消息序列号读取消息 数据,当读取消息数据失败时,根据分布式程序是否需要顺序保证的设置 确定是否继续读取该消息数据直至读取成功,或者递增修改消息队列的接 收消息序列号,继续读取下一个接收消息序列号的消息数据,同时将未读 取成功的消息序列号记录下来,在后续第二分布式程序请求读取消息数据 时再进行读取。从而实现了根据分布式程序的设置确定是否需要云消息服 务提供严格的顺序保证。并进一步地,通过在关系型数据库中存储和修改 消息队列的元数据,提供了严格一次的分发保证能力,从而保障了消息传 递的顺序保证及分发保证。

图6是根据本发明一个实施例的云消息服务设备的框图。图6的云消 息服务设备包括接口单元601、消息队列管理单元602和存储单元603。

接口单元601用于接收第一分布式程序发送的消息;接收第二分布式程 序读取消息数据的请求,以及将存储单元603读取的消息数据发送给第二 分布式程序。消息队列管理单元602用于通知存储单元603存储接口单元 601接收的消息携带的消息数据,并递增所述消息对应的消息队列的发送消 息序列号;根据接口单元601接收的读取消息数据的请求,通知存储单元 603读取消息数据,并在读取该消息队列的接收消息序列号对应的消息数据 成功时,递增该消息队列的接收消息序列号。存储单元603,包括分布式 Key-Value存储系统,用于进行所述消息数据的存储或读取。

可以采用如下的方法,接口单元接收到第一分布式程序发送的消息, 消息中包含需要传递消息数据的消息队列的消息队列标识,消息队列管理 单元用该消息队列的发送消息序列号生成包含消息序列号的键值Key。消 息队列管理单元通知存储单元根据键值Key在分布式Key-Value存储系统 中存储收到的消息携带的消息数据,消息队列管理单元将该消息队列的发 送消息序列号递增加一。

接口单元接收到第二分布式程序读取消息数据的请求,请求中包含读 取消息数据的消息队列标识。当该消息队列的接收消息序列号不等于发送 消息序列号时,消息队列管理单元用接收消息序列号生成键值Key,通知 存储单元在分布式Key-Value存储系统中读取消息数据。若读取成功,接口 单元将读取的消息数据传递给第二分布式程序,消息队列管理单元将该消 息队列的接收消息序列号递增加一。

进一步地,如果存储单元读取消息数据不成功,则消息队列管理单元 判断第二分布式程序的消息传递是否需要顺序保证。如果需要提供顺序保 证,则消息队列管理单元会通知存储单元继续读取本次未读取的消息数据, 直到成功读取到该消息数据为止。如果第二分布式程序消息传递不需要提 供顺序保证,则消息队列管理单元记录读取不成功的消息序列号,并递增 消息队列的接收消息序列号,通知存储单元读取下一接收消息序列号的消 息数据。具体方法可以为,消息队列管理单元在该消息队列的未读取成功 消息序列号中添加本次未读取成功的消息序列号,并读取下一个接收消息 序列号的消息数据,直至读取消息数据成功或消息队列中已无消息数据可 读,即该消息队列的接收消息序列号等于发送消息序列号。

上述消息队列管理单元判断第二分布式程序是否需要消息传递的顺序 保证可以根据该消息队列的元数据“是否保序”的值来判断,值为是则表 示需要顺序保证,为否则表示不需要顺序保证。进一步地,消息队列的是 否保序的值可以由消息队列管理单元根据分布式程序的命令消息进行设 置,分布式程序可以是消息传递中发送消息数据的第一分布式程序也可以 是接收消息数据的第二分布式程序。例如,第一分布式程序发送包含需要 保序指示的参数的命令消息,由消息队列管理单元将消息队列的是否保序 的值设为是。也可以由消息队列管理模块根据第二分布式程序读取消息数 据的请求或者第一分布式程序发送消息数据的消息携带的参数进行设置, 例如在第二分布式程序读取消息数据的请求中包含参数指示消息传递需要 保序,则消息队列管理单元将消息队列是否保序的值置为是。此外,消息 队列管理单元判断第二分布式程序是否需要消息传递的顺序保证也可以根 据第二分布式程序在读取消息数据的请求中包含的指示是否保序的参数, 当指示保序则表示需要顺序保证,指示不保序则表示不需要顺序保证。

在本发明实施例中,进一步地,接收单元接收到第二分布式程序读取 消息数据的请求,消息队列管理单元会先确定该消息队列中是否有原未读 取成功被跳过的未读消息数据,具体可以通过判断该消息队列的元数据“未 读取成功消息序列号”是否为空。如有未读取成功的消息数据,则通知存 储单元读取该消息数据。具体的实施方式可以为,消息队列管理单元从未 读取成功消息序列号中获取一个消息序列号,采用该消息序列号生成键值 Key,通知存储单元在分布式Key-Value存储系统中读取消息数据,如果读 取成功则由接口单元将读取的消息数据传递给第二分布式程序,并由消息 队列管理单元在该消息队列的未读取成功消息序列号中删除本次已读取成 功的消息序列号。如读取不成功,则消息队列管理单元继续从该消息队列 的未读取成功消息序列号中获取下一个消息序列号,直至读取消息数据成 功或未读取成功消息序列号中已没有新的消息序列号可以进行消息数据读 取。如该消息队列的未读取成功消息序列号为空或未读取成功消息序列号 中所有消息序列号对应的消息数据均读取不成功,则消息队列管理单元通 知存储单元获取消息队列的接收消息序列号对应的消息数据。

本发明实施例中键值Key至少要包含消息队列标识、消息序列号,具 体格式可以为消息队列标识+消息序列号,或为消息序列号+消息队列标识, 并可根据业务需要添加其他信息,如消息长度等,在分布式Key-Value存储 系统中存储第一分布式模块发送的消息数据与读取消息数据给第二分布式 程序时生成键值Key的格式应相同。键值Key可以由消息队列管理单元生 成后,然后通知存储单元根据Key在分布式Key-Value存储系统中存储或 读取消息数据。消息队列管理单元也可以仅传递消息队列的消息队列标识、 消息序列号等信息给存储单元,由存储单元生成键值Key,在分布式 Key-Value存储系统中存储或读取消息数据。

当然,本实施例中消息队列的发送消息序列号和接收消息序列号均会 定义一个最大值,消息序列号超过定义的最大值,则消息序列号会进行反 转,即重新从初始值开始计数。消息队列管理单元对消息序列号进行递增 处理时,如果达到了消息序列号的最大值,则将消息序列号进行反转处理。

本实施例中存储单元还可以进一步地包括关系型数据库,并优选地将 消息队列的元数据存储在关系型数据库中,也可以以消息队列标识作为键 值Key,元数据作为Value存储在分布式Key-Value存储系统中。存储单元 也会相应地在关系型数据库或分布式Key-Value存储系统中读取或修改消 息队列的元数据。上述元数据中至少包含消息队列标识、发送消息序列号、 接收消息序列号、是否保序、未读取成功消息序列号等信息中的一种或几 种。

本实施例中的分布式Key-Value存储系统和关系型数据库,作为存储单 元的一部分,在物理上可以和云消息服务设备的其他部分在一起,也可以 分布在多个网络物理实体上。

因此,本发明实施例的云消息服务设备在第一分布式程序发送消息时, 在分布式Key-Value存储系统中存储该消息携带的消息数据,并递增修改消 息队列的发送消息序列号;在第二分布式程序请求接收消息数据时,根据 消息队列的接收消息序列号读取消息数据,并递增修改消息队列的接收消 息序列号,实现了云消息服务的消息传递的顺序保证。并进一步地,当读 取消息数据失败时,根据分布式程序是否需要顺序保证的需求确定是否继 续读取该消息数据直至读取成功,或者继续读取下一个接收消息序列号的 消息数据,同时将未读取成功的消息序列号记录下来,在后续分布式程序 请求读取消息数据时再进行读取,从而实现了根据分布式程序的设置确定 是否需要云消息服务提供严格的顺序保证。并进一步地,通过在关系型数 据库中存储和修改消息队列的元数据,提供了严格一次的分发保证能力, 从而保障了消息传递的顺序保证及分发保证。

本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的 各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合 来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照 功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件 方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员 可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实 现不应认为超出本发明的范围。

所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述 描述的系统、装置和单元的具体工作过程,可以参考前述方法实施例中的 对应过程,在此不再赘述。

在本申请所提供的几个实施例中,应该理解到,所揭露的系统、装置 和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅 是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实 现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成 到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论 的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单 元的间接耦合或通信连接,可以是电性,机械或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的, 作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地 方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的 部分或者全部单元来实现本实施例方案的目的。

另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元 中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在 一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软 件功能单元的形式实现。

所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销 售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解, 本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方 案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储 在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人 计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全 部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM, Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、 磁碟或者光盘等各种可以存储程序代码的介质。

以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局 限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可 轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明 的保护范围应所述以权利要求的保护范围为准。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号