一种Socket链路受限的发布订阅系统及方法与流程

文档序号:32662459发布日期:2022-12-24 00:02阅读:31来源:国知局
一种Socket链路受限的发布订阅系统及方法与流程
一种socket链路受限的发布订阅系统及方法
技术领域
1.本发明涉及一种socket链路受限的发布订阅系统及方法,特别适用于资源受限条件下的嵌入式开发平台。


背景技术:

2.发布订阅是一种消息分发的控制机制,通常将发布消息的一端称为发布者,接收消息的一端称为订阅者。与传统的通信方式相比,发布订阅机制的特点在于功能解耦,发布者和订阅者不需要知道系统的拓扑结构就可以正常的收发消息。
3.传统的发布订阅系统由若干个节点组成网络,节点可自由选择感兴趣的消息类型,并担任该消息类型的发布者或者订阅者。另外每个节点都会拥有一个全局唯一的socket链路编号,假如该节点是发布者1,这时同消息类型订阅者2上线时,发布者1便会和订阅者2进行三次握手,产生一个新的socket链路编号来唯一表示发布者1和订阅者2间的通路。依次类推,每个发布者都会和同消息类型的所有订阅者建立链接。这种方式简化了消息的发送,当发布者发送消息时,只需要遍利自身存储的订阅者socket链路表依次发送即可,同时能够保证任何节点的异常不会扩散到其他节点上。但是这种方式的缺点也很明显,即会占用较多的socket链路资源。
4.随着嵌入式硬件功能的完善,相关的软件需求也日益迫切。普通的嵌入式开发板上的网络芯片通常只有几条可用的socket链路资源,无法支撑传统的发布订阅系统。


技术实现要素:

5.本发明解决的技术问题是:克服嵌入式资源受限的问题,提供一种socket链路受限的发布订阅系统及方法,使得在有限的socket链路资源下,完成尽可能多的节点间信息交互,实现发布订阅系统的功能。
6.本发明解决技术的方案是:一种socket链路受限的发布订阅系统,该系统包括n个单机,单机内部建立多个节点,其中一个单机为系统管理器,系统管理器之外的单机以单机为注册单位进行入网申请,入网成功后,单机间通过socket链路进行网络通信,单机内部节点利用共享内存分发和接收消息,实现消息的传输,n大于等于1。
7.优选地,系统管理器之外的单机以单机为注册单位进行入网申请的过程如下:
8.s1.1、入网单机向系统管理器发送入网请求消息,之后,开启监听线程,所述入网请求消息包括入网单机信息,具体包括入网单机的ip地址和端口号,所述端口号为入网单机与系统管理器通信的端口号;
9.s1.2、系统管理器收到入网请求消息之后,遍历入网消息链表中已有单机的ip地址和端口号,依次为已有单机生成与入网单机进行通信的端口号,将已有单机的ip地址和新生成的端口号组成入网反馈消息,将入网反馈消息同时发送给对应的已有单机和入网单机,系统管理器处理完成后,将入网单机的ip地址和端口号写入入网消息链表中;
10.s1.3、网络内单机监听到入网反馈消息之后,对入网反馈消息进行解析,如果入网
反馈消息中的ip地址与自身ip地址相同,则利用从入网反馈消息中解析出的端口号,开启服务端监听模式,等待其他单机的连接;如果入网反馈消息中的ip地址与自身ip地址不同,则开启客户端模式,将从入网反馈消息中解析出的端口号和ip地址作为服务端,建立对应的socket链路号并进行连接;
11.s1.4、步骤s1.3中两个单机连接成功后,作为客户端的单机将s1.3中产生的socket链路号更新到自身路由表中,而作为服务端的单机将随机产生的socket链路号更新到自身的路由表中,从此,两单机间直接通过socket链路号进行传递。
12.优选地,新生成的端口号=入网消息链表中已有单机的端口号+该入网请求消息消息编号,消息编号为入网请求消息的唯一标号。
13.优选地,所述单机内部节点利用共享内存,通过单机执行器给相关订阅节点分发消息的步骤如下:
14.s2.1、单机内部的节点以发布者的身份发布某消息类型的消息时,会将该消息的基本信息作为一条记录写入所属消息类型的待发布消息链表中;所述基本信息包括消息类型、消息首地址、消息长度、时间信息、默认引用次数;所述消息首地址为该消息占用共享内存的首地址;所述时间信息为写入该记录的时刻;所述默认引用次数为0xff;
15.s2.2、单机执行器遍历待发布消息链表,如果待发布消息链表中有新的消息,记录该消息类型,执行步骤s2.3和s2.4;如果待发布消息链表中的消息无需处理,继续遍历;如果待发布消息链表中的消息已经处理完毕或者无效,则转步骤s2.5;
16.s2.3、单机执行器根据步骤2.3中记录的消息类型,查看该消息类型下的订阅者链表,得到本地订阅节点,将消息首地址、消息长度依次抄送到各本地订阅节点的接收消息链表中,并累计抄送次数,抄送完成后,将待发布消息链表的引用次数修改为抄送次数;
17.s2.4、单机执行器遍历路由表,由已建立的socket链路,将新消息的消息类型和消息内容通过网络发送给其他单机;
18.s2.5、单机执行器清除该条消息的基本信息记录,释放该消息占有的空间,更新所属消息类型的待发布消息链表。
19.优选地,如果引用次数为默认值则存在新的消息,如果待发布消息链表为空或者待发布消息链表中的消息引用次数介于0~默认值之间,则认为待发布消息链表中的消息无需处理;如果待发布消息链表中的消息的时间信息与当前时间超过预设门限则认为待发布消息链表中的消息无效;如果待发布消息链表中消息的引用次数为0,则认为该消息已经处理完毕。
20.优选地,单机内部节点利用共享内存,通过单机执行器给相关订阅节点接收消息的步骤如下:
21.s3.1、单机执行器遍历路由表,查看socket链路号是否有来自其他单机的消息;如果有新消息,且该消息类型存在本地订阅者节点,则将该消息的基本信息作为一条记录写入待发布消息链表,进入步骤s3.2;否则,循环执行本步骤;
22.s3.2、单机执行器遍历待发布消息链表,如果待发布消息链表中有新的消息,记录该消息类型,执行步骤s3.3;否则,重复执行步骤s3.1~步骤s3.2;
23.s3.3、单机执行器根据步骤s3.2中记录的消息类型,查看该消息类型下的订阅者链表,得到本地订阅节点,将消息首地址、消息长度依次抄送到各本地订阅节点的接收消息
链表中,并累计抄送次数,抄送完成后,将待发布消息链表的引用次数修改为抄送次数;
24.s3.4、单机执行器遍历本地订阅节点的的接收消息链表,如果有新的消息,触发回调事件,对消息进行处理,处理完成后,将引用次数递减,更新该消息类型的待发布消息链表中的引用次数;如果没有新的消息,则重复本步骤。
25.本发明的另一个技术方案是:一种socket链路受限的发布订阅方法,该方法包括单机内部节点利用共享内存,通过单机执行器给相关订阅节点分发消息的步骤:
26.s2.1、单机内部的节点以发布者的身份发布某消息类型的消息时,会将该消息的基本信息作为一条记录写入所属消息类型的待发布消息链表中;所述基本信息包括消息类型、消息首地址、消息长度、时间信息、默认引用次数;所述消息首地址为该消息占用共享内存的首地址;所述时间信息为写入该记录的时刻;所述默认引用次数为0xff;
27.s2.2、单机执行器遍历待发布消息链表,如果待发布消息链表中有新的消息,记录该消息类型,执行步骤s2.3和s2.4;如果待发布消息链表中的消息无需处理,继续遍历;如果待发布消息链表中的消息已经处理完毕或者无效,则转步骤s2.5;
28.s2.3、单机执行器根据步骤2.3中记录的消息类型,查看该消息类型下的订阅者链表,得到本地订阅节点,将消息首地址、消息长度依次抄送到各本地订阅节点的接收消息链表中,并累计抄送次数,抄送完成后,将待发布消息链表的引用次数修改为抄送次数;
29.s2.4、单机执行器遍历路由表,由已建立的socket链路,将新消息的消息类型和消息内容通过网络发送给其他单机;
30.s2.5、单机执行器清除该条消息的基本信息记录,释放该消息占有的空间,更新所属消息类型的待发布消息链表。
31.如果引用次数为默认值则存在新的消息,如果待发布消息链表为空或者待发布消息链表中的消息引用次数介于0~默认值之间,则认为待发布消息链表中的消息无需处理;如果待发布消息链表中的消息的时间信息与当前时间超过预设门限则认为待发布消息链表中的消息无效;如果待发布消息链表中消息的引用次数为0,则认为该消息已经处理完毕。
32.单机内部节点利用共享内存,通过单机执行器给相关订阅节点接收消息的步骤:
33.s3.1、单机执行器遍历路由表,查看socket链路号是否有来自其他单机的消息;如果有新消息,且该消息类型存在本地订阅者节点,则将该消息的基本信息作为一条记录写入待发布消息链表,进入步骤s3.2;否则,循环执行本步骤;
34.s3.2、单机执行器遍历待发布消息链表,如果待发布消息链表中有新的消息,记录该消息类型,执行步骤s3.3;否则,重复执行步骤s3.1~步骤s3.2;
35.s3.3、单机执行器根据步骤s3.2中记录的消息类型,查看该消息类型下的订阅者链表,得到本地订阅节点,将消息首地址、消息长度依次抄送到各本地订阅节点的接收消息链表中,并累计抄送次数,抄送完成后,将待发布消息链表的引用次数修改为抄送次数;
36.s3.4、单机执行器遍历本地订阅节点的的接收消息链表,如果有新的消息,触发回调事件,对消息进行处理,处理完成后,将引用次数递减,更新该消息类型的待发布消息链表中的引用次数;如果没有新的消息,则重复本步骤。
37.本发明与现有技术相比的有益效果是:
38.(1)、本发明将单机内部所有的节点视为一个整体,以单机为最小注册单位,每两
个单机间才会使用一条socket链路进行通信。这不仅降低了构建网络拓扑关系的复杂程度,也减少了socket链路资源的开销,提升了通信系统的稳定性。
39.(2)、本发明在单机内部通过单机执行器控制各节点消息的收发,当产生新的消息时,单机执行器根据新消息的消息类型,通过共享内存抄送给相关的节点。既不会占用socket链路资源,又加快了通信的速率,避免了网络传输中的时间开销。
40.(3)、本发明实现了通信去中心化,通过系统管理器动态发现新单机,单机间建立连接后可直接进行通信。如果系统管理器意外出现问题,不会影响系统中已经建立的连接关系,有效地提升了通信系统的健壮性。
41.(4)、本发明采用tcp协议提供可靠的数据传输,对socket通信进行了封装,提供了节点创建、单机注册、节点数据传输的接口,方便了用户的使用,用户无需关心底层细节。
附图说明
42.图1是本发明实施例发布订阅系统组成示意图;
43.图2是本发明实施例单机内部组成示意图;
44.图3是本发明实施例系统管理器发送入网反馈消息逻辑示意图;
45.图4是本发明实施例发布订阅系统入网流程图。
具体实施方式
46.以下结合附图和具体实施例对本发明进行详细说明。
47.本发明提供的一种socket链路受限的发布订阅系统物理上包括n个单机,单机内部建立多个节点,其中一个单机为系统管理器,系统管理器之外的单机以单机为注册单位进行入网申请,入网成功后,单机间通过socket链路进行网络通信,单机内部节点利用共享内存分发和接收消息,实现消息的传输,n大于等于1。
48.n个单机之间通过tcp协议建立连接。
49.单机通过单机执行器管理本地所有的节点,节点在收发消息时需指定消息类型,只有消息类型相同时,节点间才能进行消息的交互。另外,单机执行器通过订阅者链表以及待发布消息链表来记录某消息类型相关的订阅者以及待发布的消息。此外,发布者可根据自身的消息类型,索引出该消息类型下的订阅链表以及待发布消息链表。和发布者相比,订阅者记录的信息更加丰富。订阅者不仅记录了自身的消息类型,还拥有接收消息链表以及回调事件。其中,接收消息链表用来接收新的消息,一旦接收成功,会触发回调事件,对消息进行处理。
50.由于嵌入式硬件平台上socket链路资源受限,该系统以单机为最小注册单位,单机间通过socket链路进行通信,单机内部通过单机执行器进行消息的传递(共享内存)。系统管理器管理着系统内所有上线的单机,可单独部署在一台单机中,该单机的ip地址和端口号作为系统的公用信息供其他单机连接使用。
51.单机内部创建节点。创建节点的步骤如下:
52.(1)、规定该节点的角色(发布者、订阅者)以及所属消息类型。(一个节点可以订阅/发布多种消息类型。
53.(2)、如果该节点属于某消息类型的订阅者,则创建一个订阅者实例。单机执行器
将该实例更新到所属消息类型的订阅者链表中。
54.(3)、如果该节点属于某消息类型的发布者,单机执行器查看是否存在所属消息类型的待发布消息链表。若不存在,则建立一个空的待发布消息链表。否则,不需要进行操作。
55.单机内部创建节点完成后,向系统管理器发送入网请求消息,进行注册入网。入网成功后,单机会建立起与其他单机的socket直连,单机间的消息就可直接通过socket链路号进行传递,无需经过系统管理器。
56.系统管理器之外的单机以单机为注册单位进行入网申请的过程如下:
57.s1.1、入网单机向系统管理器发送入网请求消息,之后,开启监听线程,所述入网请求消息包括入网单机信息,具体包括入网单机的ip地址和端口号,所述端口号为入网单机与系统管理器通信的端口号;
58.s1.2、系统管理器收到入网请求消息之后,遍历入网消息链表中已有单机的ip地址和端口号,依次为已有单机生成与入网单机进行通信的端口号,将已有单机的ip地址和新生成的端口号组成入网反馈消息,将入网反馈消息同时发送给对应的已有单机和入网单机;系统管理器处理完成后,将入网单机的ip地址和端口号写入入网消息链表中。具体流程可参见图3
59.新生成的端口号=入网消息链表中已有单机的端口号+该入网请求消息消息编号,消息编号为入网请求消息的唯一标号。
60.s1.3、网络内单机监听到入网反馈消息之后,对入网反馈消息进行解析,如果入网反馈消息中的ip地址与自身ip地址相同,则利用从入网反馈消息中解析出的端口号,开启服务端监听模式,等待其他单机的连接;如果入网反馈消息中的ip地址与自身ip地址不同,则开启客户端模式,将从入网反馈消息中解析出的端口号和ip地址作为服务端,建立对应的socket链路号并进行连接。
61.s1.4、步骤s1.3中两个单机连接成功后,作为客户端的单机将s1.3中产生的socket链路号更新到自身路由表中,而作为服务端的单机将随机产生的socket链路号更新到自身的路由表中,从此,两单机间直接通过socket链路号进行传递。
62.如图3所示,本发明某一具体实施例中,上述具体的流程如下:
63.(1)、系统管理器作为服务端,开启监听线程,等待其他单机的连接,此时消息计数为0。
64.(2)、如果系统管理器接收到新的入网请求消息,消息计数加1,并将消息计数值作为该入网请求消息的消息编号。
65.(3)、系统管理器解析该入网请求消息,获取ip地址和端口号,分别记为ip地址1和端口号1。
66.(4)、系统管理器遍历入网消息链表,依次解析消息链表的消息,获取地址和端口号,分别记为ip地址2和端口号2。
67.(5)、系统管理器将端口号2和消息编号相加,生成新的端口号3。并将ip地址2、端口号3打包成入网反馈消息;
68.(6)、系统管理器将入网反馈消息,发送给ip地址1和ip地址2;
69.(7)、重复步骤(4)~(6),直到系统管理器遍历完消息链表。
70.(8)、系统管理器将入网请求消息更新到入网消息链表中。
71.各单机接收到消息后,根据ip地址和端口号建立单机间的连接,完成新单机的上线及组网。
72.所述单机内部节点利用共享内存,通过单机执行器给相关订阅节点分发消息的步骤如下:
73.s2.1、单机内部的节点以发布者的身份发布某消息类型的消息时,会将该消息的基本信息作为一条记录写入所属消息类型的待发布消息链表中;所述基本信息包括消息类型、消息首地址、消息长度、时间信息、默认引用次数;所述消息首地址为该消息占用共享内存的首地址;所述时间信息为写入该记录的时刻;所述默认引用次数为0xff;
74.s2.2、单机执行器遍历待发布消息链表,如果待发布消息链表中有新的消息(引用次数为默认值),记录该消息类型,执行步骤s2.3和s2.4;如果待发布消息链表中的消息无需处理(引用次数介于0~默认值),继续遍历;如果待发布消息链表中的消息已经处理完毕(引用次数为0)或者无效(时间信息与当前时间差超过预设门限),则转步骤s2.5;
75.s2.3、单机执行器根据步骤2.3中记录的消息类型,查看该消息类型下的订阅者链表,得到本地订阅节点,将消息首地址、消息长度依次抄送到各本地订阅节点的接收消息链表中,并累计抄送次数,抄送完成后,将待发布消息链表的引用次数修改为抄送次数;
76.s2.4、单机执行器遍历路由表,由已建立的socket链路,将新消息的消息类型和消息内容通过网络发送给其他单机;
77.s2.5、单机执行器清除该条消息的基本信息记录,释放该消息占有的空间,更新所属消息类型的待发布消息链表。
78.单机内部节点利用共享内存,通过单机执行器给相关订阅节点接收消息的步骤如下:
79.s3.1、单机执行器遍历路由表,查看socket链路号是否有来自其他单机的消息;如果有新消息,且该消息类型存在本地订阅者节点,则将该消息的基本信息作为一条记录写入待发布消息链表,进入步骤s3.2;否则,循环执行本步骤;
80.s3.2、单机执行器遍历待发布消息链表,如果待发布消息链表中有新的消息,记录该消息类型,执行步骤s3.3;其它情况,无需处理。
81.s3.3、单机执行器根据步骤s3.2中记录的消息类型,查看该消息类型下的订阅者链表,得到本地订阅节点,将消息首地址、消息长度依次抄送到各本地订阅节点的接收消息链表中,并累计抄送次数,抄送完成后,将待发布消息链表的引用次数修改为抄送次数。
82.s3.4、单机执行器遍历本地订阅节点的的接收消息链表,如果有新的消息,触发回调事件,对消息进行处理,处理完成后,将引用次数递减,更新该消息类型的待发布消息链表中的引用次数;如果没有新的消息,则重复本步骤。
83.实施例:
84.如图1和图2所示,本实施例包含三个单机pc1、pc2和pc3。除单机执行器外,pc1和pc2各含有三个节点,其中节点1是消息类型a的发布者pub1和订阅者sub1,节点2是消息类型b的发布者pub2,节点3是消息类型b的订阅者sub2。pc3中部署了系统管理器,三个单机的软件执行过程如图4所示:
85.pc1首先依次创建三个节点,绑定各自的消息类型及角色。接下来,pc1以单机为单位进行注册,向系统管理器发送入网请求消息(即自身ip地址和端口号),并开启监听线程,
等待系统管理器的入网反馈消息。系统管理器收到入网请求消息后,由于当前系统中还没有其他单机,将ip地址和端口号写入本地的入网消息链表,系统管理器无需分发ip地址和端口号,pc1的注册就完成了。
86.和pc1流程相似,pc2创建完节点后,进行注册入网。系统管理器收到入网请求消息后,遍历当前入网消息链表,根据pc1的端口号和消息编号产生新的端口号,并将pc1的ip地址和新端口号分发给pc1以及pc2。系统管理器遍历完成后,将入网请求消息更新到本地的入网消息链表中。
87.pc1接到系统管理器发来的入网反馈消息后,由于ip地址和自身相同,pc1就会作为服务端,如果新端口尚未进行监听,打开新端口进行监听。同时pc2接到消息后,判断到和自身ip地址不同,如果尚未建立连接,则会通过新的端口与pc1进行三次握手。pc1和pc2握手成功后,就可以开始进行消息的交互了。
88.当pc1中的发布者pub1要发消息时,pc1内的单机执行器遍历所属消息类型下的订阅者链表,依次抄送消息首地址、消息长度等信息,则pc1内部的订阅者sub1就可通过访问共享内存对消息进行处理。同时,由于在注册阶段,pc1和pc2之间已经建立了连接,因此pc1会向pc2广播发布者的消息。当pc2接收到新的消息后,将消息的基本信息更新到所属消息类型的待发布消息链表中,pc2内的单机执行器遍历所属消息类型的订阅者链表,并依次向订阅者抄送消息首地址、消息长度等信息,这样pc2中的sub1也收到了消息。同理,消息类型b的消息也是类似的过程,这样就实现了多机多节点间的消息交互。
89.本发明虽然已以较佳实施例公开如上,但其并不是用来限定本发明,任何本领域技术人员在不脱离本发明的精神和范围内,都可以利用上述揭示的方法和技术内容对本发明技术方案做出可能的变动和修改,因此,凡是未脱离本发明技术方案的内容,依据本发明的技术实质对以上实施例所作的任何简单修改、等同变化及修饰,均属于本发明技术方案的保护范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1