发明内容
本申请提供一种报文处理方法,应用于与PostgreSQL数据库节点对应的中转节点;所述中转节点用于将接收到的基于Extended Query协议的报文序列转发给所述数据库节点;所述方法包括:
将客户端发送的基于Extended Query协议的报文序列确定为目标报文序列,并迭代执行以下步骤A、B、C,直至客户端发送的所述报文序列中的报文均被转发至对应的数据库节点;
步骤A:将所述目标报文序列中的首个Bind报文之前的若干报文,拆分为第一报文子序列,并将所述第一报文子序列转发至对应的数据库节点;
步骤B:确定所述目标报文序列中剩余的报文所构成的第二报文子序列中的Bind报文的数量是否大于1;
步骤C:如果否,则将所述第二报文子序列转发至对应的数据库节点;如果是,则将所述第二报文子序列中的与所述首个Bind报文对应的Execute报文的之前的若干报文和所述Execute报文,拆分为第三报文子序列,并将所述第三报文子序列转发至对应的数据库节点;以及将所述第二报文子序列中剩余的报文所构成的报文子序列,重新确定为所述目标报文序列。
可选的,所述数据库节点包括多个数据库子节点;
所述将所述第一报文子序列转发至对应的数据库节点,包括:
将所述第一报文子序列广播发送至所述数据库节点中的所有子节点;
所述将所述第二报文子序列或者所述第三报文子序列转发至对应的数据库节点,包括:
将所述第二报文子序列或者所述第三报文子序列转发至所述数据库节点中的任一子节点。
可选的,所述多个数据库子节点包括主节点和至少一个从节点;其中,所述主节点用于执行与写操作对应的SQL语句,所述从节点用于执行与读操作对应的SQL语句;
所述将所述第二报文子序列或者所述第三报文子序列转发至所述数据库节点中的任一子节点,包括:
如果与所述首个Bind报文对应的Parse报文中包括与写操作对应的SQL语句,则将所述第二报文子序列或者所述第三报文子序列转发至所述主节点;
如果与所述首个Bind报文对应的Parse报文中包括与读操作对应的SQL语句,则将所述第二报文子序列或者所述第三报文子序列转发至任一所述从节点。
可选的,所述将所述第二报文子序列或者所述第三报文子序列转发至任一所述从节点,包括:
基于预设的负载均衡策略,确定用于处理所述第二报文子序列或者所述第三报文子序列的目标从节点;
将所述第二报文子序列或者所述第三报文子序列转发至确定出的所述目标从节点。
可选的,将所述第一报文子序列广播发送至所述数据库节点中的所有子节点之后,还包括:
接收所述主节点以及所述从节点返回的针对所述第一报文子序列的处理结果;
丢弃所述从节点返回的所述处理结果,并将所述主节点返回的所述处理结果进一步返回给所述客户端。
可选的,将所述第二报文子序列或者所述第三报文子序列转发至所述数据库节点中的任一子节点之后,还包括:
如果将所述第二报文子序列或者所述第三报文子序列转发至所述主节点,则接收所述主节点返回的针对所述第二报文子序列或者所述第三报文子序列的处理结果,并将所述主节点返回的所述处理结果进一步返回给所述客户端;
如果将所述第二报文子序列或者所述第三报文子序列转发至任一所述从节点,则接收任一所述从节点返回的针对所述第二报文子序列或者所述第三报文子序列的处理结果,并将任一所述从节点返回的所述处理结果进一步返回给所述客户端。
可选的,将所述目标报文序列中的首个Bind报文之前的若干报文,拆分为第一报文子序列之前,还包括:
检测所述目标报文序列中的与所述首个Bind报文对应的Parse报文是否携带执行计划标识;其中,所述Parse报文用于指示所述数据库节点创建一个执行计划;
如果未携带,则将所述目标报文序列转发至对应的数据库节点;
如果携带,则进一步地将所述目标报文序列中的首个Bind报文之前的若干报文,拆分为第一报文子序列。
本申请还提供一种报文处理装置,应用于与PostgreSQL数据库节点对应的中转节点;所述中转节点用于将接收到的基于Extended Query协议的报文序列转发给所述数据库节点;所述装置包括:
第一确定单元,用于将客户端发送的基于Extended Query协议的报文序列确定为目标报文序列,并迭代调用以下第一转发单元、第二确定单元、第二转发单元,直至客户端发送的所述报文序列中的报文均被转发至对应的数据库节点;
所述第一转发单元,用于将所述目标报文序列中的首个Bind报文之前的若干报文,拆分为第一报文子序列,并将所述第一报文子序列转发至对应的数据库节点;
所述第二确定单元,用于确定所述目标报文序列中剩余的报文所构成的第二报文子序列中的Bind报文的数量是否大于1;
所述第二转发单元,用于如果所述第二确定单元确定所述第二报文子序列中的Bind报文的数量不大于1,则将所述第二报文子序列转发至对应的数据库节点;如果所述第二确定单元确定所述第二报文子序列中的Bind报文的数量大于1,则将所述第二报文子序列中的与所述首个Bind报文对应的Execute报文的之前的若干报文和所述Execute报文,拆分为第三报文子序列,并将所述第三报文子序列转发至对应的数据库节点;以及将所述第二报文子序列中剩余的报文所构成的报文子序列,重新确定为所述目标报文序列。
可选的,所述数据库节点包括多个数据库子节点;
所述第一转发单元,具体用于:
将所述第一报文子序列广播发送至所述数据库节点中的所有子节点;
所述第二转发单元,具体用于:
将所述第二报文子序列或者所述第三报文子序列转发至所述数据库节点中的任一子节点。
可选的,所述多个数据库子节点包括主节点和至少一个从节点;其中,所述主节点用于执行与写操作对应的SQL语句,所述从节点用于执行与读操作对应的SQL语句;
所述第二转发单元,具体用于:
如果与所述首个Bind报文对应的Parse报文中包括与写操作对应的SQL语句,则将所述第二报文子序列或者所述第三报文子序列转发至所述主节点;
如果与所述首个Bind报文对应的Parse报文中包括与读操作对应的SQL语句,则将所述第二报文子序列或者所述第三报文子序列转发至任一所述从节点。
可选的,所述第二转发单元,具体用于:
基于预设的负载均衡策略,确定用于处理所述第二报文子序列或者所述第三报文子序列的目标从节点;
将所述第二报文子序列或者所述第三报文子序列转发至确定出的所述目标从节点。
可选的,所述第一转发单元将所述第一报文子序列广播发送至所述数据库节点中的所有子节点之后,还用于:
接收所述主节点以及所述从节点返回的针对所述第一报文子序列的处理结果;
丢弃所述从节点返回的所述处理结果,并将所述主节点返回的所述处理结果进一步返回给所述客户端。
可选的,所述第二转发单元将所述第二报文子序列或者所述第三报文子序列转发至所述数据库节点中的任一子节点之后,还用于:
如果将所述第二报文子序列或者所述第三报文子序列转发至所述主节点,则接收所述主节点返回的针对所述第二报文子序列或者所述第三报文子序列的处理结果,并将所述主节点返回的所述处理结果进一步返回给所述客户端;
如果将所述第二报文子序列或者所述第三报文子序列转发至任一所述从节点,则接收任一所述从节点返回的针对所述第二报文子序列或者所述第三报文子序列的处理结果,并将任一所述从节点返回的所述处理结果进一步返回给所述客户端。
可选的,所述第一转发单元将所述目标报文序列中的首个Bind报文之前的若干报文,拆分为第一报文子序列之前,还用于:
检测所述目标报文序列中的与所述首个Bind报文对应的Parse报文是否携带执行计划标识;其中,所述Parse报文用于指示所述数据库节点创建一个执行计划;
如果未携带,则将所述目标报文序列转发至对应的数据库节点;
如果携带,则进一步地将所述目标报文序列中的首个Bind报文之前的若干报文,拆分为第一报文子序列。
本申请还提供一种电子设备,包括通信接口、处理器、存储器和总线,所述通信接口、所述处理器和所述存储器之间通过总线相互连接;
所述存储器中存储机器可读指令,所述处理器通过调用所述机器可读指令,执行上述方法。
本申请还提供一种机器可读存储介质,所述机器可读存储介质存储有机器可读指令,所述机器可读指令在被处理器调用和执行时,实现上述方法。
通过以上实施例,一方面,与PostgreSQL数据库节点对应的中转节点,可以先将目标报文序列中的首个Bind报文之前的若干报文,拆分为第一报文子序列,还可以通过所述目标报文序列中剩余的报文所构成的第二报文子序列中的Bind报文的数量是否大于1,来确定是否需要进一步拆分所述第二报文子序列,从而所述中转节点可以按需将客户端发送的报文序列拆分为若干报文子序列,而无需将所述报文序列逐个报文进行拆分,可以减少所述中转节点针对一个报文序列进行拆分以及转发的次数,实现网络处理性能的提高。
由于所述目标报文序列中的首个Bind报文之前的若干报文,主要包括用于指示数据库执行SQL语句前的准备阶段报文、执行完毕后的清理阶段报文以及获取执行计划信息的报文,不会导致数据库增加大量负荷;而从Bind报文到与所述Bind报文对应的Execute报文之间的若干报文,主要包括用于指示数据库执行SQL语句的报文,会导致数据库负荷增加;因此,所述中转节点从目标报文序列中,可以按照负载均衡的需求拆分出第一报文子序列、第二报文子序列或第三报文子序列,并可以进一步地将拆分出的各报文子序列分别转发至对应的数据库节点。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本说明书一个或多个实施例相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本说明书一个或多个实施例的一些方面相一致的装置和方法的例子。
需要说明的是:在其他实施例中并不一定按照本说明书示出和描述的顺序来执行相应方法的步骤。在一些其他实施例中,其方法所包括的步骤可以比本说明书所描述的更多或更少。此外,本说明书中所描述的单个步骤,在其他实施例中可能被分解为多个步骤进行描述;而本说明书中所描述的多个步骤,在其他实施例中也可能被合并为单个步骤进行描述。
为了使本技术领域的人员更好地理解本说明书实施例中的技术方案,下面先对本说明书实施例涉及的基于Extended Query协议的报文序列的相关技术,进行简要说明。
Extended Query协议,是一种应用于PostgreSQL数据库的前后端通信协议,可以用于避免反复执行类似的SQL语句造成的资源浪费;为了提升PostgreSQL数据库处理报文的效率,客户端通常可以基于Extended Query协议,向PostgreSQL数据库发送报文序列,以使客户端通过一次网络通信发送一个报文序列,就可以实现将多个报文发送给PostgreSQL数据库。
所述报文序列,可以包括一个或多个报文;具体可以包括Parse报文、Bind报文、Execute报文、Close报文、Describe报文、Sync报文中一个或多个报文的排列组合,并且在所述报文序列中,每种报文的数量可以大于1个。
例如,所述报文序列可以为PBDES序列、CBES序列、PDBECPDBES序列等。
需要说明的是,在本说明书以下示出的实施例中,可以根据所述报文序列中各报文的首字母、以及各报文在报文序列中的排列顺序,来描述所述报文序列,不再一一赘述报文序列中具体包含的报文。
例如,PDBECPDBES序列,即包括Parse报文、Describe报文、Bind报文、Execute报文、Close报文、Parse报文、Describe报文、Bind报文、Execute报文和Sync报文的报文序列。
其中,所述Parse报文,可以用于指示PostgreSQL数据库根据其携带的具体的SQL语句,创建一个可以多次使用的执行计划;如果所述Parse报文携带有执行计划标识,则对应创建的执行计划可以被称为named prepared statement,所述执行计划可以被多次使用;如果所述Parse报文未携带执行计划标识,则对应创建的执行计划可以被称为unnamedprepared statement,所述执行计划通常只使用一次。
所述Bind报文,可以用于指示下一次运行目标执行计划时具体的参数数值,并可以用于指示PostgreSQL数据库生成一个与所述目标执行计划对应的portal;其中,所述目标执行计划,可以包括与所述Bind报文对应的Parse报文所指示数据库创建的执行计划。
所述Execute报文,可以用于指示PostgreSQL数据库运行目标portal,执行对应的SQL请求,来实现增删改查或更新等数据库操作;其中,所述目标portal,可以包括与所述Execute报文对应的Bind报文所指示数据库创建的portal。
所述Close报文,可以用于指示PostgreSQL数据库销毁已创建的执行计划或portal,从而避免存在过多的执行计划或portal占用数据库内存。
所述Describe报文,可以用于指示PostgreSQL数据库返回某个执行计划或portal的具体信息。
所述Sync报文,可以用于指示PostgreSQL数据库返回针对所述报文序列的处理结果。
在实际应用中,与PostgreSQL数据库节点对应的中间件,通常可以先对客户端发送的报文序列进行处理,再将处理后的报文序列中的报文转发至对应的PostgreSQL数据库节点。
例如,当客户端发送基于Extended Query协议的PBES序列时,中间件Pgpool-Ⅱ可以先从所述PBES序列中拆分出Parse报文,并将其转发至对应的数据库节点;再拆分出Bind报文,并将其转发至对应的数据库节点;然后可以拆分出Execute报文,并根据与出Execute报文对应的Parse报文中包含的SQL语句的读写属性,将其转发至对应的数据库节点;最后将Sync报文转发至对应的数据库节点。
由此可见,所述中间件将客户端发送的一个报文序列转发至对应的数据库节点时,需要逐个拆分出所述报文序列中的报文并逐个进行转发,导致网络处理性能不佳。
有鉴于此,本说明书旨在提出一种可以按需拆分客户端发送的基于ExtendedQuery协议的报文序列,并将拆分出的报文子序列分别发送至对应的数据库节点的技术方案。
在实现时,与PostgreSQL数据库节点对应的中转节点将客户端发送的基于Extended Query协议的报文序列确定为目标报文序列,并迭代执行以下步骤A、B、C,直至客户端发送的所述报文序列中的报文均被转发至对应的数据库节点;
步骤A:将所述目标报文序列中的首个Bind报文之前的若干报文,拆分为第一报文子序列,并将所述第一报文子序列转发至对应的数据库节点;
步骤B:确定所述目标报文序列中剩余的报文所构成的第二报文子序列中的Bind报文的数量是否大于1;
步骤C:如果否,则将所述第二报文子序列转发至对应的数据库节点;如果是,则将所述第二报文子序列中的与所述首个Bind报文对应的Execute报文的之前的若干报文和所述Execute报文,拆分为第三报文子序列,并将所述第三报文子序列转发至对应的数据库节点;以及将所述第二报文子序列中剩余的报文所构成的报文子序列,重新确定为所述目标报文序列。
由此可见,在本说明书中的技术方案中,与PostgreSQL数据库节点对应的中转节点,可以先将目标报文序列中的首个Bind报文之前的若干报文,拆分为第一报文子序列,还可以通过所述目标报文序列中剩余的报文所构成的第二报文子序列中的Bind报文的数量是否大于1,来确定是否需要进一步拆分所述第二报文子序列,从而所述中转节点可以按需将客户端发送的报文序列拆分为若干报文子序列,而无需将所述报文序列逐个报文进行拆分,可以减少所述中转节点针对一个报文序列进行拆分以及转发的次数,实现网络处理性能的提高。
由于所述目标报文序列中的首个Bind报文之前的若干报文,主要包括用于指示数据库执行SQL语句前的准备阶段报文、执行完毕后的清理阶段报文以及获取执行计划信息的报文(即Parse报文、Close报文、Describe报文),不会导致数据库增加大量负荷;而从Bind报文到与所述Bind报文对应的Execute报文之间的若干报文,主要包括用于指示数据库执行SQL语句的报文(即至少包括Bind报文和Execute报文),会导致数据库负荷增加;因此,所述中转节点从目标报文序列中,可以按照负载均衡的需求拆分出第一报文子序列、第二报文子序列或第三报文子序列,并可以进一步地将拆分出的各报文子序列分别转发至对应的数据库节点。
下面通过具体实施例,并结合具体的应用场景对本申请进行描述。
请参见图1,图1是一示例性的实施例示出的一种报文处理系统的架构示意图。
在本说明书中,系统架构可以包括客户端110、中转节点120和数据库节点130。
其中,客户端110可以向数据库节点130发送基于Extended Query协议的报文序列;中转节点120与数据库节点130相对应,也即,与数据库节点130对应的中转节点120,可以将接收到的基于Extended Query协议的报文序列转发至数据库节点130;数据库节点130可以用于执行接收到的报文中携带的SQL语句,来实现增删改查或更新等数据库操作。
在实际应用中,客户端110可以是支持网络功能的电子设备,包括但不限于智能手机、平板电脑和台式电脑等等。
在实际应用中,中转节点120可以包括一台具有路由功能的代理服务器,或者多台代理服务器组成的服务器集群;中转节点120还可以包括搭载在数据库节点130上的软件。
在实际应用中,数据库节点130可以包括与PostgreSQL数据库对应的数据库节点。
在示出的一种实施方式中,所述数据库节点可以包括多个数据库子节点;具体地,所述多个数据库子节点可以包括主节点和至少一个从节点;其中,所述主节点用于执行与写操作对应的SQL语句,所述从节点用于执行与读操作对应的SQL语句。
例如,如图1所示,数据库节点130可以包括多个数据库子节点;所述数据库子节点,可以包括主节点131、从节点132和从节点133。
需要说明的是,在以上示出的实施方式中,图1中仅示出了3个数据库子节点,并不代表对本说明书做限制;在实际应用中,所述数据库节点可以包括一个或多个数据库子节点。
另外,需要说明的是,在以上示出的实施方式中,图1中仅示出了1个主节点和2个从节点,并不代表对本说明书做限制,在实际应用中,用户可以根据需求,灵活配置主节点和从节点的数量。
请参见图2,图2是一示例性的实施例示出的一种报文处理方法的流程图,所述方法应用于与PostgreSQL数据库节点对应的中转节点;所述中转节点用于将接收到的基于Extended Query协议的报文序列转发给所述数据库节点;所述报文处理方法执行以下步骤:
步骤201:将客户端发送的基于Extended Query协议的报文序列确定为目标报文序列,并迭代执行步骤202-步骤204,直至客户端发送的所述报文序列中的报文均被转发至对应的数据库节点;
步骤202:将所述目标报文序列中的首个Bind报文之前的若干报文,拆分为第一报文子序列,并将所述第一报文子序列转发至对应的数据库节点;
步骤203:确定所述目标报文序列中剩余的报文所构成的第二报文子序列中的Bind报文的数量是否大于1;
步骤204:如果是,则将所述第二报文子序列中的与所述首个Bind报文对应的Execute报文的之前的若干报文和所述Execute报文,拆分为第三报文子序列,并将所述第三报文子序列转发至对应的数据库节点;以及将所述第二报文子序列中剩余的报文所构成的报文子序列,重新确定为所述目标报文序列,并继续执行步骤202;如果否,则将所述第二报文子序列转发至对应的数据库节点。
在本说明书中,所述中转节点将客户端发送的基于Extended Query协议的报文序列确定为目标报文序列。
在实际应用中,所述客户端需要通过所述中转节点,向所述数据库节点发送基于Extended Query协议的报文序列,以使所述中转节点先对接收到的报文序列进行拆分、识别读写属性等处理,再将处理后的报文序列转发至对应的数据库节点。
例如,与PostgreSQL数据库节点对应的中间件,在接收到的客户端发送的报文序列CPDBES时,可以先将所述报文序列CPDBES确定为目标报文序列。
又例如,与PostgreSQL数据库节点对应的中间件在接收到客户端发送的报文序列PDBECPDBES时,可以先将所述报文序列PDBECPDBES确定为目标报文序列。
在本说明书中,所述中转节点将客户端发送的基于Extended Query协议的报文序列确定为目标报文序列之后,将所述目标报文序列中的首个Bind报文之前的若干报文,拆分为第一报文子序列,并将所述第一报文子序列转发至对应的数据库节点。
在实际应用中,由于所述目标报文序列中的首个Bind报文之前的若干报文,主要可以包括用于指示数据库执行SQL语句前的准备阶段报文、执行完毕后的清理阶段报文以及获取执行计划信息的报文,不会导致数据库增加大量负荷;因此,可以先将此类报文拆分为第一报文子序列,并转发至对应的数据库节点。
例如,中间件在将报文序列CPDBES确定为目标报文序列之后,可以先将目标报文序列CPDBES中,Bind报文之前的“CPD”拆分为第一报文子序列,并将所述第一报文子序列CPD转发至对应的数据库节点。
又例如,中间件在将报文序列PDBECPDBES确定为目标报文序列之后,可以先将目标报文序列PDBECPDBES中,首个Bind报文之前的“PD”拆分为第一报文子序列,并将所述第一报文子序列PD转发至对应的数据库节点。
在示出的一种实施方式中,所述数据库节点包括多个数据库子节点;所述中转节点将所述第一报文子序列转发至对应的数据库节点的过程,可以包括:将所述第一报文子序列广播发送至所述数据库节点中的所有子节点。
例如,中间件在将报文序列CPDBES确定为目标报文序列之后,可以先将目标报文序列CPDBES中,Bind报文之前的“CPD”拆分为第一报文子序列,并将所述第一报文子序列CPD广播发送至所有数据库子节点。
需要说明的是,在以上示出的实施方式中,由于所述第一报文子序列主要可以包括用于指示数据库执行SQL语句前的准备阶段报文、执行完毕后的清理阶段报文以及获取执行计划信息的报文,因此,所述中转节点需要将所述第一报文子序列广播发送至所有数据库子节点,作为任一数据库子节点后续在接收到第二报文子序列或第三报文子序列时,可以正常执行SQL语句的基础。
在本说明书中,所述中转节点将所述第一报文子序列转发至对应的数据库节点之后,可以确定所述目标报文序列中剩余的报文所构成的第二报文子序列中的Bind报文的数量是否大于1。
在实际应用中,所述中转节点根据所述第二报文子序列中的Bind报文的数量是否大于1,可以确定是否需要进一步拆分所述第二报文子序列;如果大于1,则可以认为还需要对所述第二报文子序列进一步拆分;如果不大于1,则可以认为不需要对所述第二报文子序列进一步拆分了。
例如,中间件在将第一报文子序列CPD转发至对应的数据库节点之后,目标报文序列CPDBES中剩余的报文构成第二报文子序列BES;所述中间件可以确定第二报文子序列BES中的Bind报文的数量不大于1,无需对第二报文子序列BES进一步拆分。
又例如,中间件在将第一报文子序列PD转发至对应的数据库节点之后,目标报文序列PDBECPDBES中剩余的报文构成第二报文子序列BECPDBES;所述中间件可以确定第二报文子序列BECPDBES中的Bind报文的数量大于1,还需要对第二报文子序列BECPDBES进一步地拆分。
在本说明书中,如果所述中转节点确定所述第二报文子序列中的Bind报文的数量不大于1,则将所述第二报文子序列转发至对应的数据库节点。
在实际应用中,如果不需要对所述第二报文子序列进一步拆分,可以直接将所述第二报文子序列转发至对应的数据库节点。
例如,中间件在确定第二报文子序列BES中的Bind报文的数量不大于1之后,可以将第二报文子序列BES转发给对应的数据库节点。
在示出的一种实施方式中,所述数据库节点包括多个数据库子节点;所述中转节点将所述第二报文子序列转发至对应的数据库节点的过程,可以包括:将所述第二报文子序列转发至所述数据库节点中的任一子节点。
例如,中间件在确定第二报文子序列BES中的Bind报文的数量不大于1之后,可以将第二报文子序列BES转发给任一数据库子节点。
在示出的另一种实施方式中,所述多个数据库子节点包括主节点和至少一个从节点;所述中转节点将所述第二报文子序列转发至所述数据库节点中的任一子节点的过程,可以包括:如果与所述首个Bind报文对应的Parse报文中包括与写操作对应的SQL语句,则将所述第二报文子序列转发至所述主节点;如果与所述首个Bind报文对应的Parse报文中包括与读操作对应的SQL语句,则将所述第二报文子序列转发至任一所述从节点。
在实际应用中,可以在所述数据库节点的多个数据库子节点中,预先配置用于执行与写操作对应的SQL语句的写节点,作为主节点;以及可以预先配置至少一个用于执行与读操作对应的SQL语句的只读节点,作为从节点。
例如,中间件在将报文序列CPDBES确定为目标报文序列时,如果目标报文序列CPDBES中的Parse报文中包括与写操作对应的SQL语句,所述中间件可以将第二报文子序列BES转发给主节点131,以使主节点131执行写操作对应的SQL语句;如果目标报文序列CPDBES中的Parse报文中包括与读操作对应的SQL语句,所述中间件可以将第二报文子序列BES转发给从节点132或从节点133,以使所述任一从节点执行与读操作对应的SQL语句。
需要说明的是,在以上示出的实施方式中,关于确定与Parse报文中的SQL语句对应的读/写操作的具体方式,所述中转节点可以检测所述Parse报文中的SQL语句所携带的语法关键字;如果检测到UPDATE(更新)、INSERT(插入)、或DELETE(删除)等语法关键字,可以认为所述Parse报文中包括与写操作对应的SQL语句;如果检测到SELECT(查询)等语法关键字,可以认为所述Parse报文中包括与读操作对应的SQL语句。
应当理解的是,关于确定与Parse报文中的SQL语句对应的读/写操作的具体方式,以上仅仅是示例性的描述,并不对本说明书做限制,本领域技术人员也可以采用其他实现方式。
在本说明书中,如果所述中转节点确定所述第二报文子序列中的Bind报文的数量大于1,则将所述第二报文子序列中的与所述首个Bind报文对应的Execute报文的之前的若干报文和所述Execute报文,拆分为第三报文子序列,并将所述第三报文子序列转发至对应的数据库节点。
在实际应用中,如果还需要对所述第二报文子序列进一步拆分,由于从Bind报文到与所述Bind报文对应的Execute报文之间的若干报文,主要包括用于指示数据库执行SQL语句的报文,会导致数据库负荷增加;因此,可以将此类报文拆分为第三报文子序列,并转发至对应的数据库节点。
例如,中间件在确定第二报文子序列BECPDBES中的Bind报文的数量大于1之后,由于在第二报文子序列BECPDBES中与首个Bind报文对应的是首个Execute报文,因此可以将首个Execute报文之前若干报文、以及所述首个Execute报文拆分为第三报文子序列,即将第二报文子序列BECPDBES中的首个“BE”拆分为第三报文子序列,并将所述第三报文子序列BE转发至对应的数据库节点。
在示出的一种实施方式中,所述数据库节点包括多个数据库子节点;所述中转节点将所述第三报文子序列转发至对应的数据库节点的过程,可以包括:将所述第三报文子序列转发至所述数据库节点中的任一子节点。
例如,中间件在确定第二报文子序列BECPDBES中的Bind报文的数量大于1,并将首个Execute报文之前的“BE”拆分为第三报文子序列之后,可以直接将所述第三报文子序列BE转发给任一数据库子节点。
需要说明的是,在以上示出的实施方式中,由于所述第二报文子序列或者所述第三报文子序列,主要包括用于指示数据库执行SQL语句的报文,因此,所述中转节点只需将所述第二报文子序列或者所述第三报文子序列转发至任一数据库子节点,以使所述数据库子节点可以根据所述中转节点广播发送的第一报文子序列和所述第二报文子序列或者所述第三报文子序列,执行SQL语句即可。
在示出的另一种实施方式中,所述多个数据库子节点包括主节点和至少一个从节点;所述中转节点将所述第三报文子序列转发至所述数据库节点中的任一子节点的过程,可以包括:如果与所述首个Bind报文对应的Parse报文中包括与写操作对应的SQL语句,则将所述第三报文子序列转发至所述主节点;如果与所述首个Bind报文对应的Parse报文中包括与读操作对应的SQL语句,则将所述第三报文子序列转发至任一所述从节点。
例如,中间件在将报文序列PDBECPDBES确定为目标报文序列时,如果目标报文序列PDBECPDBES中的首个Parse报文中包括与写操作对应的SQL语句,则可以将第三报文子序列BE转发给主节点131,以使主节点131执行写操作对应的SQL语句;如果目标报文序列PDBECPDBES中的首个Parse报文中包括与读操作对应的SQL语句,则可以将第三报文子序列BE转发给从节点132或从节点133,以使所述任一从节点执行与读操作对应的SQL语句。
需要说明的是,在以上示出的实施方式中,当所述数据库节点包括主节点和至少一个从节点时,所述主节点可以只用于执行与写操作对应的SQL语句,所述至少一个从节点可以用于执行与读操作对应的SQL语句,从而可以实现读写分离,并且可以减轻主节点的性能负担。
在示出的一种实施方式中,所述中转节点将所述第二报文子序列或者所述第三报文子序列转发至任一所述从节点的过程,可以包括:基于预设的负载均衡策略,确定用于处理所述第二报文子序列或者所述第三报文子序列的目标从节点;将所述第二报文子序列或者所述第三报文子序列转发至确定出的所述目标从节点。
在实际应用中,所述多个数据库子节点中可以包括至少一个从节点,所述中转节点可以基于预设的负载均衡策略,先从所述至少一个从节点中,确定用于处理所述第二报文子序列或者所述第三报文子序列的目标从节点,再进行转发。
例如,中间件基于预设的负载均衡策略,可以根据当前从节点132和从节点133的实际负载情况,将负载最小的从节点确定为目标从节点,并将所述第二报文子序列或者所述第三报文子序列转发至所述目标从节点。
又例如,中间件基于预设的负载均衡策略,可以利用预设的随机算法计算出目标从节点,并将所述第二报文子序列或者所述第三报文子序列转发至所述目标从节点,从而将所述第二报文子序列或者所述第三报文子序列平均分配给所述至少一个从节点。
需要说明的是,在以上示出的实施方式中,关于预设的负载均衡策略,以上仅仅是示例性的描述,并不对本说明书做限制;在实际应用中,用户也可以根据需求,为所述中转节点灵活地配置其他负载均衡策略,从而在读写分离的场景中,实现负载均衡的效果。
另外,需要说明的是,相较于相关技术中完全不拆封客户端发送的报文序列,并直接将所述未拆封的报文序列转发给数据库节点的技术方案,在以上示出的实施方式中,由于所述中转节点将第一报文子序列广播发送至所有数据库子节点,并根据预设的负载均衡策略,将第二报文子序列或第三报文子序列转发至目标从节点,可以实现更好的负载均衡效果。
例如,当客户端发送的报文序列为PDBECPDBES时,在相关技术中,可以直接将报文序列PDBECPDBES转发至任一数据库子节点,以使所述数据库子节点分别执行与首个Parse报文和第二个Parse报文对应的执行计划;而在本说明书的技术方案中,可以先将第三报文子序列BE转发至目标数据库子节点,然后拆分出下一个第一报文子序列CPD,并广播发送至所有数据库子节点,再将剩余的第二报文子序列BES,转发至重新确定的目标数据库子节点。由此可见,在本说明书中,可以由不同的数据库子节点分别执行与同一个报文序列中不同Parse报文对应的执行计划,从而实现更好的负载均衡效果。
在本说明书中,所述中转节点将所述第三报文子序列转发至对应的数据库节点之后,将所述第二报文子序列中剩余的报文所构成的报文子序列,重新确定为所述目标报文序列,并重复执行以上步骤,直至客户端发送的所述报文序列中的报文均被转发至对应的数据库节点。
在实际应用中,所述中转节点将所述第三报文子序列转发至对应的数据库节点之后,所述中转节点还可以继续对所述第二报文子序列中剩余的报文所构成的报文子序列进一步处理,可以将所述第二报文子序列中剩余的报文所构成的报文子序列重新确定为目标报文序列,并重复执行以上拆分、转发等步骤,直至客户端发送的所述报文序列中的报文均被转发至对应的数据库节点。
例如,中间件在将第三报文子序列BE转发至对应的数据库节点之后,可以将第二报文子序列BECPDBES中剩余的报文子序列CPDBES重新确定为目标报文序列,并重复执行以上示出的步骤,直到重新确定的目标报文序列CPDBES中的报文均被转发至对应的数据库节点时,结束循环。
通过以上技术方案可知,与PostgreSQL数据库节点对应的中转节点,可以先将目标报文序列中的首个Bind报文之前的若干报文,拆分为第一报文子序列,还可以通过所述目标报文序列中剩余的报文所构成的第二报文子序列中的Bind报文的数量是否大于1,来确定是否需要进一步拆分所述第二报文子序列,从而所述中转节点可以按需将客户端发送的报文序列拆分为若干报文子序列,而无需将所述报文序列逐个报文进行拆分,可以减少所述中转节点针对一个报文序列进行拆分以及转发的次数,实现网络处理性能的提高。
由于所述目标报文序列中的首个Bind报文之前的若干报文,主要包括用于指示数据库执行SQL语句前的准备阶段报文、执行完毕后的清理阶段报文以及获取执行计划信息的报文,不会导致数据库增加大量负荷;而从Bind报文到与所述Bind报文对应的Execute报文之间的若干报文,主要包括用于指示数据库执行SQL语句的报文,会导致数据库负荷增加;因此,所述中转节点从目标报文序列中,可以按照负载均衡的需求拆分出第一报文子序列、第二报文子序列或第三报文子序列,并可以进一步地将拆分出的各报文子序列分别转发至对应的数据库节点。
为了方便理解实现所述报文处理方法的过程中的多方交互,下面以所述报文处理方法应用于代理服务器为例,对本申请进行描述。
请参见图3,图3是一示例性的实施例示出的一种报文处理方法的多方交互图,所述方法执行以下步骤:
步骤301:发送基于Extended Query协议的报文序列;
步骤302:将所述报文序列确定为目标报文序列,并迭代执行步骤303-步骤310-2,直至客户端发送的所述报文序列中的报文均被转发至对应的数据库节点;
步骤303:检测所述目标报文序列中的与所述首个Bind报文对应的Parse报文是否携带执行计划标识;
步骤304-1:如果未携带,则将所述目标报文序列转发至对应的数据库节点;
步骤304-2:如果携带,则将所述目标报文序列中的首个Bind报文之前的若干报文,拆分为第一报文子序列,并将所述第一报文子序列转发至对应的数据库节点;
步骤305:返回针对所述第一报文子序列的处理结果;
步骤306:将针对所述第一报文子序列的所述处理结果转发给所述客户端;
步骤307:确定所述目标报文序列中剩余的报文所构成的第二报文子序列中的Bind报文的数量是否大于1;
步骤308-1:如果否,则将所述第二报文子序列转发至对应的数据库节点;步骤309-1:返回针对所述第二报文子序列的处理结果;
步骤310-1:将针对所述第二报文子序列的所述处理结果转发给所述客户端;
步骤308-2:如果是,则将所述第二报文子序列中的与所述首个Bind报文对应的Execute报文的之前的若干报文和所述Execute报文,拆分为第三报文子序列,并将所述第三报文子序列转发至对应的数据库节点;以及将所述第二报文子序列中剩余的报文所构成的报文子序列,重新确定为所述目标报文序列,并继续执行所述步骤303;
步骤309-2:返回针对所述第三报文子序列的处理结果;
步骤310-2:将针对所述第三报文子序列的所述处理结果转发给所述客户端。
在本说明书中,步骤301-步骤302、步骤304-2、步骤307-步骤308-2的具体实现方式与所述步骤201-步骤204相似,在此不再赘述,请参见上述实施例。
在示出的一种实施方式中,所述中转节点将所述目标报文序列中的首个Bind报文之前的若干报文,拆分为第一报文子序列之前,还包括:检测所述目标报文序列中的与所述首个Bind报文对应的Parse报文是否携带执行计划标识;如果未携带,则将所述目标报文序列转发至对应的数据库节点;如果携带,则进一步地将所述目标报文序列中的首个Bind报文之前的若干报文,拆分为第一报文子序列。
在实际应用中,如果所述Parse报文未携带执行计划标识,则对应创建的执行计划通常只使用一次就销毁,因此无需考虑后续的负载均衡,可以不拆分目标报文序列,直接转发至对应的目标数据库节点。
例如,与PostgreSQL数据库节点对应的中间件,在接收到的目标报文序列PBDES时,如果检测到所述目标报文序列中的Parse报文未携带执行计划标识,可以直接将未拆分的报文序列PBDES转发至对应的数据库节点。
又例如,与PostgreSQL数据库节点对应的中间件在接收到目标报文序列PDBECPDBES时,如果检测到所述目标报文序列中的Parse报文携带有执行计划标识,可以先将目标报文序列PDBECPDBES中,首个Bind报文之前的“PD”拆分为第一报文子序列,并将所述第一报文子序列PD转发至对应的数据库节点。
需要说明的是,在以上示出的实施方式中,由于目标报文序列PBDES中的Parse报文通常并未携带执行计划标识,对应的执行计划只执行一次,因此无需对目标报文序列PBDES进行拆分,所述中转节点可以直接将目标报文序列PBDES转发至对应的数据库节点。
在示出的一种实施方式中,所述中转节点将所述第一报文子序列广播发送至所述数据库节点中的所有子节点之后,还包括:接收所述主节点以及所述从节点返回的针对所述第一报文子序列的处理结果;丢弃所述从节点返回的所述处理结果,并将所述主节点返回的所述处理结果进一步返回给所述客户端。
在实际应用中,由于所述中转节点将所述第一报文序列广播发送至所有数据库子节点,因此,所有数据库子节点都会向所述中转节点返回针对所述第一报文子序列的处理结果,并且每个所述数据子节点返回的所述处理结果是相同的,而所述中转节点只需要保留一份所述处理结果并转发给所述客户端即可。
例如,假设数据库子节点针对第一报文子序列CPD的处理结果为C’P’D’;中间件在将第一报文子序列CPD广播发送至主节点131、从节点132和133之后,可以接收到主节点131、从节点132和133返回的处理结果C’P’D’;可以直接丢弃从节点132和133返回的处理结果,并将主节点131返回的所述处理结果C’P’D’转发给所述客户端。
在示出的一种实施方式中,所述中转节点将所述第二报文子序列或者所述第三报文子序列转发至所述数据库节点中的任一子节点之后,还包括:如果将所述第二报文子序列或者所述第三报文子序列转发至所述主节点,则接收所述主节点返回的针对所述第二报文子序列或者所述第三报文子序列的处理结果,并将所述主节点返回的所述处理结果进一步返回给所述客户端;如果将所述第二报文子序列或者所述第三报文子序列转发至任一所述从节点,则接收任一所述从节点返回的针对所述第二报文子序列或者所述第三报文子序列的处理结果,并将任一所述从节点返回的所述处理结果进一步返回给所述客户端。
例如,中间件在将报文序列CPDBES确定为目标报文序列时,如果目标报文序列CPDBES中的Parse报文中包括与写操作对应的SQL语句,所述中间件可以将第二报文子序列BES转发给主节点131;假设主节点131针对第二报文子序列BES的处理结果为B’E’S’,则中间件可以接收到主节点131返回的处理结果B’E’S’,并将所述处理结果B’E’S’转发给客户端。
又例如,中间件在将报文序列PDBECPDBES确定为目标报文序列时,如果目标报文序列PDBECPDBES中的首个Parse报文中包括与读操作对应的SQL语句,则可以将第三报文子序列BE转发给从节点132;假设从节点132针对第三报文子序列BE的处理结果为B’E’,则中间件可以接收到从节点132返回的处理结果B’E’,并将所述处理结果B’E’转发给客户端。
与上述报文处理方法的实施例对应的,本说明书还提供了一种报文处理装置的实施例。
本说明书的报文处理装置的实施例可以应用在电子设备上。装置实施例可以通过软件实现,也可以通过硬件或者软硬件结合的方式实现。以软件实现为例,作为一个逻辑意义上的装置,是通过其所在电子设备的处理器,将非易失性存储器中对应的计算机程序指令读取到内存中运行形成的。从硬件层面而言,请参见图4,图4是一示例性的实施例示出的一种报文处理装置所在电子设备的硬件结构图,除了图4所示的处理器、内存、网络接口、以及非易失性存储器之外,实施例中装置所在的电子设备通常根据该电子设备的实际功能,还可以包括其他硬件,对此不再赘述。
请参见图5,图5是一示例性的实施例示出的一种报文处理装置的框图。该报文处理装置可以应用于图4所示的电子设备;所述报文处理装置可以包括:
第一确定单元501,用于将客户端发送的基于Extended Query协议的报文序列确定为目标报文序列,并迭代调用以下第一转发单元502、第二确定单元503、第二转发单元504,直至客户端发送的所述报文序列中的报文均被转发至对应的数据库节点;
所述第一转发单元502,用于将所述目标报文序列中的首个Bind报文之前的若干报文,拆分为第一报文子序列,并将所述第一报文子序列转发至对应的数据库节点;
所述第二确定单元503,用于确定所述目标报文序列中剩余的报文所构成的第二报文子序列中的Bind报文的数量是否大于1;
所述第二转发单元504,用于如果所述第二确定单元503确定所述第二报文子序列中的Bind报文的数量不大于1,则将所述第二报文子序列转发至对应的数据库节点;如果所述第二确定单元503确定所述第二报文子序列中的Bind报文的数量大于1,则将所述第二报文子序列中的与所述首个Bind报文对应的Execute报文的之前的若干报文和所述Execute报文,拆分为第三报文子序列,并将所述第三报文子序列转发至对应的数据库节点;以及将所述第二报文子序列中剩余的报文所构成的报文子序列,重新确定为所述目标报文序列。
在本实施例中,所述数据库节点包括多个数据库子节点;
所述第一转发单元502,具体用于:
将所述第一报文子序列广播发送至所述数据库节点中的所有子节点;
所述第二转发单元504,具体用于:
将所述第二报文子序列或者所述第三报文子序列转发至所述数据库节点中的任一子节点。
在本实施例中,所述多个数据库子节点包括主节点和至少一个从节点;其中,所述主节点用于执行与写操作对应的SQL语句,所述从节点用于执行与读操作对应的SQL语句;
所述第二转发单元504,具体用于:
如果与所述首个Bind报文对应的Parse报文中包括与写操作对应的SQL语句,则将所述第二报文子序列或者所述第三报文子序列转发至所述主节点;
如果与所述首个Bind报文对应的Parse报文中包括与读操作对应的SQL语句,则将所述第二报文子序列或者所述第三报文子序列转发至任一所述从节点。
在本实施例中,所述第二转发单元504,具体用于:
基于预设的负载均衡策略,确定用于处理所述第二报文子序列或者所述第三报文子序列的目标从节点;
将所述第二报文子序列或者所述第三报文子序列转发至确定出的所述目标从节点。
在本实施例中,所述第一转发单元502将所述第一报文子序列广播发送至所述数据库节点中的所有子节点之后,还用于:
接收所述主节点以及所述从节点返回的针对所述第一报文子序列的处理结果;
丢弃所述从节点返回的所述处理结果,并将所述主节点返回的所述处理结果进一步返回给所述客户端。
在本实施例中,所述第二转发单元504将所述第二报文子序列或者所述第三报文子序列转发至所述数据库节点中的任一子节点之后,还用于:
如果将所述第二报文子序列或者所述第三报文子序列转发至所述主节点,则接收所述主节点返回的针对所述第二报文子序列或者所述第三报文子序列的处理结果,并将所述主节点返回的所述处理结果进一步返回给所述客户端;
如果将所述第二报文子序列或者所述第三报文子序列转发至任一所述从节点,则接收任一所述从节点返回的针对所述第二报文子序列或者所述第三报文子序列的处理结果,并将任一所述从节点返回的所述处理结果进一步返回给所述客户端。
在本实施例中,所述第一转发单元502将所述目标报文序列中的首个Bind报文之前的若干报文,拆分为第一报文子序列之前,还用于:
检测所述目标报文序列中的与所述首个Bind报文对应的Parse报文是否携带执行计划标识;其中,所述Parse报文用于指示所述数据库节点创建一个执行计划;
如果未携带,则将所述目标报文序列转发至对应的数据库节点;
如果携带,则进一步地将所述目标报文序列中的首个Bind报文之前的若干报文,拆分为第一报文子序列。
上述装置中各个单元的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。
对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例只是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本说明书方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机,计算机的具体形式可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件收发设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任意几种设备的组合。
在一个典型的配置中,计算机包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带、磁盘存储、量子存储器、基于石墨烯的存储介质或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
在本说明书一个或多个实施例中使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本说明书一个或多个实施例。在本说明书一个或多个实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
应当理解,尽管在本说明书一个或多个实施例可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本说明书一个或多个实施例范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
以上所述仅为本说明书一个或多个实施例的较佳实施例而已,并不用以限制本说明书一个或多个实施例,凡在本说明书一个或多个实施例的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本说明书一个或多个实施例保护的范围之内。