CN107181805B - 一种在微服务架构下实现全局有序重演的方法 - Google Patents
一种在微服务架构下实现全局有序重演的方法 Download PDFInfo
- Publication number
- CN107181805B CN107181805B CN201710384544.6A CN201710384544A CN107181805B CN 107181805 B CN107181805 B CN 107181805B CN 201710384544 A CN201710384544 A CN 201710384544A CN 107181805 B CN107181805 B CN 107181805B
- Authority
- CN
- China
- Prior art keywords
- message
- logical
- micro services
- time stamp
- layer
- 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
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/10—Protocols in which an application is distributed across nodes in the network
-
- 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
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04J—MULTIPLEX COMMUNICATION
- H04J3/00—Time-division multiplex systems
- H04J3/02—Details
- H04J3/06—Synchronising arrangements
- H04J3/0635—Clock or time synchronisation in a network
- H04J3/0638—Clock or time synchronisation among nodes; Internode synchronisation
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04J—MULTIPLEX COMMUNICATION
- H04J3/00—Time-division multiplex systems
- H04J3/02—Details
- H04J3/06—Synchronising arrangements
- H04J3/0635—Clock or time synchronisation in a network
- H04J3/0638—Clock or time synchronisation among nodes; Internode synchronisation
- H04J3/0647—Synchronisation among TDM nodes
- H04J3/065—Synchronisation among TDM nodes using timestamps
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/54—Indexing scheme relating to G06F9/54
- G06F2209/547—Messaging middleware
Landscapes
- Engineering & Computer Science (AREA)
- Computer Networks & Wireless Communication (AREA)
- Signal Processing (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Data Exchanges In Wide-Area Networks (AREA)
- Computer And Data Communications (AREA)
Abstract
本发明涉及微服务架构下的信息数据处理技术领域,具体来说是一种在微服务架构下实现全局有序重演的方法,每个节点的逻辑时钟层内部都维护一个二元组形式的逻辑时钟{T,C},T初始化为0,C初始化为0。每条传递的消息m都携带两个逻辑时戳:ts(m)对应m的发送,tr(m)对应m的接收。ts(m)和tr(m)的格式也是如上所示的二元组{T,C}。本发明同现有技术相比,其优点在于:在应用软件层和消息中间件之间设有逻辑时钟层,作为逻辑时钟和逻辑时间戳的维护逻辑,逻辑时钟会同时参考本机物理时钟和消息传递的因果时序,且由于逻辑时钟的T分量和事件的物理时间非常接近,易于按指定倍速进行重演。
Description
[技术领域]
本发明涉及微服务架构下的信息数据处理技术领域,具体来说是一种在微服务架构下实现全局有序重演的方法。
[背景技术]
在微服务架构下,整个系统由许多高内聚、低耦合的微服务构成。为完成特定业务,不同微服务通过彼此收发消息来完成协作,而在不同业务下消息的流动模式可能是完全不同的。为实现高可用性,单个微服务可能被构建成一个高可用集群,整个集群作为一个整体对外提供服务。
微服务架构是一个分布式系统,各个微服务之间仅仅通过彼此传递的消息互相协调。出于性能考虑,微服务架构通常没有中心化的全局日志,因为如果全部日志都通过一个中心点来维护,这个点就会成为整个系统的瓶颈。通常每个微服务只负责维护自己的日志。
如果没有特别的措施,依靠各微服务的日志只能保证有序重演微服务自身的历史,无法全局有序地重演整个系统的历史。比如经过一天后,微服务A的日志项只有10条记录,微服务B和C的日志项各有10亿条记录。如果仅仅让每个微服务读取自身日志重放,微服务A可能不到1秒就重现了历史,而微服务B和C需要耗费18小时才能重现历史,而实际上微服务A的10条记录是为了响应微服务B和微服务C在当天23:59后发送的各5条请求而产生的,如果真要全局性地重演整个系统的历史,微服务A的日志重演应该发生在微服务B和C的日志重演接近尾声时,如此才是全系统历史的重演。
单纯为微服务的日志项打上高精度时间戳并不能解决问题,因为不同主机的时钟并不完全同步,且时间戳的精度也并非无限。若微服务B和C几乎同时发出消息给微服务A,微服务A几乎瞬间收到消息,2个消息发送事件和1个消息接收事件在各自日志中的时间戳甚至可能出现倒挂。单纯按照日志时间戳重演整个系统的历史,可能会先重演微服务A收到来自微服务B的消息,随后再重演微服务B发出这条消息,显然是荒谬的。
标准的Lamport逻辑时钟可以解决按因果序重演全系统历史的问题,但逻辑时钟只是一个单调递增的大整数,并不和物理时间戳对应,在全局重演时无法以指定倍速重演真实历史。比如全天微服务A在9点,10点和19点分别给微服务B发送了3个请求并获得了应答,按Lamport逻辑时钟重放的时候3个请求的回放间隔就是均匀的,而现实生活中间隔并不均匀。
因此,出于事后审计、故障重现、程序调试等目的,需要设计一种能够在微服务架构下支持按指定倍速实现全局有序重演的方法。
[发明内容]
本发明的目的在于解决现有技术的不足,提供一种在微服务架构下实现全局有序重演的方法,能够在微服务架构下支持按指定倍速实现全局有序重演,以实现事后审计、故障重现、程序调试的目的。
为了实现上述目的,设计一种在微服务架构下实现全局有序重演的方法,所述的微服务和微服务之间通过消息中间件进行通信,其特征在于在消息中间件上实现逻辑时钟算法,所述的逻辑时钟算法同时参考本机物理时钟和消息传递的因果时序,在应用软件层和消息中间件之间设有逻辑时钟层,作为逻辑时钟和逻辑时间戳的维护逻辑,在每个节点的逻辑时钟层内部都维护一个二元组形式的逻辑时钟{T,C},其中T和C初始化均为0,每条传递的消息m都携带两个二元组{T,C}格式的逻辑时间戳ts(m)和tr(m):其中,ts(m)对应m的发送,tr(m)对应m的接收,两个逻辑时间戳之间的比较规则是:先看T分量哪个大;若相等则再看C分量哪个大,具体步骤包括:
a.当节点i是单机微服务,应用软件向逻辑时钟层Pi提交待发消息m时:
1)Pi调整自身逻辑时钟{Ti,Ci}如下:
T=max{Pi本地物理时钟,Ti};
如果T>Ti则Ti=T,Ci=0;
否则,Ti保持不变,Ci=Ci+1;
2)设置m携带的发送逻辑时间戳,ts(m)={Ti,Ci},并记录日志;
3)向消息中间件提交消息m;
b.当节点j是单机微服务,逻辑时钟层从消息中间件收到消息m时:
1)调整自身逻辑时钟{Tj,Cj}如下:
T=max{Tj,Pj本地物理时钟,ts(m).T},其中,ts(m).T是指ts(m)的T分量;
如果T>Tj且T>ts(m).T,则Tj=T,Cj=0;
否则Tj=T,Cj=max{Cj,ts(m).C}+1;
2)设置m携带的接收逻辑时间戳,tr(m)={Tj,Cj},并记录日志;
3)向应用层投递消息m;
c.当集群i的应用软件向逻辑时钟层Pi提交待发消息m时:
1)Pi调整自身逻辑时钟{Ti,Ci};
Ti不变,Ci=Ci+1,使集群全部主机的逻辑时钟一致;
2)设置m携带的发送逻辑时间戳,ts(m)={Ti,Ci},并记录日志;
3)集群主节点向消息中间件提交消息m;
d.当集群j主节点的逻辑时钟层从消息中间件收取消息m时:
1)调整自身逻辑时钟
T=max{Tj,Pj本地物理时钟,ts(m).T};
如果T>Tj且T>ts(m).T则Tj=T,Cj=0;
否则Tj=T,Cj=max{Cj,ts(m).C}+1;
2)设置m携带的接收逻辑时间戳,tr(m)={Tj,Cj},并记录日志;
3)利用RAFT等原子组播协议通过消息中间件将m可靠传送给从节点后,向应用层投递消息m;
e.当集群j从节点的逻辑时钟层收到主节点送来的消息m时:
1)自身逻辑时钟=tr(m),并记录日志;
2)向应用层投递消息m;
读取系统中每个微服务的日志,把日志项按逻辑时钟排序,即可将排序后的日志项按因果顺序单步重演整个系统中的消息收发事件,逻辑时钟的T分量和事件的物理时间非常接近,易于按指定倍速进行重演。
本发明同现有技术相比,其优点在于:在应用软件层和消息中间件之间设有逻辑时钟层,作为逻辑时钟和逻辑时间戳的维护逻辑,逻辑时钟会同时参考本机物理时钟和消息传递的因果时序,且由于逻辑时钟的T分量和事件的物理时间非常接近,易于按指定倍速进行重演。
[附图说明]
图1是实施例的示意图;
图2是逻辑时钟层的示意图。
[具体实施方式]
下面结合附图对本发明作进一步说明,这种方法的原理对本专业的人来说是非常清楚的。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
为确保按指定倍速重演,本方法要求交易系统中存在某种主机物理时钟同步机制。根据重演需求的不同,可以允许不同的误差,通常情况下,NTP已经满足大多数情况的需求,如果辅以适当硬件的PTP时钟对时,更可以提供微秒级的误差。
微服务和微服务之间通过消息中间件进行通信。为了解决全局有序重演问题,在消息收发中间件上实现如下改进版的Lampport逻辑时钟算法,参见图2,对逻辑时钟、逻辑时间戳的维护逻辑被设计为独立的一层功能模块,位于应用软件之下,消息中间件之上,这层功能模块称为“逻辑时钟层”。和标准Lamport逻辑时钟算法只捕获消息传递的因果时序不同,本发明使用的逻辑时钟会同时参考本机物理时钟和消息传递的因果时序。
本发明适用的微服务可以只有单机,也可以是一个高可用集群。当使用高可用集群时,需要此微服务基于RAFT或PBFT等有唯一主节点的共识算法构建。在一个集群内部,主节点会从多个输入消息中间件读取消息后排序,自己按此顺序处理消息,而其他节点会从主节点处获得排序后的消息,然后按同样的顺序处理。
每个节点的逻辑时钟层内部都维护一个二元组形式的逻辑时钟{T,C},T初始化为0,C初始化为0。每条传递的消息m都携带两个逻辑时戳:ts(m)对应m的发送,tr(m)对应m的接收。ts(m)和tr(m)的格式也是如上所示的二元组{T,C}。
两个逻辑时间戳A和B的比较规则是:先看T分量哪个大;若相等则再看C分量哪个大。
单机时的微服务节点,其逻辑时钟处理方式和集群节点的逻辑时钟有所不同。
具体步骤包括:
a.当节点i是单机微服务,应用软件向逻辑时钟层Pi提交待发消息m时:
1)Pi调整自身逻辑时钟{Ti,Ci}如下:
T=max{Pi本地物理时钟,Ti};
如果T>Ti则Ti=T,Ci=0;
否则,Ti保持不变,Ci=Ci+1;
2)设置m携带的发送逻辑时间戳,ts(m)={Ti,Ci},并记录日志;
3)向消息中间件提交消息m;
b.当节点j是单机微服务,逻辑时钟层从消息中间件收到消息m时:
1)调整自身逻辑时钟{Tj,Cj}如下:
T=max{Tj,Pj本地物理时钟,ts(m).T};
如果T>Tj且T>ts(m).T,则Tj=T,Cj=0;
否则Tj=T,Cj=max{Cj,ts(m).C}+1;
2)设置m携带的接收逻辑时间戳,tr(m)={Tj,Cj},并记录日志;
3)向应用层投递消息m;
c.当集群i的应用软件向逻辑时钟层Pi提交待发消息m时:
1)Pi调整自身逻辑时钟{Ti,Ci};
Ti不变,Ci=Ci+1,使集群全部主机的逻辑时钟一致;
2)设置m携带的发送逻辑时间戳,ts(m)={Ti,Ci},并记录日志;
3)集群主节点向消息中间件提交消息m;
d.当集群j主节点的逻辑时钟层从消息中间件收取消息m时:
1)调整自身逻辑时钟
T=max{Tj,Pj本地物理时钟,ts(m).T};
如果T>Tj且T>ts(m).T则Tj=T,Cj=0;
否则Tj=T,Cj=max{Cj,ts(m).C}+1;
2)设置m携带的接收逻辑时间戳,tr(m)={Tj,Cj},并记录日志;
3)利用RAFT等原子组播协议通过消息中间件将m可靠传送给从节点后,向应用层投递消息m;
e.当集群j从节点的逻辑时钟层收到主节点送来的消息m时:
1)自身逻辑时钟=tr(m),并记录日志;
2)向应用层投递消息m;
读取系统中每个微服务的日志,把日志项按逻辑时钟排序,即可将排序后的日志项按因果顺序单步重演整个系统中的消息收发事件,逻辑时钟的T分量和事件的物理时间相接近,易于按指定倍速进行重演。
实施例
参见图1,微服务A是单机的,微服务B是一个集群,节点2是当前主节点,节点3是从节点。微服务C是一个集群,节点4是当前主节点,节点5是从节点。
系统中发生的消息收发事件以各节点本机物理时间标注,逻辑时钟依次如下表:
根据逻辑时间戳,尽管各主机的本地时钟有少许偏移,但根据节点各日志重构出的全局事件发生顺序示:
事件的逻辑时间戳一方面和物理时间保持了相当的接近,另一方面也保持了事件的因果顺序。
Claims (4)
1.一种在微服务架构下实现全局有序重演的方法,所述的微服务和微服务之间通过消息中间件进行通信,其特征在于在消息中间件上实现逻辑时钟算法,所述的逻辑时钟算法同时参考本机物理时钟和消息传递的因果时序,在应用软件层和消息中间件之间设有逻辑时钟层,作为逻辑时钟和逻辑时间戳的维护逻辑,在每个节点的逻辑时钟层内部都维护一个二元组形式的逻辑时钟{T,C},其中T和C初始化均为0,每条传递的消息m都携带两个二元组{T,C}格式的逻辑时间戳ts(m)和tr(m):其中,ts(m)对应m的发送,tr(m)对应m的接收,两个逻辑时间戳之间的比较规则是:先看T分量哪个大;若相等则再看C分量哪个大,具体步骤包括:
a.当节点i是单机微服务,应用软件向逻辑时钟层Pi提交待发消息m时:
1)Pi调整自身逻辑时钟{Ti,Ci}如下:
T=max{Pi本地物理时钟,Ti};
如果T>Ti则Ti=T,Ci=0;
否则,Ti保持不变,Ci=Ci+1;
2)设置m携带的发送逻辑时间戳,ts(m)={Ti,Ci},并记录日志;
3)向消息中间件提交消息m;
b.当节点j是单机微服务,逻辑时钟层从消息中间件收到消息m时:
1)调整自身逻辑时钟{Tj,Cj}如下:
T=max{Tj,Pj本地物理时钟,ts(m).T},其中,ts(m).T是指ts(m)的T分量;
如果T>Tj且T>ts(m).T,则Tj=T,Cj=0;
否则Tj=T,Cj=max{Cj,ts(m).C}+1;
2)设置m携带的接收逻辑时间戳,tr(m)={Tj,Cj},并记录日志;
3)向应用层投递消息m;
c.当集群i的应用软件向逻辑时钟层Pi提交待发消息m时:
1)Pi调整自身逻辑时钟{Ti,Ci};
Ti不变,Ci=Ci+1,使集群全部主机的逻辑时钟一致;
2)设置m携带的发送逻辑时间戳,ts(m)={Ti,Ci},并记录日志;
3)集群主节点向消息中间件提交消息m;
d.当集群j主节点的逻辑时钟层从消息中间件收取消息m时:
1)调整自身逻辑时钟
T=max{Tj,Pj本地物理时钟,ts(m).T};
如果T>Tj且T>ts(m).T则Tj=T,Cj=0;
否则Tj=T,Cj=max{Cj,ts(m).C}+1;
2)设置m携带的接收逻辑时间戳,tr(m)={Tj,Cj},并记录日志;
3)利用RAFT等原子组播协议通过消息中间件将m可靠传送给从节点后,向应用层投递消息m;
e.当集群j从节点的逻辑时钟层收到主节点送来的消息m时:
1)自身逻辑时钟=tr(m),并记录日志;
2)向应用层投递消息m;
读取系统中每个微服务的日志,把日志项按逻辑时钟排序,即可将排序后的日志项按因果顺序单步重演整个系统中的消息收发事件,逻辑时钟的T分量和事件的物理时间相接近,易于按指定倍速进行重演。
2.如权利要求1所述的一种在微服务架构下实现全局有序重演的方法,其特征在于所述的重演方法适用的微服务包括单机和高可用集群,当使用高可用集群时,所述的微服务是基于有唯一主节点的共识算法构建的,在一个集群内部,主节点从多个输入消息中间件读取消息后排序,自己按此顺序处理消息,而其他节点会从主节点处获得排序后的消息,然后按同样的顺序处理。
3.如权利要求1所述的一种在微服务架构下实现全局有序重演的方法,其特征在于节点内收发事件的逻辑时间戳单调递增,消息接收逻辑时间戳大于其发送的逻辑时间戳,从而保存了系统内部的因果序,且逻辑时间戳的T分量能用于反映物理时间。
4.如权利要求1所述的一种在微服务架构下实现全局有序重演的方法,其特征在于为了确保产生的逻辑时间戳构成一个全序,引入节点ID/集群ID作为逻辑时间戳的第三个分量,每个集群发出消息时,在逻辑时间戳的ID分量上填上自身ID,此时逻辑时间戳的比较规则是:先看T分量哪个大,若相等则再看C分量哪个大,若还相等则再看ID分量哪个大。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710384544.6A CN107181805B (zh) | 2017-05-26 | 2017-05-26 | 一种在微服务架构下实现全局有序重演的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710384544.6A CN107181805B (zh) | 2017-05-26 | 2017-05-26 | 一种在微服务架构下实现全局有序重演的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107181805A CN107181805A (zh) | 2017-09-19 |
CN107181805B true CN107181805B (zh) | 2019-11-12 |
Family
ID=59835966
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710384544.6A Active CN107181805B (zh) | 2017-05-26 | 2017-05-26 | 一种在微服务架构下实现全局有序重演的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107181805B (zh) |
Families Citing this family (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111294310B (zh) * | 2018-12-06 | 2022-04-29 | 上海西门子医疗器械有限公司 | 自动提取工作流程方法和在分布式系统中检测侵入方法 |
CN111382046B (zh) * | 2018-12-28 | 2023-03-28 | 中国电信股份有限公司 | 用于分布式软件系统的测试系统、方法和装置 |
CN110457141B (zh) * | 2019-07-04 | 2023-12-05 | 创新先进技术有限公司 | 一种业务消息的处理方法、系统、装置及设备 |
CN110266815B (zh) * | 2019-07-10 | 2021-11-05 | 西安纸贵互联网科技有限公司 | 基于区块链的微服务网络系统 |
CN112540985B (zh) * | 2020-12-07 | 2023-09-26 | 江苏赛融科技股份有限公司 | 基于分布式计算框架的全局排序输出系统及其方法 |
CN113946448B (zh) * | 2021-10-28 | 2024-05-28 | 苏州浪潮智能科技有限公司 | 一种服务器集群的时序管理方法、装置及电子设备 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20080120592A1 (en) * | 2006-10-31 | 2008-05-22 | Tanguay Donald O | Middleware framework |
CN101800989B (zh) * | 2010-01-19 | 2013-07-10 | 重庆邮电大学 | 用于工业无线网络的防重放攻击系统 |
CN102841840B (zh) * | 2012-07-11 | 2015-09-09 | 山东大学 | 基于消息重排序和消息数目检验的消息日志恢复方法 |
US9323950B2 (en) * | 2012-07-19 | 2016-04-26 | Atmel Corporation | Generating signatures using a secure device |
CN105242979B (zh) * | 2015-09-09 | 2017-12-12 | 高胜法 | 一种具有前向恢复特征的后向恢复容错方法 |
-
2017
- 2017-05-26 CN CN201710384544.6A patent/CN107181805B/zh active Active
Also Published As
Publication number | Publication date |
---|---|
CN107181805A (zh) | 2017-09-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107181805B (zh) | 一种在微服务架构下实现全局有序重演的方法 | |
US11671395B2 (en) | Apparatus, system, and method of elastically processing message information from multiple sources | |
US9229832B2 (en) | Time monitor | |
CN107491343B (zh) | 一种基于云计算的跨集群资源调度系统 | |
KR101109980B1 (ko) | 조정된 타이밍 네트워크 내의 서버 동기화 촉진 | |
US20080072096A1 (en) | Pulse-per-second attachment for stp | |
CN103856392A (zh) | 消息推送方法及其外发服务器和外发服务器系统 | |
CN106982356B (zh) | 一种分布式大规模视频流处理系统 | |
CN107579791B (zh) | 适用于单向通讯网络的卫星在轨遥测数据实时监测系统 | |
CN112804332B (zh) | 消息处理系统、方法、装置、设备及计算机可读存储介质 | |
Martin et al. | Low-overhead fault tolerance for high-throughput data processing systems | |
US7765197B2 (en) | System and method for producing data replica | |
CN112241437A (zh) | 数据库多主同步的回环控制方法、装置、设备及存储介质 | |
US20190155325A1 (en) | Instruction Processing Alignment System | |
CN111026813A (zh) | 一种基于MySQL的高可用准实时数据同步方法 | |
US8055801B2 (en) | Pulse-per-second attachment for STP | |
WO2021212493A1 (zh) | 数据同步方法、装置、数据存储系统及计算机可读介质 | |
US8230444B2 (en) | Global attribute uniqueness (GAU) using an ordered message service (OMS) | |
Horauer | Clock synchronization in distributed systems | |
CN108880779B (zh) | 一种基于redis消息通知的电文同步方法 | |
CN101887286A (zh) | 时间格式的转换方法及装置 | |
CN106682141A (zh) | 一种基于业务操作日志的数据同步方法 | |
CN116471291A (zh) | 多集群间数据同步的方法及装置 | |
CN116186082A (zh) | 基于分布式的数据汇总方法、第一服务器和电子设备 | |
CN114579671A (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 |