CN110851266A - 通过分区和虚拟进程的负载平衡 - Google Patents
通过分区和虚拟进程的负载平衡 Download PDFInfo
- Publication number
- CN110851266A CN110851266A CN201910719294.6A CN201910719294A CN110851266A CN 110851266 A CN110851266 A CN 110851266A CN 201910719294 A CN201910719294 A CN 201910719294A CN 110851266 A CN110851266 A CN 110851266A
- Authority
- CN
- China
- Prior art keywords
- worker
- virtual
- partition
- partitions
- aggregator
- 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
- 238000005192 partition Methods 0.000 title claims abstract description 206
- 230000008569 process Effects 0.000 title claims abstract description 89
- 238000000034 method Methods 0.000 claims abstract description 137
- 230000015654 memory Effects 0.000 claims description 22
- 238000004088 simulation Methods 0.000 abstract description 206
- 238000013475 authorization Methods 0.000 description 59
- 230000008859 change Effects 0.000 description 26
- 230000006399 behavior Effects 0.000 description 18
- 230000006870 function Effects 0.000 description 18
- 238000004891 communication Methods 0.000 description 17
- 238000004422 calculation algorithm Methods 0.000 description 16
- 238000011161 development Methods 0.000 description 15
- 230000005012 migration Effects 0.000 description 15
- 238000013508 migration Methods 0.000 description 15
- 230000005540 biological transmission Effects 0.000 description 12
- 238000000638 solvent extraction Methods 0.000 description 11
- 230000004044 response Effects 0.000 description 9
- 238000013500 data storage Methods 0.000 description 7
- 230000010354 integration Effects 0.000 description 7
- 239000011800 void material Substances 0.000 description 7
- 230000009471 action Effects 0.000 description 5
- 238000005516 engineering process Methods 0.000 description 5
- 238000012545 processing Methods 0.000 description 5
- 230000001360 synchronised effect Effects 0.000 description 5
- 230000002776 aggregation Effects 0.000 description 4
- 238000004220 aggregation Methods 0.000 description 4
- 238000013459 approach Methods 0.000 description 4
- 230000003139 buffering effect Effects 0.000 description 4
- 230000007704 transition Effects 0.000 description 4
- 230000009286 beneficial effect Effects 0.000 description 3
- 230000008901 benefit Effects 0.000 description 3
- 238000007726 management method Methods 0.000 description 3
- 230000008520 organization Effects 0.000 description 3
- 230000002085 persistent effect Effects 0.000 description 3
- 239000011435 rock Substances 0.000 description 3
- 238000013473 artificial intelligence Methods 0.000 description 2
- 239000000872 buffer Substances 0.000 description 2
- 238000004364 calculation method Methods 0.000 description 2
- 238000004590 computer program Methods 0.000 description 2
- 238000010586 diagram Methods 0.000 description 2
- 230000000694 effects Effects 0.000 description 2
- 238000013507 mapping Methods 0.000 description 2
- 230000007246 mechanism Effects 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- 239000013307 optical fiber Substances 0.000 description 2
- 238000006116 polymerization reaction Methods 0.000 description 2
- 241000239290 Araneae Species 0.000 description 1
- 241000699670 Mus sp. Species 0.000 description 1
- 230000004931 aggregating effect Effects 0.000 description 1
- 238000004458 analytical method Methods 0.000 description 1
- 239000003795 chemical substances by application Substances 0.000 description 1
- 230000006835 compression Effects 0.000 description 1
- 238000007906 compression Methods 0.000 description 1
- 230000008878 coupling Effects 0.000 description 1
- 238000010168 coupling process Methods 0.000 description 1
- 238000005859 coupling reaction Methods 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 230000001419 dependent effect Effects 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 230000007613 environmental effect Effects 0.000 description 1
- 230000001747 exhibiting effect Effects 0.000 description 1
- 238000002474 experimental method Methods 0.000 description 1
- 230000036541 health Effects 0.000 description 1
- 230000003993 interaction Effects 0.000 description 1
- 230000002452 interceptive effect Effects 0.000 description 1
- 230000001788 irregular Effects 0.000 description 1
- 230000007774 longterm Effects 0.000 description 1
- 239000002184 metal Substances 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000012544 monitoring process Methods 0.000 description 1
- 230000002688 persistence Effects 0.000 description 1
- 239000002574 poison Substances 0.000 description 1
- 231100000614 poison Toxicity 0.000 description 1
- 239000000244 polyoxyethylene sorbitan monooleate Substances 0.000 description 1
- 238000011084 recovery Methods 0.000 description 1
- 238000009877 rendering Methods 0.000 description 1
- VEMKTZHHVJILDY-UHFFFAOYSA-N resmethrin Chemical compound CC1(C)C(C=C(C)C)C1C(=O)OCC1=COC(CC=2C=CC=CC=2)=C1 VEMKTZHHVJILDY-UHFFFAOYSA-N 0.000 description 1
- 238000013515 script Methods 0.000 description 1
- 239000007787 solid Substances 0.000 description 1
- 108020001568 subdomains Proteins 0.000 description 1
- 238000012546 transfer Methods 0.000 description 1
- 230000001052 transient effect Effects 0.000 description 1
- 239000013598 vector Substances 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/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5061—Partitioning or combining of resources
-
- 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/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5083—Techniques for rebalancing the load in a distributed system
- G06F9/5088—Techniques for rebalancing the load in a distributed system involving task migration
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
提出了用于在模拟中确定分区和虚拟进程的方法、系统、计算机可读介质和装置。可以确定模拟世界的多个分区,并且其中每个分区可以对应于关于模拟世界中的实体的不同度量。还可以确定用于模拟世界的多个虚拟进程。该系统可以为每个分区分配不同的虚拟进程。可以将分区的指示发送到一个或多个分区执行器服务,并且可以将虚拟进程的指示发送到虚拟进程管理器。
Description
相关申请的交叉引用
本申请要求2018年8月3日提交的名称为“通过分区和虚拟进程对数据相关计算进行的可分布和可定制的负载平衡(DISTRIBUTABLE AND CUSTOMIZABLE LOAD-BALANCING OFDATA-ASSOCIATED COMPUTATION VIA PARTITIONS AND VIRTUAL PROCESSES)”的美国申请第16/054,135号的优先权,上述申请通过引用并入本文用于所有目的。
技术领域
本文描述的方面一般涉及计算机、网络、硬件和软件。更具体地,本文描述的一些方面涉及分布式持久性的基于计算机的模拟,包括经由分层聚合器和连接迁移对数据订阅进行负载平衡,用于控制所述模拟的网络化系统架构,和/或可分布和可定制的负载平衡。
背景技术
传统的模拟系统无法扩展以支持数量庞大的对象以实时模拟这些对象。这样的系统通常依赖于在单个物理或虚拟计算机系统上运行的模拟引擎的单个实例来模拟整个模拟世界。这些模拟系统的用户不得不在正确性、图形保真度和实时交互之间做出选择,而没有在大规模系统上提供针对所有这三者的能力的解决方案。如果用户希望模拟可能需要比单个模拟引擎所能提供的更多的计算能力的复杂现实世界问题,则上述情况的程度和复杂性进一步增加。例如,城市的模拟可能需要模拟大量车辆、行人、骑自行车者、交通模式、交通灯、地铁系统、运输车辆、飞机以及影响和贡献城市生活的众多其他实体。
在一种已知方法中,计算资源已被静态地分配给模拟世界的一部分。这种方法的缺点可能是:由于模拟对象(诸如角色等)随着模拟的进行而在整个模拟世界范围内移动,因此模拟对象可能聚集在模拟世界的非常小的区域上。如果足够的对象移动到非常小的区域,则计算资源可能过载(导致处理较慢),模拟可能意外终止,和/或模拟数据可能丢失。该方法的另一个缺点可能是:针对区域的模拟的状态信息可能集中在单个计算资源上,并且可能不在多个资源上共享或分布,使得容错或意外终止后恢复变得困难且耗时。此外,这种方法可能无法使其轻易支持模拟对象跨区域边界进行的有状态迁移,因此模拟通常使有状态迁移仅限于玩家。
本文解决了这些问题及其他问题。
发明内容
以下呈现了本文描述的各个方面的简要发明内容。该发明内容不是广泛的概述,并且不旨在标识关键或重要元素或划定权利要求的范围。以下概述仅以简化形态呈现一些构思,作为下面提供的具体实施方式的介绍性前序。
为了克服上述现有技术中的限制,并且为了克服在阅读和理解本说明书时将出现的其他限制,本文描述的方面涉及系统、计算机可读介质、装置和包括将第一节点与第一聚合器连接的方法。第一聚合器可以与第二节点连接。基于确定出与第一聚合器连接的第一节点的第一流式查询订阅已经改变为第二流式查询订阅,聚合器控制器设备可以确定第一节点待迁移到的另一个聚合器。基于第二流式查询订阅,聚合器控制器设备可以确定第一节点待迁移到的第二聚合器。可以向第一节点和第一聚合器中的一个或多个发送将第一节点迁移到第二聚合器的指示。可以使第一节点与第一聚合器断开连接,并且可以将第一节点与第二聚合器连接。
在一些示例中,第一节点可以包括客户端或聚合器。附加地或替代地,第二节点可以包括第三聚合器或数据源。可选地,该方法可以包括在将第一节点与第二聚合器连接之后使第一节点订阅包括第二流式查询订阅的流式查询订阅。
在一些示例中,可以基于确定将第一节点迁移到第二聚合器会减少经由至少包括第一节点和第二节点的网络的多个连接而发送的数据量来确定第一节点待迁移到的第二聚合器。附加地或替代地,可以基于与第二流式查询订阅和一个或多个其他流式查询订阅的重叠部分相对应的数据量来确定第一节点待迁移到的第二聚合器,其中,所述一个或多个其他流式查询订阅与第二聚合器相关联。附加地或替代地,可以基于第二流式查询订阅与一个或多个其他流式查询订阅的重叠量来确定第一节点待迁移到的第二聚合器,其中,所述一个或多个其他流式查询订阅与第二聚合器相关联。
在一些示例中,一个或多个其他流式查询订阅可以包括与第二聚合器连接的第三节点的第三流式查询订阅。该方法还可以包括确定包括第二流式查询订阅和第三流式查询订阅的第四流式查询订阅。可以使第二聚合器订阅第二节点的第四流式查询订阅。
在一些示例中,该方法还可以包括由第二聚合器接收与第四流式查询订阅相关联的更新数据。第二聚合器可以确定更新数据中与第二流式查询订阅相对应的一部分和更新数据中与第三流式查询订阅相对应的一部分。第二聚合器可以向第一节点发送更新数据中与第二流式查询订阅相对应的部分。第二聚合器还可以向第三节点发送更新数据中与第三流式查询订阅相对应的部分。
在一些示例中,第二节点可以包括数据源。发送迁移指示可以包括:向第一节点发送临时存储用于更新数据源的数据的请求。该方法还可以包括:在将第一节点与第二聚合器连接之后,由第二聚合器从第一节点接收在迁移期间由第一节点临时存储的数据。
在一些示例中,该方法可以包括确定出第二节点过载。基于确定出第二节点过载,第二聚合器可以与一个或多个其他聚合器组合以生成组合式聚合器。可以使与第二聚合器连接的客户端以及与一个或多个其他聚合器连接的客户端连接到组合式聚合器。
在一些示例中,该方法可以包括确定出第二节点过载。基于确定出第二节点过载,可以在第二聚合器和第二节点之间的层中生成第三聚合器。可以将第三聚合器与第二聚合器连接。第三聚合器还可以与第二聚合器的层中的一个或多个其他聚合器连接。还可以将第三聚合器与第二节点连接。
在一些示例中,该方法可以包括确定出聚合器控制器设备过载。基于确定出聚合器控制器设备过载,可以生成第二聚合器控制器设备。可以将第二聚合器控制器设备分配给由聚合器控制器设备监控的一个或多个聚合器。
在一些示例中,该方法可以包括向第二聚合器发送针对第一节点的当前数据视图的指示。
本文描述的方面涉及方法、系统、装置和存储计算机可执行指令的计算机可读介质,所述计算机可执行指令在被执行时使系统:通过接收针对所述模拟的工作器层中的多个工作器中每一工作器的流式查询的指示来执行模拟。模拟可以在多个机器上运行所述模拟的网桥层中的多个网桥,并且所述多个网桥可以被配置为促进工作器层中的多个工作器与所述模拟的数据库层中的一个或多个数据库之间的数据通信。可以将多个工作器中的每个工作器分配给多个网桥中的不同网桥。基于每个工作器的流式查询,可以将多个网桥分组为不同的网桥组。每个网桥组可以在多个机器中的不同机器上运行。
在一些示例中,所述多个网桥可包括第一多个网桥。一个或多个非暂时性计算机可读介质可以存储计算机可执行指令,所述计算机可执行指令在被执行时使系统通过在第二多个机器上运行第二多个网桥来执行模拟。第一多个网桥可以被配置为促进所述工作器层中的所述多个工作器与第二多个网桥之间的数据通信。第二多个网桥可以被配置为促进第一多个网桥与所述一个或多个数据库之间的数据通信。
在一些示例中,所述多个工作器中的第一工作器可以包括非托管工作器,并且所述多个工作器中的第二工作器可以包括托管工作器。可选地,所述一个或多个数据库可以包括多个数据库分片,并且每个数据库分片可以被配置为存储来自不同数据域的数据。可选地,所述多个机器可包括多个虚拟机。
在一些示例中,可以基于与不同网桥组中每个网桥组中的流式查询的重叠部分相对应的数据量来将所述多个网桥分组成不同的网桥组。
在一些示例中,所述一个或多个非暂时性计算机可读介质可以存储计算机可执行指令,该计算机可执行指令在被执行时使系统通过在所述多个机器当中的一个机器上运行数据库客户端来执行模拟。在机器上运行的每个网桥可以与数据库客户端连接。数据库客户端可以被配置为订阅流式查询,以用于从所述一个或多个数据库接收与流式查询相对应的流数据。
在一些示例中,所述一个或多个非暂时性计算机可读介质可以存储计算机可执行指令,该计算机可执行指令在被执行时使系统通过将机器上的流式查询组合成组合式流式查询来执行模拟。数据库客户端可以被配置为订阅组合式流式查询,以用于从一个或多个数据库接收与组合式流式查询相对应的流数据。
在一些示例中,数据库客户端可以被配置为将与流式查询相对应的流数据划分为多个流数据部分。数据库客户端可以被配置为向在机器上运行的每个网桥发送所述多个流数据部分中的一个。
在一些示例中,所述一个或多个非暂时性计算机可读介质可以存储计算机可执行指令,该计算机可执行指令在被执行时使系统通过确定向所述多个机器中的第一机器迁移所述多个网桥中的第一网桥并在所述多个机器中的第二机器上运行来执行模拟。可以将第一工作器分配给第一网桥。第二网桥可以在所述多个机器中的第一机器上运行。可以将第一工作器分配给在第一机器上运行的第二网桥。可选地,可以基于对应于针对第一工作器的流式查询和针对分配给在第一机器上运行的网桥的工作器的流式查询的重叠部分的数据量来确定迁移第一网桥。
本文描述的方面涉及方法、系统、计算机可读介质和装置,该装置包括控制所述装置的一些操作的一个或多个计算机处理器以及存储计算机可执行指令的存储器,计算机可执行指令在由所述一个或多个计算机处理器执行时使所述装置执行一个或多个步骤。例如,该装置可以确定模拟世界的多个分区。所述多个分区中的每个分区可以与多个度量中针对模拟世界中的一个或多个实体或模拟世界中的该实体的组件的不同度量相对应。该装置可以确定用于模拟世界的多个虚拟进程。该装置可以向所述多个分区中的每个分区分配所述多个虚拟进程中的不同虚拟进程。可以将所述多个分区的指示和针对所述多个分区中的每个分区的分配发送到一个或多个分区执行器服务。可以将所述多个虚拟进程的指示发送到虚拟进程管理器。
在一些示例中,模拟世界的所述多个分区可以包括第一分区和第二分区。可选地,所述多个度量可以包括模拟世界的第一有界区域和模拟世界的第二有界区域。可选地,模拟世界的第一有界区域可以与模拟世界的第二有界区域不同。可选地,第一分区可以与模拟世界的第一有界区域中的实体相对应。可选地,第二分区可以与模拟世界的第二有界区域中的实体相对应。在一些示例中,模拟世界中的实体能够在模拟世界的不同有界区域之间移动。
在一些示例中,模拟世界的所述多个分区可以包括第三分区。所述多个度量可以包括组件类型,且第三分区可以与具有该组件类型的实体相对应。可选地,虚拟进程管理器可以被配置为基于从装置接收的数据来启动或停止虚拟进程层中的虚拟进程。
在一些示例中,所述多个虚拟进程可以包括多个虚拟工作器。所述装置可以从外部计算设备接收利用在外部计算设备上运行的外部虚拟工作器来替换所述多个虚拟工作器中的第一虚拟工作器的请求。所述装置可以向工作器层发送使第一虚拟工作器与网桥层中的网桥断开连接的请求。可以将外部虚拟工作器与网桥层中的网桥连接以替换第一虚拟工作器。
在一些示例中,所述装置可以从配置数据库接收表示模拟世界的配置数据的数据。所述装置可以附加地或替代地从外部服务数据库接收外部数据。可以基于配置数据和外部数据来确定模拟世界的所述多个分区。
在一些示例中,所述多个分区中的第一分区可以与所述多个分区中的第二分区重叠。在其他示例中,所述多个分区中的第一分区可以不与所述多个分区中的第二分区重叠。
附图说明
通过参考以下结合附图的描述,可以获得对本文描述的方面及其优点的更完整的理解,其中相同的附图标记表示相同的特征,并且其中:
图1描绘了可以根据本文描述的一个或多个说明性方面使用的说明性计算机系统架构。
图2描绘了可以根据本文描述的一个或多个说明性方面使用的说明性虚拟化(管理程序)系统架构。
图3描绘了可以根据本文描述的一个或多个说明性方面使用的说明性的基于云的系统架构。
图4描绘了可以根据本文描述的一个或多个说明性方面使用的说明性实体架构。
图5描绘了可以根据本文描述的一个或多个说明性方面使用的说明性组件架构。
图6描绘了可以根据本文描述的一个或多个说明性方面使用的说明性工作器架构。
图7示出了根据本文描述的一个或多个说明性方面的说明性的基于查询的模拟开发环境的高级架构。
图8示出了根据本文描述的一个或多个说明性方面的查询聚合的示例。
图9示出了根据本文描述的一个或多个说明性方面的游戏模拟的示例。
图10示出了根据本文描述的一个或多个说明性方面的多个客户端和数据源的示例。
图11示出了根据本文描述的一个或多个说明性方面的多个客户端、多个聚合器和数据源的示例。
图12示出了根据本文描述的一个或多个说明性方面的查询聚合的示例。
图13A-B示出了根据本文描述的一个或多个说明性方面的包括聚合器控制器的示例系统。
图14A-B示出了根据本文描述的一个或多个说明性方面的包括聚合器控制器的示例系统。
图15示出了根据本文描述的一个或多个说明性方面的客户端连接迁移方法的示例。
图16示出了根据本文描述的一个或多个说明性方面的多个客户端、多个聚合器和数据源的示例。
图17示出了根据本文描述的一个或多个说明性方面的组合聚合器的示例。
图18示出了根据本文描述的一个或多个说明性方面添加聚合器级别的示例。
图19示出了根据本文描述的一个或多个说明性方面的生成和分配聚合器的方法的示例。
图20示出了根据本文描述的一个或多个说明性方面的数据高速缓存网络。
图21示出了根据本文描述的一个或多个说明性方面的说明性模拟环境的架构的一部分。
图22示出了根据本文描述的一个或多个说明性方面的示例性负载平衡策略系统。
图23示出了根据本文描述的一个或多个说明性方面的说明性负载平衡系统的高级架构。
图24示出了根据本文描述的一个或多个说明性方面的分区和策略意图的示例。
图25示出了根据本文描述的一个或多个说明性方面的多个实体和实体分配的示例。
图26示出了根据本文描述的一个或多个说明性方面替换工作器的示例。
图27示出了根据本文描述的一个或多个说明性方面的分区的重叠的示例。
具体实施方式
在以下对各种实施例的描述中,参考上面标识的附图并且其形成本发明的一部分,并且其中通过图示的方式示出了可以实践本文描述的方面的多种实施例。应当理解,可以使用其他实施例,并且可以在不脱离本文描述的范围的情况下进行结构和功能修改。各个方面能够具有其他实施例并且能够以各种不同方式实践或实施。另外,本文中使用的措辞和术语是出于描述的目的,不应被认为是限制性的。相反,本文中使用的短语和术语将被赋予其最宽泛的解释和含义。
如所属领域的技术人员在阅读以下公开内容时将了解,本文中所描述的各种方面可实施为方法、计算机系统或计算机程序产品。因此,这些方面可以采用完全硬件实施例、完全软件实施例或组合软件和硬件方面的实施例的形态。此外,这些方面可以采取由一个或多个计算机可读存储介质存储的计算机程序产品的形态,该计算机程序产品具有包含在存储介质中或上的计算机可读程序代码或指令。可以使用任何合适的计算机可读存储介质,包括硬盘、CD-ROM、光学存储设备、磁存储设备和/或其任何组合。可使用特定数据结构来更有效地实现本文描述的一个或多个方面,并且这样的数据结构被考虑在本文描述的计算机可执行指令和计算机可用数据的范围内。另外,表示如本文所述的数据或事件的各种信号可以以电磁波的形态在源和目的地之间传输,所述电磁波通过诸如金属线、光纤和/或无线传输介质(例如,空气和/或空间)的信号传导介质传播。
作为对以下更详细描述的主题的概括性介绍,本文描述的方面涉及用于提供分布式和持久性模拟开发环境的系统、方法和技术。在一些示例中,模拟开发环境也可以是经空间优化的。在一些其他示例中,模拟开发环境可能不是经空间优化的。本文描述的其他方面可以允许将现有的非分布式模拟程序集成到大规模分布式模拟中。本文描述的其他方面可以用于自动地和空间地平衡和分布模拟工作负载。
可以在包括独立环境、网络化环境、虚拟环境和/或基于云的环境等各种不同系统环境中使用计算机软件、硬件和网络。图1示出了可以根据本公开的一个或多个说明性实施例使用的模拟计算系统100中的模拟计算设备(或系统)101的框图的一个示例。例如,模拟计算设备101可以是经空间优化的模拟计算设备,并且模拟计算系统100可以是经空间优化的模拟计算系统。模拟计算设备101可以包括处理器103,其用于控制模拟计算设备101及其相关组件的整体操作,包括RAM 105、ROM 107、输入/输出模块109和存储器111。模拟计算设备101与一个或多个附加计算设备(例如,网络节点123、125、127、129和131)一同可以对应于本文描述的多个系统或设备中的任何一个,例如个人移动设备、客户端计算设备、专有模拟系统、附加的外部服务器和模拟计算系统100中的其他各种设备,例如经空间优化的模拟计算系统。如本文所述,这些各种计算系统可以单独地或组合地配置,以用于提供模拟计算系统100。除了上述特征之外,本文描述的技术还可以用于允许集成现有模拟程序,并且用于对整个模拟计算系统100上的模拟工作负载进行负载平衡,这将在本文中更全面地讨论。本领域技术人员将理解,如本文所述的模拟计算设备101(或设备123、125、127、129和131)的功能可以分布在多个处理设备上,例如,以将处理负载分布在多个计算机上,以基于处理器负载、在模拟世界内的位置、用户访问级别、服务质量(QoS)等来分离事务。
各种网络节点123、125、127、129和131可以经由诸如因特网的网络121互连。可以另外地或替代地使用其他网络,包括专用内联网、公司网络、局域网(LAN)、广域网(WAN)、城域网(MAN)、无线网络、个人网络(PAN)等。网络121用于说明的目的,并且可以用更少或额外的计算机网络代替。网络121可以具有任何已知网络拓扑中的一个或多个,并且可以使用各种不同协议中的一个或多个,例如以太网。设备123、125、127、129、131和其他设备(未示出)可以经由双绞线、同轴电缆、光纤、无线电波或其他通信介质而与一个或多个网络连接。
应当理解,所示的网络连接是说明性的,并且可以使用在计算机之间建立通信链路的其他手段。假设存在各种网络协议(例如TCP/IP、以太网、FTP、HTTP等)以及各种无线通信技术(例如GSM、CDMA、Wi-Fi和WiMAX),并且本文描述的模拟系统组件中的各种计算设备可以被配置为使用这些网络协议或技术中的任何一种进行通信。
本文使用的并且在附图中描绘的术语“网络”不仅指远程计算设备经由一个或多个通信路径耦合在一起的系统,而且还指可以不时地耦合到具有存储能力的系统的独立设备。因此,术语“网络”不仅包括“物理网络”而且还包括“内容网络”,其包括在所有物理网络上存在的数据。
输入/输出(I/O)模块109可以包括麦克风、键盘、触摸屏、游戏控制器、操纵杆和/或触控笔,模拟计算设备101的用户可以通过输入/输出(I/O)模块109提供输入,并且还可以包括用于提供音频输出的扬声器和用于提供文本、视听和/或图形输出的视频显示设备中的一个或多个。软件可以存储在存储器111和/或存储设备内,以向处理器103提供指令,以使模拟计算设备101能够执行各种动作。例如,存储器111可以存储由模拟计算设备101使用的软件,例如操作系统113、应用程序115和相关联的内部数据库117。数据库117可以包括第二数据库(例如,作为单独的表、报告等)。也就是说,取决于系统设计,信息可以存储在单个数据库中,或者分在不同的逻辑、虚拟或物理数据库中。存储器111中的各种硬件存储器单元可以包括以用于存储诸如计算机可读指令、数据结构、程序模块或其他数据的信息的任何方法或技术实现的易失性和非易失性、可移动和不可移动介质。模拟计算设备101和/或计算设备127、129、131还可以是移动终端(例如,移动电话、智能电话、个人数字助理(PDA)、笔记本电脑等),其包括各种其他组件,例如电池、扬声器和天线(未示出)。
本文描述的方面还可以利用许多其他通用或专用计算系统环境或配置来操作。可适用于本文描述的方面的其他计算系统、环境和/或配置的示例包括但不限于个人计算机、服务器计算机、手持或膝上型设备、基于车辆的计算设备、多处理器系统、基于微处理器的系统、可编程消费电子产品、网络个人计算机(PC)、小型计算机、大型计算机、包括任何上述系统或设备的分布式计算环境等。
图2示出了说明性模拟系统的高级架构。模拟系统可以是经空间优化的。如图所示,模拟系统200可以是单个服务器系统、多服务器系统或基于云的系统,且包括至少一个虚拟服务器202,其可以被配置成为模拟系统200提供模拟功能和/或可以为一个或多个客户端计算设备(例如,计算设备123、125、127、129、131)提供对模拟系统200的访问。虚拟服务器202可以包括一个或多个虚拟机240a-240n(本文中通常称为“虚拟机240”)。每个虚拟机240可以包括模拟运行时248的实例,其用于实例化、管理和监控服务器工作进程249a-249n的一个或多个实例(本文中通常称为“工作器249”)。如在下面进一步详细描述,模拟运行时248可以被配置为基于由模拟系统生成的模拟世界的特定分区的瞬时工作负载,根据需要自动地使工作器249加速或减速。模拟世界的分区可以是空间,但不一定是空间。
虚拟服务器202内的模拟运行时248的一个或多个实例可以彼此通信以确定可以充当主设备的实例。例如,模拟运行时248实例可以利用共识协议来确定主设备。主模拟运行时248实例可以负责对该虚拟服务器202内的其他模拟运行时248实例与在其他虚拟服务器202中执行的其他模拟运行时248之间的通信进行路由。如下面将更详细解释,模拟运行时248可以允许分布式模拟,其中可将模拟工作负载自动地分布在可用虚拟服务器202上。图2中所示的虚拟服务器202可部署成如同图1所示的模拟计算设备101的一个或多个实施例或其他已知的计算设备,和/或通过图1所示的模拟计算设备101的一个或多个实施例或其他已知的计算设备来实现。
虚拟服务器202可以包括具有与虚拟服务器202通信的一个或多个硬件元件的硬件层210。可选地,硬件层210可以包括一个或多个物理磁盘212、一个或多个物理设备214、一个或多个物理处理器216以及一个或多个物理存储器218。物理组件212、214、216和218可以包括例如上关于模拟计算设备101描述的任何组件。在一个示例中,物理设备214可以包括网络接口卡、视频卡、键盘、鼠标、输入设备、监控器、显示设备、扬声器、光驱、存储设备、通用串行总线连接、打印机、扫描仪、网络元件(例如,路由器、防火墙、网络地址转换器、负载均衡器、虚拟私有网络(VPN)网关、动态主机配置协议(DHCP)路由器等)、或与虚拟化服务器301连接或通信的任何设备。物理存储器218可包括任何类型的存储器。在另一示例中,物理存储器218可以存储数据,并且可以存储一个或多个程序、或可执行指令集合。存储在物理存储器218中的程序或可执行指令可以由虚拟服务器202的一个或多个处理器216执行。虚拟服务器202还可以包括主机操作系统220,其可以存储在物理存储器218中的存储器元件中并且可以由一个或多个物理处理器216执行。
按照模拟对系统资源具有直接访问权限的操作系统246或工作器249的任何方式,管理程序230可以向在虚拟机240上执行的操作系统246a-246n或工作器249提供虚拟资源。系统资源可以包括但不限于物理磁盘212、物理设备214、物理处理器216、物理存储器218以及在硬件层210中包括的任何其他组件。管理程序230可以用于对虚拟硬件仿真、对物理硬件进行分区、对物理硬件进行虚拟化和/或执行向模拟运行时248和工作器249提供计算资源的虚拟机。管理程序230可以控制用于在虚拟服务器202上执行的虚拟机240的处理器调度和存储器分区。
管理程序230可以是类型2管理程序,其中管理程序可以在虚拟服务器202上执行的主机操作系统220内执行。然后,虚拟机240可以在管理程序230之上的级别执行。类型2管理程序可以在主机操作系统220的上下文内执行,使得类型2管理程序与主机操作系统220交互。模拟系统200中的一个或多个虚拟服务器202可以替代地包括类型1管理程序(未示出)。类型1管理程序可以通过直接访问硬件层210内的硬件和资源在虚拟服务器202上执行。即,尽管类型2管理程序230可以如图所示通过主机操作系统220访问系统资源,但是类型1管理程序可以直接访问所有系统资源而无需主机操作系统220。类型1管理程序230可以直接在虚拟服务器202的一个或多个物理处理器316上执行,并且可以包括存储在物理存储器318中的程序数据。
模拟运行时248可以使管理程序230创建一个或多个虚拟机240,其中附加模拟运行时248和工作器249实例可以在客户操作系统246内执行。管理程序230可以加载虚拟机映像以创建虚拟机。管理程序230可以执行虚拟机240内的客户操作系统246。虚拟机240可以执行客户操作系统246。
除了创建虚拟机240之外,管理程序230还可以控制至少一个虚拟机240的执行。管理程序230可以向至少一个虚拟机240呈现由虚拟服务器202提供的至少一个硬件资源(例如,在硬件层210内可用的任何硬件资源)的抽象。管理程序230可以控制这种方式:其中虚拟机240可以访问在虚拟服务器202中可用的物理处理器216。控制对物理处理器216的访问可以包括确定虚拟机240是否应该有权访问处理器216以及如何将物理处理器能力呈现给虚拟机240。
如图2所示,虚拟服务器202可以托管或执行一个或多个虚拟机240。虚拟机240是可执行指令集合,其在由处理器216执行时模拟物理计算机的操作,使得虚拟机240可以类似于物理计算设备地执行程序和进程。尽管图2示出了虚拟服务器202托管两个虚拟机240的实施例,但是在其他实施例中,虚拟服务器202可以托管任意数量的虚拟机240。管理程序230可以为每个虚拟机240提供该虚拟机240可用的物理硬件、存储器、处理器以及其他系统资源的唯一的虚拟视图。可选地,管理程序230可以为每个虚拟机240提供该虚拟机240可用的物理硬件、存储器、处理器和其他系统资源的基本相似的虚拟视图。
每个虚拟机240可以包括虚拟磁盘242a-242n(总体上为242)和虚拟处理器244a-244n(总体上为244)。虚拟磁盘242可以是虚拟服务器202的一个或多个物理磁盘212的虚拟化视图,或者可以是虚拟服务器202的一个或多个物理磁盘212的一部分。物理磁盘212的虚拟化视图可以由管理程序230生成、提供和管理。管理程序230可以为每个虚拟机240提供物理磁盘212的唯一的视图。因此,与其他虚拟磁盘240相比,包括在每个虚拟机240中的特定虚拟磁盘242可以是唯一的。
虚拟机240a-240n可以使用虚拟处理器244a-244n来执行使用客户操作系统246a-246n的一个或多个工作器249a-249n。客户操作系统246可以是以下非详尽的操作系统列表中的任何一个:WINDOWS、UNIX、LINUX、iOS、ANDROID、SYMBIAN。客户操作系统246可以是基于一个或多个上述操作系统的专用操作系统。例如,客户操作系统246可以包括专用版本的LINUX,其可以仅包括支持工作器249的操作所必需的功能模块。可选地,并且如下面进一步详细描述,虚拟机240a-240n可以执行与在虚拟机240a-240n中执行的一个或多个工作器249a-249n相对应的一个或多个网桥模块(未示出)。
图2仅示出了可以使用的模拟系统的一个示例,并且本领域技术人员将理解:所使用的特定系统架构和计算设备可以不同,并且对于它们提供的功能而言是次要的,如本文进一步描述。
参见图3,本文描述的一些方面可以在基于云的环境中实现。图3示出了基于云计算平台系统300的模拟环境(例如,开发环境)的示例。基于云计算平台系统300的模拟环境可以是经空间优化的。如图3所示,客户端计算设备340a-340n(总体上为340)可以经由因特网330进行通信以访问在云计算平台310的虚拟服务器202上执行的模拟(例如,模拟运行时248、服务器工作器249、网桥模块(未示出)等)。
模拟运行时248包含用于实现包括模拟环境的元素和组件的程序代码,如本文进一步详细描述。例如,模拟运行时248可以包括用于云计算平台310的一个或多个网桥模块的实现代码(如本文中进一步描述并且如图7中说明性地示出),而且还提供工作器管理功能(启动进程、停止进程等)。附加地或替代地,模拟运行时248还可以暴露应用程序编程接口(API),其可以用于即时和/或周期性地监控模拟环境的状态。监控API还可用于调试模拟环境的状态和行为。在说明性实施例中,模拟运行时248可以实现为JAR(Java ARchive)。
云计算平台310可以包括私有和/或公共硬件和软件资源和组件。例如,云可以被配置为私有云以供一个或多个特定客户或客户端计算设备340和/或通过私有网络使用。公共云或混合式公共-私有云可以通过开放或混合网络由其他顾客使用。可替换地,可以使用已知的云系统,例如,MICROSOFT AZURE(Microsoft Corporation of Redmond,Washington)、AMAZON EC2(Amazon.com Inc.of Seattle,Washington)、GOOGLE COMPUTEENGINE(Google Inc.of Mountain View,California)等。
模拟开发环境300可以被部署为平台即服务(PaaS)云计算服务,其可以提供用于允许用户开发、运行和管理模拟的平台。这可以允许用户或客户端在不了解分布式计算的复杂性或无需访问基础架构团队或超级计算机的情况下创建模拟。可以作为来自供应商的公共云服务而交付模拟开发环境300。在这种情况下,客户端组织可以提供可以与模拟开发环境300集成的预先存在的模型、模拟和/或数据库。或者,可以作为客户端组织的私有网络内的私有服务而交付模拟开发环境。
云计算平台310可以包括一个或多个虚拟服务器202a-202f(总体上为202),诸如图2中所示的虚拟服务器202。可选地,云计算平台310可以包括专用虚拟和/或物理计算资源,其可以被配置为提供如本文所述的模拟功能。虽然图3示出了六个虚拟服务器202(即,202a-202f),但是本领域技术人员将理解:云计算平台310可以包括任意数量的虚拟服务器202。虚拟服务器202可以经由一个或多个网络以允许每个虚拟服务器202按点对点方式直接与云计算平台310中的任何其他虚拟服务器202通信的方式互连。可选地,虚拟服务器202可以被布置成多个虚拟服务器集群。例如,可以基于由云计算平台310使用的物理计算资源的物理位置来布置虚拟服务器集群。在这样的示例中,一个集群可以是位于加利福尼亚的第一云数据中心,并且另一集群可以是位于爱尔兰的第二云数据中心(这些仅仅是说明性的位置)。在另一个示例中,可以基于对模拟的分配来布置虚拟服务器的集群。在这样的场景中,一个集群可以包含分配给第一模拟的虚拟服务器202的第一子集,而另一个集群可以是分配给第二模拟的虚拟服务器202第二子集。如果或当移动虚拟服务器202时,或者如果或当用于第一模拟和第二模拟的计算资源需求可能随时间而变化时,虚拟服务器202可以被手动或动态地重新分配给不同的集群。与虚拟服务器202连接的客户端计算设备340可能不知道虚拟服务器202属于哪个集群(如果有的话),并且还可能不知道虚拟服务器202是否可能在连接过程中将成员资格从一个集群改变为另一个集群。
云计算平台系统300还可以包括基于云的数据存储器320。基于云的数据存储器320中的存储资源可以包括存储磁盘(例如,固态驱动器(SSD)、磁性硬盘等)和其他存储设备。或者,基于云的数据存储器320可以由已知的基于云的存储供应商提供,例如AMAZON S3(Amazon.com Inc.of Seattle,Washington),GOOGLE CLOUD STORAGE(Google Inc.ofMountain View,California)等。可选地,如图3所示,基于云的数据存储器320可以与云计算平台310分开地实现或部署,。可选地,基于云的数据存储器320可以实现或部署在云计算平台310内。例如,云计算平台310和基于云的数据存储器320都可以作为供应商分配给云系统的资源的一部分而由云系统供应商提供。
基于云的数据存储器320可以包括一个或多个应用程序集322。应用程序集322可以包括可以定义模拟的实体和组件的数据,而且还包括可以定义模拟中的实体和组件中的每一个的一个或多个行为的过程。可选地,应用程序集322可以包括可以定义构成模拟的实体和组件的模式、数据结构、序列化对象等。可选地,应用程序集322可以包括可以为模拟中的元素定义一个或多个行为的计算机可读代码或指令、脚本、静态链接库、动态链接库等。云计算平台310中的虚拟服务器202可以从基于云的数据存储器320加载应用程序集。每个虚拟服务器202中的模拟运行时248可以使用应用程序集322中包括的数据和过程来导致执行分布式、持久性和经空间优化的模拟。基于云的数据存储器320还可以包括初始化数据和/或过程324,其为模拟定义开始或初始条件。例如,云计算平台310可以从基于云的数据存储器320加载初始化数据324,这可以使预定数量的实体和组件被实例化并初始化为预定的初始状态。在另一示例中,云计算平台310可以加载并且可以执行一个或多个初始化过程324,这可以使预定数量的实体和组件被实例化并初始化为预定状态。在又一示例中,可以基于由云计算平台310从基于云的数据存储器320加载的初始化数据324和初始化过程324的组合来实例化实体和组件并将其初始化为预定状态。
基于云的数据存储器320可以包括模拟的快照326。模拟快照326可以定义模拟的有效状态,并且可以包括数据和/或程序,如果云计算平台310从基于云的数据存储器320加载和/或执行该数据和/或程序,或者当云计算平台310从基于云的数据存储器320加载和/或执行该数据和/或程序时,该数据和/或程序可以将模拟返回到该有效状态。由快照326定义的有效模拟状态可以是所述模拟的已知状态或期望状态。可选地,由快照326定义的模拟状态可以是运行中模拟的先前保存的状态。快照326可以存储模拟的一些状态,这些状态可能不是某个时间处的模拟的完整表示。当云计算平台310加载此类快照时,工作器内的用户代码能够推导出有效状态。
云计算平台310的一部分可以是相关的,例如,一个或多个虚拟服务器202可以代表相同的终端用户执行模拟,或者代表附属于相同公司或组织的不同用户执行模拟。在其他示例中,某些虚拟服务器202可以是不相关的,诸如附属于不同公司或组织的用户。对于不相关的客户端,任何一个用户的虚拟服务器202或基于云的数据存储器320上的信息可以对其他用户隐藏。
在一些实例中,客户端计算设备340可以实施、合并和/或以其他方式包括计算设备101和计算设备202的一个或多个方面。客户端计算设备340可以是任何类型的计算设备,其能够经由一个或多个用户接口接收和处理输入、经由一个或多个用户接口提供输出,并且将输入、输出和/或其他信息传送到一个或多个其他计算设备并/或从一个或多个其他计算设备传送输入、输出和/或其他信息。例如,客户端计算设备340可以是台式计算机、膝上型计算机、平板计算机、智能电话等。另外,并且如下面更详细地说明的,在一些实例中,任何和/或所有客户端计算设备340可以是被配置为执行特定功能的专用计算设备。
客户端计算设备340可以包括工作器集成库342和工作器进程249的实例。客户端计算设备340可以利用工作器集成库342和工作器进程249来连接到在云计算平台310中执行的模拟。如下面进一步详细描述,客户端计算设备340可以从云计算平台310接收描述该模拟的相关部分的数据。在客户端计算设备340中执行的工作器进程249可以利用所接收的数据来在显示器或其他用户接口设备上呈现模拟的相关部分。客户端计算设备340还可以向云计算平台310传输数据和命令,这可以影响模拟的状态。可以响应于用户输入传输数据和命令。可选地,可以响应于由工作器集成库342或工作器进程249执行的计算来生成所传输的数据和命令。
有利地,并且如上面更详细所述,使用模拟开发环境的模拟开发者能够将游戏或模拟扩展到比使用单个机器可能大得多的程度。此外,模拟开发环境可以允许任意数量的用户参与者和数据源集成到模拟中。此外,模拟开发环境可以不需要模拟开发者担心模拟的不同部分之间的可扩展性或数据同步。
图3仅示出了可以使用的模拟开发环境的一个示例,并且本领域技术人员将理解,所使用的特定系统架构和计算设备可以变化,并且相对于其所提供的功能是次要的,如本文进一步描述。
图4示出了可以根据本公开的一个或多个说明性示例实施的模拟的框图的一个示例。模拟世界410可以包括实体集合(例如,实体1 420、实体2 430和实体N 430)。实体可以表示模拟世界410的基本计算单元或其他单元。尽管图4示出了包括三种实体类型的模拟世界410,但在其他示例中,模拟世界410可以包括任何数量的实体类型。另外,模拟世界410可以包括每个实体类型的任何数量的实例。例如,在城市模拟中,模拟世界410可以包括汽车实体、行人实体、交通信号实体、道路实体、建筑物实体等。在这种情况下,城市模拟可以包括每个实体的大量且不同数量的实例。在另一示例中,在视频游戏世界模拟中,模拟世界410可以包括怪物实体、玩家实体、武器实体、树实体、岩石实体等。视频游戏模拟世界可以包括怪物实体的少数实例,对于游戏中活动的每个玩家包括一个玩家实体实例,并且包括可能数百万的树和岩石实体的实例。在又一示例中,在交易模拟中,模拟世界410可以包括交易者实体、股票实体、共同基金实体、市场代理实体等。模拟交易世界可以包括少量的交易者和市场代理实体,并且还可以包括数千个股票和共同基金实体。
实体(例如,420、430和440)的状态和行为可以由实体所包括的组件(例如,421、422、423、431、432、433和441)的组合来确定。每个组件(例如,421、422、423、431、432、433和441)可以包括作为整体归属于实体(例如,420、430和440)的状态和行为的子集。例如,如图4所示,实体1 420可以包括组件A 421、组件B 422和组件C 423;实体2 430可以包括组件A431、组件D 432和组件E 433;并且实体N 440可以包括组件F 441。如本领域技术人员将理解的,任何一个实体所包括的组件的数量和类型可以是任意的,并且不限于图4中所示的示例。可选地,如果两个或更多个实体具有共同的一组属性和行为,或当两个或更多个实体具有共同的一组属性和行为时,两个或更多个实体可以包括特定组件的不同实例。例如,实体1 420可以表示视频游戏模拟中的岩石,并且实体2 430可以表示相同模拟中的怪物。两个实体(即,420和430)可以共享组件A(例如,421和431),组件A可以限定刚性主体的属性和行为,例如质量和速度。
实体(例如,420、430和440)可以包括可以在所有实体之间共同的属性。例如,实体(例如,420、430和440)可以包括标识符值,该标识符值可以用于唯一地标识模拟世界410内的每个实体实例。实体(例如,420、430和440)可以包括可以在多个组件之间共享的属性。例如,视频游戏模拟中的实体(例如,420、430和440)可以包括位置和速度值,因为此类模拟中的大多数组件可能需要访问那些值。另外,在实体内定位常用属性可以减少组件之间的联接并促进实体的组件之间的通信。
参见图5,本文描述的一些方面可以由一个或多个组件421、422、423、431、432、433和441实施、合并和/或以其他方式被包括在内。图5示出如本文所述的模拟系统(诸如空间优化的模拟系统)中的组件510的示例实施方式。组件510可以包括相关持久性属性530a-530n(统称为530)和事件550a-550z(统称为550)的集合。程序540可以作为服务器工作器249a-249n的一部分在诸如图2-图3中所示的服务器(例如,240a-240n、202a-202f和340a-340n)中的一个的服务器中执行。程序540可以是工作器类型的一部分,工作器类型的实例是模拟属于特定实体的组件(例如,实体组件)的实例。程序540可以改变实体组件的属性的值并且可以生成事件。模拟运行时248或其他软件实体可以将属性和事件生成的写入权限从组件510授予工作器560。在模拟内执行的其他组件和/或工作器可以经由命令520a-520m(统称为520)引起或触发组件510的状态的更新。可替代地,不进行授权。可以将特定实体组件的权限给予不同工作器类型的不同工作器实例。因此,与特定实体组件相关联的程序集可以根据模拟该实体组件的工作器而改变。
组件可以包括一个或多个属性530。组件510的状态可以由组件510所包含的属性530所持有的值来限定。类似地,实体的状态可以由实体所包含的所有组件的属性530所持有的值来限定。例如,属性的值可以是到其他数据(例如大资产)的指针或URL。组件510的状态可以存储在本地存储器(例如,242a-242n、244a-244n、218)中,以便在执行模拟期间进行访问。可选地,组件510的状态可以作为快照326的一部分存储在基于云的数据存储器320中,并且因此可以跨模拟运行持续。可以周期性地(例如,连续地)存储组件510的状态。组件510的状态持续的速率可以基于一个或多个因素而变化。例如,如果组件510的状态快速变化或当组件510的状态快速改变时,存储速率也可以与改变的速率相称地增加。在另一个示例中,对于可能需要比其他属性更高精度的属性,存储速率可以更高。
在描述实体或组件可以表现出某种行为的情况下,应该理解的是,诸如工作器模块的另一个元件例如可以代表该实体或组件执行所需的计算并且发出或接收相应的信号或数据。
事件550可以指示组件510上发生瞬态动作。组件510可以响应于做出确定(或者可以针对一个或多个组件510发出事件550)、达到特定的结果、接收用户输入或其他类型的触发而发出一个或多个事件550。模拟中的其他组件可以监视事件550的发生并且响应于事件550更新这些组件的状态或执行动作。其他组件可以由作为发出组件的相同实体(例如,工作器模块)所包含或者可以由模拟中的其他实体所包含。例如,如果交通信号指示器改变为红色或当交通信号指示器改变为红色时,城市模拟中的交通信号实体可以发出事件。城市模拟中的车辆实体可以接收事件并且可以响应于该事件而停止。在另一个示例中,如果已经确定刚性主体组件已经与另一个物体碰撞,或当已经确定刚性主体组件已经与另一个物体碰撞时,刚性主体组件可以发出事件。
可选地,程序540可以用于更新属性530的值,以及使组件510发出事件550。程序540还可以从其他组件和/或模拟运行时248接收命令520并处理命令520。因此,程序540可以限定模拟内的组件510的行为。可替代地,模拟运行时248可以将组件510的行为的实施授权给工作器560。在这种情况下,模拟运行时248可以将属性530和事件550的写入访问从组件510授权给工作器560。组件510可以在任何时候使最多一个写入者被分配给组件510。工作器可以为对其具有授权的组件进行组件更新并触发事件。任何工作器都可以向属于特定实体的组件发送命令,并且该命令可以在该组件对其授权的工作器处处理。可选地,工作器560可以基于被模拟的物理实体的真实时间和/或真实世界行为来实施组件的行为。例如,工作器560可以周期性地从安装在车辆或其他移动物体上的一个或多个传感器收集位置、速度和方向数据,并使用该信息来修改属性530并发射组件510的事件550。在另一个示例中,工作器560可以接收先前记录的车辆或其他移动物体的真实世界位置、速度和方向数据,并使用该信息来修改属性530并发射组件510的事件550。因此,工作器560可以用于将真实时间和/或真实世界合并到模拟中。可以使用任何其他真实世界物体、人、事件和/或系统来生成数据作为模拟的输入。
授权可能需要指定工作器约束,该工作器约束可以标识能够模拟组件510的行为的工作器类型。工作器560可以是可以专门用于执行某些类型的计算的多个工作器类型中的一个。工作器560可以仅理解限定模拟410内的实体(例如,420、430和440)的组件(例如,421、422、423、431、432、433和441)的子集。例如,在城市模拟中,一种工作器类型可以模拟车辆位置,另一种工作器类型可以模拟交通信号,而再一种类型可以模拟环境排放。
工作器560可以包括数据结构和/或对象和软件程序,以对模拟410内的组件(例如,421、422、423、431、432、433和441)的子集的行为进行模拟。工作器560可以是与如图2和图3中所示的工作器249的一个或多个方面对应的进程。因此,工作器560可以作为服务器工作器249a-249n的一部分在服务器(诸如图2-图3中所示的服务器(例如,240a-240n、202a-202f和340a-340n)中的一个)中执行。工作器560可以读取模拟410中的任何组件(例如,421、422、423、431、432、433和441)的属性530。然而,工作器560可以仅写入已经将其写入权限授予工作器560的那些组件(例如,421、422、423、431、432、433和441)的属性530。如果运行时已经将组件的写入权限授予工作器560,或当运行时已经将组件的写入权限授予工作器560时,可以说工作器560对于组件510具有授权。工作器560可以对模拟410内的实体(例如,420、430和440)的子集的一个或多个组件具有授权。可选地,工作器560可以对可以在模拟410内彼此靠近定位的一个或多个实体具有授权。
为了模拟组件(例如,421、422、423、431、432、433和441)的行为,工作器560可能需要来自模拟410内的附近实体(例如,420、430和440)的信息(例如,属性、事件)。例如,模拟城市模拟中的交通交叉路口的工作器可能需要来自附近交叉路口中的车辆的信息,但不需要来自距离交叉路口数英里的车辆的信息。工作器560的感兴趣区域可以包括包含工作器560需要来自其的信息的附近实体(例如,420、430和440)的所有区域。工作器560的感兴趣区域可以包括工作器560对其不具有授权的实体(例如,420、430和440)。模拟410可以自动地同步工作器560和对于附近实体具有授权的其他工作器之间的数据。
工作器560可以经由网桥610与模拟410(例如,与实体)通信,如图6所示。图6示出了在如本文所述的模拟410中与网桥610通信的工作器560的示例实施方式。网桥610可以负责将来自工作器560的相关信息(例如,属性、事件)传送到模拟410内的数据库,诸如实体数据库。网桥610可以负责将来自工作器560的命令传送到模拟410内的其他感兴趣的工作器。网桥610还可以负责将来自数据库的相关信息传送到模拟410内的工作器560。网桥610还可以负责传送来自工作器560的感兴趣区域内的附近实体的相关信息。网桥610可以仅被分配给一个工作器560,并且工作器560可以仅与一个网桥610通信。也就是说,在网桥610和工作器560之间可以存在一对一的关系。在一些示例中,包括多个工作器的进程或机器可以具有多个连接,每个连接使用单独的网桥。作为服务器工作器249a-249n的一部分,网桥610可以在诸如图2-图3中所示的服务器(例如,240a-240n、202a-202f和340a-340n)中的一个的服务器中执行。
网桥610和工作器560之间的通信可以经由工作器应用程序编程接口(API)来实现。可选地,工作器560可以包括用户代码以及供代码在其内运行的可能的其他框架。用户代码可以使用工作器API 630来(诸如经由网桥)与运行时交互。工作器API可以允许可独立于模拟开发环境开发出的工作器560可能在网桥610内起作用并由网桥610管理。可选地,工作器API可以允许将预先存在的非分布式模拟程序集成到大规模分布式模拟。例如,可以将游戏引擎(例如,加利福尼亚州旧金山的统一技术SF公司(Unity Technologies SF的UNITY))集成到模拟中以模拟刚性主体物理或提供客户端侧呈现和导航。在另一示例中,多模式交通流模拟软件包(例如,开源MATSIM或其他商业可用软件包)可以集成到城市模拟中。可以替代地使用其他工作器引擎或程序或者也可以使用其他工作器引擎或程序。
在另一示例实施方式中,工作器560可能需要在云计算平台310内可能没有的专用硬件或其他物理资源。在这种情况下,工作器API 630和网桥610可以驻留在物理上远离云计算平台310定位的计算设备上,并且可以经由因特网或其他类型的网络连接到云计算平台310。可以驻留在云计算平台310外部(例如,可以在客户端设备340a-340n上执行)的此类工作器560可以被称为外部工作器。并且可以在云计算平台310内执行(例如,可以在服务器240a-240n、202a-202f上执行)的另一个工作器560可以被称为内部工作器。参考云计算平台310描述的特征中的任何一个或多个可以在该示例实施方式中使用或与该示例实施方式一起使用。
工作器API可以允许网桥向工作器的感兴趣区域(例如,从工作器的世界视图)添加实体的组件或从工作器的感兴趣区域(例如,从工作器的世界视图)移除实体的组件,向工作器通知组件状态改变,将组件授权给工作器或者移除授权,发送工作器对其具有授权的组件的组件状态改变的信号,以及如本文所述的其他相关功能。在一些示例中,实体的规范表示的组件也可以动态地添加到实体数据库或从实体数据库移除。
由工作器API提供的其他功能可以是用于添加或移除实体的功能。可选地,工作器API 630可以包括当实体进入工作器560的感兴趣区域时由网桥610调用的句柄方法。例如,方法1是可以用于将实体添加到工作器560的感兴趣区域的方法签名的一个示例。
方法1:
void OnEntityAdd(EntityId eid,EntityState initialState);其中
eid是可以唯一地标识正在添加的实体的值;并且
initialState是可以描述正被添加的实体的初始状态的数据结构和/或对象。
尽管提供方法1作为用于将实体添加到工作器560的感兴趣区域的示例,但是可以使用各种其他方法和/或功能。例如,在不脱离本公开的情况下,在该方法中可以包括其他参数。然后可以将方法1传递给RegisterEntityAddHandler()工作器API函数,这可以使得每当应该添加实体时调用方法1句柄。
可选地,工作器API 630可以包括当实体离开工作器560的感兴趣区域时由网桥610调用的句柄方法。例如,方法2是可以用于从工作器560的感兴趣区域移除实体的方法签名的一个示例。
方法2:
void OnEntityRemove(EntityId eid);其中
eid是可以唯一地标识被移除的实体的值。
尽管提供方法2作为用于从工作器560的感兴趣区域移除实体的示例,但是可使用各种其他方法和/或功能。例如,在不脱离本公开的情况下,在该方法中可以包括其他参数。然后可以将方法2传递给RegisterEntityRemoveHandler()工作器API函数,这可使得每当应该移除实体时调用方法2句柄。
工作器API还可以包括用于通知工作器在工作器的感兴趣区域内的组件的属性已经改变状态的功能。例如,工作器API 630可以包括当工作器560的感兴趣区域内的组件的属性已经改变状态时由网桥610调用的句柄方法。方法3是可以用于向工作器560通知改变状态的方法签名的一个示例。
方法3:
void OnStateChanged_Component1(EntityId eid,SomeState state);其中
eid是可以唯一地标识可以包括其属性改变状态的组件的实体的值;并且
state是可以描述组件的状态的数据结构和/或对象。
尽管提供方法3作为用于向工作器560通知改变状态的示例,但是可以使用各种其他方法和/或功能。例如,在不脱离本公开的情况下,在该方法中可以包括其他参数。在一些变型中,为了效率,state参数可以仅包括自上次更新以来已经改变的组件的属性的子集。然后可以将方法3传递给AddComponentStateChangeHandler()工作器API函数,这可以使得每当工作器的感兴趣区域内的组件的属性已经改变状态时调用方法3句柄。
在由工作器API提供的功能当中,可以有用于动态改变组件权限分配的功能。工作器API 630可以包括当工作器560现在可以对于组件具有授权时由网桥610调用的句柄方法。例如,方法4是可以用于将组件权限授权给工作器560的方法签名的一个示例。
方法4:
void OnComponentDelegate(EntityId eid,ComponentId cid);其中
eid是可以唯一地标识可以包括被授权的组件的实体的值;并且
cid是可以唯一地标识被授权的组件的值。
尽管提供方法4作为用于将组件权限授权给工作器560的示例,但是可以使用各种其他方法和/或功能。例如,在不脱离本公开的情况下,在该方法中可以包括其他参数。然后可以将方法4传递给RegisterComponentDelegateHandler()工作器API函数,这可以使得每当工作器560现在可以对组件具有授权时调用方法4句柄。
可选地,工作器API 630可以包括当工作器560可能不再对于组件具有授权时由网桥610调用的句柄方法。例如,方法5是可以用于从工作器560移除对组件的授权权限的方法签名的一个示例。
方法5:
void OnComponentUndelegate(EntityId eid,ComponentId cid);其中
eid是可以唯一地标识可以包括未经授权的组件的实体的值;并且
cid是可以唯一地标识未经授权的组件的值。
尽管提供方法5作为用于从工作器560移除组件的授权权限的示例,但是可以使用各种其他方法和/或功能。例如,在不脱离本公开的情况下,在该方法中可以包括其他参数。然后可以将方法5传递给RegisterComponentUndelegateHandler()工作器API函数,这可以使得每当工作器560可能不再对于组件具有授权时调用方法5句柄。在分布式系统中,可以在网桥发送相应消息之后的某个时间调用回调。例如,这可能意味着当工作器不再对于组件具有授权时,工作器可能会认为自己对于组件具有授权,并且反之亦然。
在其他示例中,工作器API 630可以包括:待由网桥610调用用于将工作器560设置为对于组件具有授权或取消该设置的句柄方法。例如,方法7是可以用于为工作器560设置或移除组件的授权权限的方法签名的一个示例。
方法6:
void SetIsAuthoritative(EntityId eid,ComponentId cid,BooleanisAuthoritative);其中
eid是可以唯一地标识可以包括组件的实体的值;
cid是可以唯一地标识组件的值;并且
isAuthoritative是可以指示是否将工作器560设置为对于组件具有授权或取消该设置的真/假值。
尽管提供方法6作为用于将工作器560设置为对于组件具有授权或取消该设置的示例,但是也可以使用各种其他方法和/或功能。例如,在不脱离本公开的情况下,在该方法中可以包括其他参数。
对数据库(诸如实体数据库)的改变可以由诸如工作器、一些其他外部系统或运行时系统本身(例如,负载平衡执行器,如将在下面进一步详细描述的)等任何进程进行。例如,进程可以响应于规范状态中的某个或某些其他改变而对数据库中的规范状态进行改变。作为另一个示例,实体数据库可以具有一些内部系统,这些内部系统可以可能地基于一些其他状态改变来更新规范状态。可以经由工作器API向工作器中的用户代码通知工作器对其不具有授权的组件所做的改变。工作器API 630可以包括当工作器560对其具有授权的组件的属性已经改变状态时由工作器API 630调用的方法。方法7是可以用于更新工作器560对其具有授权的组件的属性的方法签名的一个示例。
方法7:
void UpdateState_Component1(EntityId eid,SomeState state);其中
eid是可以唯一地标识可以包括其属性改变状态的组件的实体的值;并且
state是可以描述组件的更新状态的数据结构和/或对象。
尽管提供方法7作为用于更新工作器560对其具有授权的组件的属性的示例,但是可以使用各种其他方法和/或功能。例如,在不脱离本公开的情况下,在该方法中可以包括其他参数。每当工作器560对其具有授权的组件的属性已经改变状态时,可以调用方法7。
可选地,工作器560可以被配置为周期性地向网桥610发送心跳信号。如果工作器560停止传输心跳信号或当工作器560停止传输心跳信号时,网桥610可以确定工作器进程560可能已经意外终止。响应于该确定,诸如工作器调度器等更高级系统(如下面将进一步详细描述)可以终止网桥610并且请求分配并实例化替换工作器进程560(和新的对应网桥610)。
经由分层聚合器和连接迁移对数据订阅进行动态负载平衡的示例
在诸如计算机游戏的模拟中,模拟可以具有一些形式的状态,这些状态的一部分对于模拟中的参与者(例如,游戏的玩家)是可用的。状态可以不断改变,并且可以向一个或多个参与者显示变化。可以存在许多参与者、状态和频繁的状态改变。例如,在在线游戏中,可能存在许多玩家,多个游戏状态和/或频繁的状态改变。这些改变可以由玩家自己和/或内部系统引起,诸如由控制非玩家角色(例如,怪物实体、树实体等)的行为的人工智能(AI)系统引起。
图9示出了根据本文描述的一个或多个说明性方面的游戏模拟900的示例。游戏模拟900可以包括多个玩家902A、902B、902C、902D和/或其他玩家。如前所述,每个玩家可以由例如游戏模拟900中的玩家实体来表示。游戏模拟900可以包括分布式网关904,分布式网关904可以将玩家连接到分布式游戏服务器906。分布式网关904可以充当客户端(例如,玩家)的一组连接端点。这些端点可以分布在许多机器中,这可以实现可扩展数量的此类端点。分布式网关可以充当例如工作器和运行时内的其余服务之间的分布式代理。分布式网关还可以充当查询负载平衡层,如下面将进一步详细描述。
游戏模拟900可以包括分布式游戏服务器906。分布式游戏服务器906可以被配置为向玩家902A-902D和其他玩家、非玩家实体(例如,怪物实体、武器实体、树实体等)和游戏世界的其他部分提供模拟功能。如前所述,游戏服务器906可以包括一个或多个物理服务器、一个或多个虚拟服务器或其组合。游戏服务器906可以包括分布式游戏状态908,该分布式游戏状态908可以表示实体(诸如玩家和非玩家实体和/或实体的组件)的状态。游戏服务器906还可以包括游戏系统910,诸如用于非玩家实体的AI、用于玩家和其他实体的刚性主体物理、以及其他游戏系统。可以使用有效且可扩展的数据分布机制来容纳大量玩家、很多游戏状态和/或游戏状态的频繁改变。具有许多参与者、状态和/或状态变化的其他类型的模拟(例如,流行病的模拟、城市模拟、交易模拟等)可以类似地受益于有效且可扩展的数据分布机制。
模拟状态和/或状态改变可以经由数据源可供客户端可用,该数据源可以在单个机器或多个机器上可用。数据源存储的数据和/或供客户端可用的数据可以称为数据域。模拟可以包括多段数据,并且数据可以是不同的数据类型,诸如标量、空间、原型或其他数据类型。标量数据可以包括标量值,诸如单值、双值或其他标量类型。空间数据可以包括描述空间中的点的矢量。例如,空间的x、y和z分量可以分别由s1、s2和s3给出。原型数据可以包括包含字段的协议缓冲器(protobuf),字段中的每一个可以是一段数据。原型数据可以包含其他原型数据。实体可以是原型类型的一段数据。该原型的字段可以是实体的状态,并且这些状态的子字段可以是属性。实体的状态中的一个可以是模拟世界中的位置或空间定位。
查询可以指数据域中的特定子域。例如,查询可以包括匹配一些数据项的谓词。如果查询q匹配某段数据x,则我们写作q(x),如果不匹配,则我们写作可以支持各种查询类型,包括数值范围、边界框、边界球、投影、布尔组合等。数值范围可以由表达式inrange(lo,hi)表示。当且仅当该查询在给定范围内时:q(x)≡x∈[lo,hi],该查询可以匹配标量(scalariff)。lo和/或hi可以是无穷,这可以允许表达数值范围,诸如将x≤10表达为inrange(-\infty,10)。边界框可以由表达式bbox(bl,tr)表示。当且仅当该查询在左下角为bl和并且右上角为tr的边界框内时:bli≤xi≤tri,该查询可以匹配空间(spatialiff)。边界球可以由表达式distance(center,radius)表示。当且仅当该查询在具有给定中心和半径的的边界球内时:q(x)≡||x-centre||≤radius,该查询可以匹配空间(spatialiff)。投影可以由project(field,q')表示。当原型的字段匹配查询q'时:q(x)≡q'(x.field),该查询可以匹配原型(protoiff)。对于布尔组合,模拟可以采用查询的任意布尔组合,例如q1∧q2、q1∨q2、真(TRUE)、假(FALSE)。示例查询是InSphere(postion:(40,85,48)、radius:20m)AND HasComponent(Inventory)。另一个示例查询是InCone(position:(10,50,23),range:100m,fov:100deg)AND Health.current_health<50。
查询语言可用于表达数据域的子域或查询,诸如数据源的数据。数据源(例如,实体数据库,如下面将进一步详细描述)可以支持查询语言以限定可以引用数据源的状态的子集的查询。例如,查询可以对应于数据源的视图,并且视图可以包括数据源的状态的子集。可以针对某些类型的查询(诸如针对涉及模拟空间的特定区域的查询)优化数据源。
可以使用类似SQL的语言来表达查询。例如,表达式:
SELECT*FROM Entity WHERE states.position WITHIN(Vector3(0,0,0),Vector3(10,10,10))
可以用于匹配其位置在边界框[(0,0,0),(10,10,10)]内的实体。
可以在不同机器上运行的多个客户端可以经由网络连接到数据源(例如,实体数据库)。数据源可以支持订阅。在连接到数据源之后,客户端可以诸如通过使用查询语言订阅一个或多个查询。查询可以包括流式查询。对于流式查询,如果更新改变了与客户端订阅的流式查询相对应的数据,则对数据源的更新可以导致更新被发送到客户端。例如,在客户端订阅流式查询之后,客户端可以从数据源连续地接收流式查询的域内的数据。如果存在对数据的更新,则客户端可以经由订阅接收数据。附加地或可替代地,客户端可以经由其订阅周期性地接收数据。客户端可以构建用于客户端订阅的一个或多个流式查询的数据源的视图。因为数据源处的数据可以诸如通过客户端本身或通过某些其他手段(例如,其他客户端,内部系统等)在任何点处更新,所以客户端可以连续地接收与其流式查询订阅相关的更新。该进程可以瞄准(例如,连续地)将客户端处的视图与对应于一个或多个流式查询的数据源处的视图同步。客户端可以关闭流式查询,以便不再将该流式查询的更新发送回客户端。客户端还可以修改流式查询,并且可以接收与修改的流式查询相对应的数据库更新。在一些情况下,发送到客户端的更新可能不是客户端使用流式查询订阅接收的更新。例如,更新可以稍后的某个时间点达成,该更新可能与可能来自不同发送者的该更新之后的一个或多个其他更新合并和/或通过该一个或多个其他更新重写(例如,部分或完全重写)。
客户端可以直接连接到数据源并订阅数据源提供的一个或多个查询。图10示出了根据本文描述的一个或多个说明性方面的多个客户端1002A(C1)、1002B(C2)和1002C(C3)以及数据源1004(DS)的示例。客户端1002A、1002B和1002C可以连接到数据源1004。客户端1002A可以订阅查询1006A(q1);客户端1002B可以订阅查询1006B(q2);客户端1002C可以订阅查询1006C(q3)。客户端还可以动态地将其订阅从一个查询改变为任何其他查询。例如,客户端1002A可以将其订阅从查询1006A(q1)改变为查询1006B(q2)。可替代地,客户端1002A可以将其订阅改变为任何其他查询,诸如与查询1006B(q2)重叠的查询、与查询1006B(q2)互斥的查询等。改变订阅可以具有客户端1002A接收与用于查询1006B(q2)的数据减去用于查询1006A(q1)的数据相匹配的初始数据的效果,因为客户端1002A可能已经具有用于查询1006A(q1)的数据。客户端1002A可以稍后接收用于查询1006B(q2)的任何后续更新。客户端还可以订阅多个查询。如果查询语言支持析取或类似功能,则订阅多个查询可以对应于订阅单个查询,这可以是那些多个查询的析取。由数据源发送给客户端的数据总量可以是发送到每个客户端的数据的总和。发送到客户端的数据量可以与匹配客户端订阅的查询的数据的大小以及发生在该数据上的更新的大小成比例。压缩技术可以用于减少发送到每个客户端的数据量和/或发送到客户端的数据总量。
在一些示例中,聚合器可以充当客户端和数据源之间的代理。客户端可以经由聚合器中的一个或多个连接到数据源,并且使用一个或多个聚合器订阅由数据源提供的一个或多个查询。发送数据可能是资源密集型任务,这可能导致系统中的瓶颈。为了减少由数据源发送给客户端的数据量,可以使用另一层机器(例如,聚合器)来聚合查询。例如,聚合器可以组合客户端的查询并订阅组合查询,该组合查询包括连接到聚合器的客户端的查询,如下面将进一步详细描述。
图11示出根据本文描述的一个或多个说明性方面的多个客户端1102A(C1)、1102B(C2)和1102C(C3)、多个聚合器1108A(A1)和1108B(A2)以及数据源1104(DS)的示例。数据源1104可以连接到聚合器1108A(A1)和1108B(A2)。客户端1102A和1102B可以连接到聚合器1108A(A1),并且客户端1102C可以连接到聚合器1108B(A2)。聚合器1108A可以订阅查询1110A(q4),查询1110A(q4)可以是查询1106A(q1)和查询1106B(q2)的聚合。例如,查询1106A(q1)和查询1106B(q2)的并集的每个元素可以包括在查询1110A(q4)中(例如,)。
图12示出了根据本文描述的一个或多个说明性方面的查询的聚合的示例。例如,查询1106A(q1)和查询1106B(q2)可以表示数据域的子域,并且查询1110A(q4)可以表示包括查询1106A(q1)和查询1106B(q2)两者的子域的子域。可以诸如通过排除客户端1102A(C1)或1102B(C2)不需要的数据,使子域(q4-q1-q2)的大小变小以减少发送和/或同步的数据量。然而,可以设置子域的大小,使得可以在数据源1104上有效地执行查询1110A(q4)。例如,可以预先限定覆盖世界的空间查询。这些空间查询可以是逻辑的(例如,不执行)。这些空间查询可能重叠,但也可以不重叠。这些查询可以比平均实际查询大,因此当接收到实际查询时,可以选择并订阅包含实际查询的较大逻辑查询。如果密度高(例如,存在大量空间局部性),则空间查询可以是有益的。作为另一个示例,较小的查询可以组合成较大的查询。例如,假设存在邻近且可能重叠的两个框查询。系统可以订阅包含两个查询的最小框,而不是单独订阅这两个查询。
返回图11,客户端1102A可以订阅查询1106A(q1);客户端1102B可以订阅查询1106B(q2);客户端1102C可以订阅查询1106C(q3)。每个客户端可以随机连接到聚合器。如下面将进一步详细描述,系统可以替代地控制每个客户端连接到哪个聚合器。客户端可以使用相同或类似的协议来连接、订阅和接收数据,如同客户端直接连接到数据源1104一样。例如,每个聚合器可以充当用于和代表其客户端的数据源,并且每个聚合器本身可以是实际数据源1104的客户端。对于视图同步,聚合器1108A和1108B可以将它们的视图与数据源1104同步,并且客户端1102A、1102B和1102C可以基于每个客户端订阅的查询将它们的视图与聚合器1108A和1108B同步。与如果客户端1102A和1102B直接连接到数据源1104相比,可以从数据源1104发送与查询1106A(q1)和查询1106B(q2)的交集(例如,q1∩q2)匹配的数据大约较少时间。对于图11中所示的示例和图10中所示的示例两者,客户端1102A、1102B和1102C接收的数据量可以相同或相似。然而,由在图11中所示的示例中的数据源1104发送的数据量可以由于在连接到相同聚合器(例如,聚合器1108A)的客户端之间可能发生的查询重叠而减少。
可以增加客户端查询的重叠以减少在客户端和数据源之间传输的数据量并节省带宽。例如,通过控制每个客户端连接到哪个聚合器,可以增加与聚合器连接的客户端查询的重叠。聚合器控制器可以包括可以位于单独机器上的软件模块,该聚合器控制器可以用于修改连接。例如,聚合器控制器可以知道聚合器的数量,并且聚合器控制器可以在逻辑上将数据域分成与聚合器的数量相同的多个子域。因此,可以创建从子域(其可以表示为查询)到聚合器的映射。聚合器控制器可以根据传入的客户端查询动态地对数据域进行分区,而不是将数据域预分割成固定数量的子域(例如,具有相同大小),以便大致相同数量的客户端连接到每个子域。
图13A至图13B示出了根据本文描述的一个或多个说明性方面的包括聚合器控制器1312的示例系统。参考图13A所示,在连接到聚合器之前,客户端1302(C1)可以向聚合器控制器1312发送1314请求以确定客户端1302要连接到哪个聚合器(例如,聚合器1308A或聚合器1308B)。该请求可以指示客户端1302希望订阅哪个或哪些查询。基于该请求,聚合器控制器1312可以确定用于客户端1302的聚合器及其期望的查询。例如,聚合器控制器1312可以告知客户端连接到与子域查询对应的聚合器,客户端查询与该子域查询具有最大重叠。聚合器控制器1312可以考虑过去的客户端到聚合器的分配。例如,聚合器控制器1312可以根据传入的客户端查询动态地对数据域进行分区,使得大致相同数量的客户端连接到每个聚合器,如前所述。或者,聚合器控制器1312可以返回用于客户端连接的随机聚合器。其他客户端(未示出)可以类似地请求聚合器控制器1312分配聚合器,并且聚合器控制器1312可以确定适当的聚合器。
例如,假设聚合器控制器1312确定客户端1302要连接到聚合器1308A。在聚合器控制器1312确定用于客户端1302的聚合器之后,聚合器控制器1312可以向客户端1302和/或聚合器1308A发送指示客户端1302要连接到聚合器1308A的响应。基于该响应,客户端1302可以连接到聚合器1308A,如图13B中所示。客户端1302可以订阅来自聚合器1308A的查询1306。数据源1304可以连接到聚合器1308A(A1)和1308B(A2)。聚合器1308A可以订阅查询1310A,并且聚合器1308B可以订阅查询1310B。通过使用聚合器控制器1312来确定客户端和聚合器之间的连接,可以产生改进的查询重叠,并且可以从数据源1304发送更少的流量。但是,客户端可能会更改其查询。当客户端改变其查询时,如果未更新客户端和聚合器之间的分配,则查询重叠可能会随着时间的推移而减少。
在一些示例中,客户端可以动态地重新连接到不同的聚合器。图14A至图14B示出了根据本文描述的一个或多个说明性方面的包括聚合器控制器1412的示例系统。聚合器控制器1412(AC)可以确定每个客户端要连接到哪个聚合器。参考图14A,客户端1402A(C1)和客户端1402B(C2)可以连接到聚合器1408A(A1)。客户端1402C(C3)可以连接到聚合器1408B(A2)。例如,聚合器控制器1412可以引导向客户端1402B连接到聚合器1408A并且引导客户端1402C连接到聚合器1408B。
聚合器控制器1412可以连接到聚合器1408A、聚合器1408B或其他聚合器(未示出)并与之通信,从而例如:i)确定其客户端的良好分区;以及ii)告知客户端(例如,间接地)要连接或切换到哪个聚合器。聚合器控制器1412还可以连接到数据源1404,这取决于聚合器控制器1412是否可以从数据源1404获得信息以执行其分区策略。
聚合器控制器1412可以在聚合器之间动态地重新分配客户端,以便减少由数据源1404发送的流量。例如,查询可以主要是空间的。当查询以某种方式限制数据域的模拟空间时,查询可以是空间的。例如,如果查询包含InSphere(<center>,<radius>),则可能会将数据域限制为模拟空间的子集。如果查询主要是空间的,则可能的重新分布算法可以:(i)在可用聚合器之间分布空间,以及(ii)动态地告知每个客户端连接到与客户端的一个或多个查询的中心点相对应的聚合器。例如,客户端可以连接到与子域查询相对应的聚合器,客户端查询与该子域查询具有最大重叠。因为客户端可以动态地改变其查询,所以可以动态地告知客户端重新连接到不同的聚合器。
作为另一示例,聚合器控制器可以根据信息的类型在聚合器之间逻辑地对数据域进行分区。例如,如果客户端(例如,工作器)仅连接并且仅对任何实体的组件X感兴趣,则无论该实体在模拟空间中的何处,聚合器控制器都可以告知客户端连接到负责组件X的聚合器。这样,例如,如果100个这样的客户端连接到该聚合器,则聚合器可能仅从其数据源接收针对组件X的更新的单个流。
图15示出了根据本文描述的一个或多个说明性方面的客户端连接迁移的示例方法1500。假设在模拟运行时(例如,空间模拟运行时248或另一模拟运行时)期间,客户端、聚合器和数据源之间的连接如图14A所示。例如,客户端1402B可以连接到聚合器1408A。聚合器控制器1412可以从聚合器1408A或1408B,客户端1402A、1402B或1402C,和/或数据源1404接收数据。回到图15,在步骤1502中,聚合器控制器1412可以确定是否将客户端迁移到不同的聚合器。例如,客户端1402B的查询可以在模拟期间连续地改变。随着客户端1402B的查询改变,客户端1402B的查询与连接到相同聚合器(例如,聚合器1408A)的其他客户端的查询之间的重叠的量可能减少。另一方面,客户端1402B的查询与连接到不同聚合器(例如,聚合器1408B)的其他客户端的查询之间的重叠的量可能增加。在某一点,聚合器控制器1412可以基于客户端1402B的查询与连接到聚合器1408B的另一客户端(例如,客户端1402C)的查询之间的重叠量的增加和/或基于客户端1402B的查询和客户端1402A的查询之间的重叠量的减少来确定将客户端1402B迁移到不同的聚合器1408B。如果聚合器控制器1412确定不将客户端连接迁移到不同的聚合器(步骤1502:否),则聚合器控制器1412可以继续运行一个或多个分区算法以确定是否迁移客户端连接。如果聚合器控制器1412确定将客户端连接迁移到不同的聚合器(步骤1502:是),则该方法可以进行到步骤1504。例如,聚合器控制器1412可以确定将客户端1402B从聚合器1408A迁移到聚合器1408B。
在步骤1504中,聚合器控制器1412可以向聚合器1408A发送将与聚合器1408A连接的客户端1402B迁移到不同的聚合器1408B的请求。在步骤1506中,聚合器1408A可以向客户端1402B发送客户端1402B将很快连接到聚合器1408B的指示。该指示可以指示聚合器1408B和/或指示迁移的时间。
在步骤1508中,客户端1402B可以开始临时存储(例如,缓冲)要发送的数据。在客户端1402B接收到迁移消息之后(例如,在步骤1506中),客户端1402B可以停止向聚合器1408A发送更新,而是可以开始缓冲更新。在一些示例中,客户端1402B可以立即停止向聚合器1408A发送更新,例如,以往返时间(RTT)的顺序。客户端1402B还可以告知聚合器1408A:客户端1402B已经开始缓冲更新。客户端1402B可以针对过渡时段进入不同的操作模式,其中更新被缓冲而不是被发送。客户端1402B缓冲的数据可以包括客户端1402B正连续发送的数据(例如,对数据存储区1404的更新)。
在步骤1510中,聚合器1408A可以确定客户端1402B的数据的临时存储是否已经完成。例如,客户端1402B可以在客户端1402B完成其缓冲进程时通知聚合器1408A。聚合器1408A还可以停止向客户端1402B发送数据,例如与查询相关联的数据。如果客户端1402B处的临时存储未完成(步骤1510:否),则聚合器1408A可以等待直到临时存储完成。如果客户端1402B处的临时存储完成(步骤1510:是),则该方法可以进行到步骤1512。
在步骤1512中,聚合器1408A(例如,源聚合器)可以向聚合器1408B(例如,目标聚合器)发送指示聚合器1408A发送到客户端1402B或以其他方式了解订阅的数据的当前(例如,最新)版本或视图的信息。例如,聚合器1408A可以向聚合器1408B发送关于与客户端1402B的连接状态的信息(例如,关于查询视图的哪些部分已被同步的信息)。通过发送该信息,可以减少重新发送一些信息(例如,客户端1402B已经具有的信息)的需要,从而节省网络带宽以用于其他用途。聚合器1408A可以直接与聚合器1408B通信该信息,或者可以例如经由聚合器控制器1412间接地与聚合器1408B通信。聚合器1408A还可以向客户端1402B发送客户端1402B要连接到新聚合器1408B的请求。
在步骤1514中,客户端1402B可以与聚合器1408A断开连接并连接到新聚合器1408B。简要参考图14B,客户端1402B可以从聚合器1408A断开并连接到聚合器1408B。回到图15,在步骤1516中,客户端1402B可以向聚合器1408B订阅查询。因为客户端1402B的查询可能连续地改变,所以客户端1402B可以订阅与它向聚合器1408A最新订阅的查询相同的查询。或者,客户端1402B可以订阅与客户端1402B之前向聚合器1408A订阅的查询不同的查询。例如,所需的查询在迁移过程中可能已更改。该方法可以返回到步骤1502以确定是否存在另一个客户端要迁移到不同的聚合器。
如先前所解释的,聚合器1408B可以接收(例如,在步骤1512中)指示客户端1402B具有的数据的当前版本的信息,例如其视图。聚合器1408B可能不需要将相同的数据重新发送到现在与聚合器1408B连接的客户端1402B,导致更少的数据被传输以及更有效地使用可用的网络带宽。通过执行图15中所示的一个或多个步骤,系统可以动态地调整客户端分区以减少从数据源1404流出的流量。因为该方法可以是动态的,所以该方法可以:(i)处理客户端改变其查询的情况并且(ii)对向系统中动态添加或从系统中移除聚合器的情况很有效。在该系统中,客户端也可能不需要在第一次连接时询问要连接哪个聚合器,因为客户端可以根据其订阅的查询被告知重新连接(例如,立即重新连接)。
图16示出了根据本文描述的一个或多个说明性方面的多个客户端、多个聚合器和数据源的示例。例如,该系统可以包括三个聚合器1608A(A1)、1608B(A2)和1608C(A3)。每个聚合器可以具有例如连接到聚合器的三个客户端1602。该系统可以包括数据源1604,用于发送三个查询的更新。虽然图16中未示出聚合器控制器,为了控制连接迁移可以包括聚合器控制器。如前所述,聚合器控制器可以连接到聚合器1608A-C中的一个或多个(例如,全部)。聚合器控制器还可以连接到数据源1604。在一些场景中,例如,如果数据源1604过载,则可以组合聚合器。数据源可以在机器(例如,虚拟机)上运行,并且执行许多操作,诸如接收数据和/或对数据进行反序列化、编索引、对数据应用查询、对数据进行序列化和发送、或者使用处理资源(例如,CPU)的其他操作。当数据源执行操作时,CPU使用率可能达到或超过某个阈值CPU使用率,并且数据源可能被视为过载。聚合器控制器可以尝试组合两个或更多个聚合器,例如聚合器1608A和1608B,以在这些场景中减少数据源1604上的负载。
图17示出了根据本文描述的一个或多个说明性方面的组合聚合器的示例。聚合器控制器(未示出)可以组合图16中所示的聚合器1608A和聚合器1608B以生成图17所示的聚合器1708A。例如,聚合器控制器可以移除聚合器1608B并指令先前与聚合器1608B连接的客户端C4-6连接到聚合器1608A。在该示例中,图17中所示的聚合器1708A可以是图16中所示的聚合器1608A。替代地,聚合器控制器可以移除聚合器1608A并指令客户端C1-3连接到聚合器1608B。聚合器控制器可以移除聚合器1608A和1608B两者,并实例化新的聚合器1708A。聚合器控制器可以指令客户端C1-6连接到聚合器1708A。
聚合器控制器还可以基于新连接调整查询。例如,图16中所示的查询q1和q2可以组合以形成图17中所示的查询q4。查询q1和查询q2的并集的每个元素可以包括在查询q4中(例如,)。组合这两个查询可以减少数据源1604上的负载,因为数据源1604可以向聚合器1708A少发送一次与q1∩q2匹配的数据。
在某些场景下,组合聚合器可能会导致聚合器过载。例如,聚合器控制器可以知道组合聚合器1608A和1608B将导致组合式聚合器1708A过载。聚合器控制器可以跟踪(例如,借助于聚合器)有多少数据通过与所涉及的不同查询匹配的不同连接,例如聚合器和数据源之间的连接和/或聚合器和客户之间的连接。如下面将进一步详细描述,可以存在多层的聚合器(例如,两层、三层、十层等)。聚合器控制器还可以跟踪通过在可以在不同的层中的聚合器之间的不同连接的数据的量。基于通过一个或多个连接的数据的量,聚合器控制器可以确定目标配置(例如,聚合器的数量和聚合器的连接)。例如,聚合器控制器可以尝试针对一个或多个连接保持通过该连接的数据量低于阈值数据量。如下面将进一步详细描述,聚合器控制器还可以尝试保持通过多个连接(例如,用于配置的连接或用于配置的一部分的连接)的数据总量低于阈值数据量。在一些示例中,聚合器控制器可以在组合之后(例如,紧接在组合之后)接收组合式聚合器1708A过载的指示。例如,聚合器1708A现在可以向客户端C1-6发送与之前聚合器1608A和1608B两者总体相同的数据量。系统可以引入另一级别的聚合器以减轻过载聚合器的负载。
图18示出了根据本文描述的一个或多个说明性方面的添加聚合器级别的示例。聚合器控制器(未示出)可以添加聚合器级别,例如通过引入聚合器1808A。数据源1604的负载可以与图17中所示的示例中的相同。例如,数据源1604可以向聚合器1808A发送流式查询q4,并且向聚合器1608C发送流式查询q3,类似于图17中所示的发送到聚合器1708A的流式查询q4和发送到聚合器1608C的流式查询q3。此外,聚合器1608A和1608B上的负载可以与图16中所示的示例相同。例如,数据源1808A可以向聚合器1608A发送流式查询q1,并且向聚合器1608B发送流式查询q2,类似于图16中所示的发送到聚合器1608A的流式查询q1和发送到聚合器1608B的流式查询q2。
如上所述,聚合器控制器可以将聚合器的配置从图16所示的配置改变至图17中所示的配置。如果图17中所示的新配置仍然过载,聚合器控制器可以确定从图17中所示的配置改变为图18中所示的配置。替代地,聚合器控制器可以直接从图16中所示的配置变为图18中所示的配置或变为其它配置。
通常,可以根据需要引入聚合器分层中的额外层和/或通过去除过载场景来提高系统的效率。聚合器控制器可以连接到聚合器(例如,全部聚合器)和/或数据存储区。聚合器控制器可以确定:(i)聚合器的总体布局;(ii)是否添加和/或移除任何聚合器;和/或(iii)是否改变客户端或中间聚合器连接的对象。中间聚合器可以使用与上文所述的客户端相同或类似的重新连接协议。
可以使用多个聚合器控制器,例如,如果单个聚合器控制器的工作太多。多个聚合器控制器中的每一个可以处理聚合器分层的一部分。图19示出了根据本文描述的一个或多个说明性方面的生成和分配聚合器的示例方法1900。在步骤1902中,分析数据域。例如,开发者可以针对特定用例分析数据域,并且可以静态地定义聚合器的底层。可以创建多个聚合器控制器并将其分配给这些聚合器,并将其子树分配给客户端。作为另一示例,主聚合器控制器可以负责数据存储区和连接到数据存储区的紧邻聚合器。主聚合器控制器可以动态地确定是否创建更多或更少的聚合器控制器(例如,取决于主聚合器是否过载)以将对树的一部分的管理委托给其他聚合器控制器。
在步骤1904中,(例如,由开发者或主聚合器控制器)可以确定客户端订阅的查询或子域。客户端可以选择自己的查询,客户端选择的查询类型可以取决于具体的用例。例如并参考图18,系统可以确定客户端C1订阅查询qa,客户端C2订阅查询qa,并且客户端C3订阅查询qb。系统可以确定客户端C4订阅查询qc,客户端C5订阅查询qd,并且客户端C6订阅查询qe。系统可以确定客户端C7订阅查询q3,客户端C8订阅查询qf,并且客户端C9订阅查询qg。在一些示例中,可以识别查询或子域,使得任何客户端不可能一次订阅多于一个查询或子域。此过程可能取决于所涉及的数据域的特定用例。例如,在客户端是工作器且其中一些代表玩家的模拟中,客户端可以订阅小空间区域。开发者或主聚合器控制器可以将模拟空间分成少量的子空间,每个子空间表示为查询,并且将每个子空间与聚合器相关联。在这种情况下,每个客户端可能不能订阅重叠与子空间对应的多个查询的查询。
回到图19,在步骤1906中,系统可以对客户端及其对应的查询进行分组。参考图18,系统可以将客户端C1和C2分组在一起,因为它们的查询(qa)匹配或非常相似。系统还可以将客户端C3与客户端C1和C2分组,因为查询qb可以与查询qa重叠,例如,按预定量重叠。系统可以类似地基于客户端C4、C5和C6各自的查询中的重叠将它们分组在一起。系统也可以基于客户端C7、C8和C9各自的查询中的重叠将它们分组在一起。例如,查询qf的每个元素可以包括在查询q3中,并且查询qg的每个元素也可以包括在查询q3中(例如),因此系统可以将三个查询q3、qf和qg分组在一起。或者,聚合器1608C订阅的查询可以包括比客户端C7订阅的查询q3更大的数据集(例如,稍大的数据集)。
如前所述,除了分析查询重叠量之外,聚合器控制器还可以分析多少流量匹配所涉及的查询的每个子部分。查询重叠的量可以表示通过组合查询可以少发送的数据量。例如,如果两个查询重叠,但没有通过连接的数据与两个查询的结合或重叠匹配,则可能没有节省。另一方面,如果通过的所有数据或大量数据与重叠相匹配,则组合查询可以导致流量节省,即使重叠很小。如上所述,聚合器控制器可以尝试减少通过多个连接(例如,用于聚合器的特定配置的连接或用于配置的一部分的连接)的数据总量。
通常,系统(例如经由一个或多个聚合器控制器)可以考虑一个或多个不同因素来确定系统的聚合器和连接的配置。聚合器控制器可以尝试产生从发送者到数据源和/或从数据源到最终客户端的正确的更新传递。例如,聚合器控制器可以尝试避免使数据源和/或任何中间聚合器过载。聚合器控制器可以通过减少或最小化从数据源或聚合器发送到其客户端的流量来实现此目的。这又可以通过动态分析和利用正在发送的数据模式以及移动客户端的连接来完成,以便为发送的数据从客户端的查询重叠中获益。换句话说,系统可以尝试最小化正在发送的重复信息的量以便实现可扩展性。如前所述,查询重叠的量和通过每个连接传输的数据量可用于确定配置以减少重复信息的传输。估计通过组合或拆分查询来少发送或多发送的数据量以及估计系统的相应部分过载或欠载的程度可以确定是否在系统中引入或移除节点(例如,聚合器)或在系统中组合节点。聚合器控制器还可以尝试使用更少的机器(例如,尽可能少的机器)来减少成本或使其最小化。
简要参考图8,假设客户端C1订阅流式查询a(805),客户端C2订阅流式查询b(810),并且客户端C3订阅了流式查询c(815)。基于客户端C1、C2和C3的流式查询之间的重叠量,聚合器控制器可以确定组合客户端的流式查询以产生有利的聚合。例如,可以组合查询a、查询b和查询c,并且可以生成组合式查询e(825)。可以指令客户端C1、C2和C3连接到相同的聚合器,并且聚合器可以订阅组合式查询e(825)。
聚合器控制器可以评估与构成组合式查询的子查询相对应的流量,例如在某时刻或在某时间段内。聚合器控制器可以确定与组合式流式查询的重叠部分的传输数据量。例如,聚合器控制器可以确定与查询a和查询b的重叠相对应的传输流量、与查询a和查询c的重叠相对应的传输流量、与查询b和查询c的重叠相对应的传输流量和/或与查询a、查询b和查询c的重叠相对应的传输流量。
附加地或替代地,聚合器控制器可以确定与组合式流式查询的非重叠部分相对应的传输数据量。例如,聚合器控制器可以确定与查询a(而不是查询b或查询c)相对应的传输数据量、与查询b相对应的传输数据量(而不是查询a或查询c)和/或与查询c相对应的传输数据量(而不是查询a或查询b)。假设基于传输数据量的确定,聚合器控制器确定:实际上,当客户端C1和C2之间的客户端C3的流式查询的重叠是有利的时,与查询c与查询a和查询b的重叠部分相对应的数据吞吐量具有最小重叠。例如,对查询的更新的分布可能不是均匀地分布在所有查询上。聚合器控制器可以确定从该组移除客户端C3,并且与客户端C1和C2连接的聚合器可以订阅不同的流式查询,例如查询d(820)。对于客户端C3,聚合器控制器可以计算针对其他潜在组的启发法(heuristics),并且可以将客户端C3分配给其认为有利的不同组,或者可以将客户端C3分配给其本身的聚合器。
如前所述,查询重叠量和/或传输数据量可用于确定聚合器和连接的适当配置。可以使用一个或多个其他因素来确定配置。例如,聚合器控制器可以考虑聚合器上的资源使用率。如果聚合器过载或运行接近容量(例如,内存和/或CPU使用率),则聚合器控制器可能不会向聚合器添加进一步的查询或客户端。聚合器控制器还可以考虑对从客户端到聚合器、聚合器到聚合器或聚合器到数据源的某些连接的约束。例如,聚合器控制器可以考虑连接是否具有最大阈值带宽,并且聚合器控制器可以不添加将导致传输的数据量超过阈值带宽的另一个查询。聚合器控制器还可以考虑所服务的客户端的地理分布。例如,如果聚合器正在服务多个客户端,则出于一致延迟的目的,可能有利的是将来自相同地理区域的客户端分配给相同的聚合器或聚合器组。
回到图19,在步骤1908中,系统可以生成一个或多个聚合器以处理客户端的查询或子域。聚合器可以基于客户端的分组生成。例如,可以为每组客户端生成一个聚合器。系统可以将每组客户端分配给其对应的聚合器。参考图18,系统可以将客户端C1、C2和C3的组分配给聚合器1608A。系统可以将客户端C4、C5和C6的组分配给聚合器1608B。系统可以将客户端C7、C8和C9的组分配给聚合器1608C。因为查询qf和qg中的每一个的元素包括在查询q3中,所以聚合器1608C可以订阅来自数据源1604的查询q3。
系统还可以生成一个或多个其他聚合器,其可以位于不同的层。例如,系统可以在数据源1604上一层处生成图18中所示的聚合器1808A。如先前参考图17和图18所解释,可以生成额外的聚合器层以防止聚合器过载。每个聚合器可以对一个或多个子域或查询负责。
回到图19,在步骤1910中,系统可以将一个或多个聚合器控制器分配给聚合器的分层的一部分。例如,可以将一个聚合器控制器分配给图18中所示的全部聚合器1608A、1608B、1608C和1808A(及它们的相应客户端和/或查询)。替代地,多个聚合器控制器可以用于分层。例如,一个聚合器控制器可以负责聚合器1608A、1608B和1608C,并且另一个聚合器控制器可以负责聚合器1808A。作为另一示例,一个聚合器控制器可以负责聚合器1608A、1608B,并且另一个聚合器控制器可以负责聚合器1608C和1808A。如前所述,可以静态地完成确定将树的哪些部分分配给哪些聚合器控制器。例如,开发人员可以配置系统,例如仅针对靠近数据源的一些聚合器(及其子树)。替代地,聚合器控制器(例如,主聚合器控制器)可以根据主聚合器控制器本身的繁忙程度来创建更多聚合器控制器。例如,主聚合器控制器可以创建子聚合器控制器并使子聚合器控制器负责主聚合器控制器自己的子树的最繁忙的子树。最繁忙的子树可以基于通过它的流量(以及可能连接到它的客户端的数量)来确定。在对客户端进行分组并分配了聚合器和聚合器控制器之后,系统可以继续监视数据以确定是否要迁移客户端、生成额外的聚合器、移除聚合器等,以减少系统的每个组件的负载,如上文所述。例如,该方法可以进行到图15中所示的步骤1502以确定是否将客户端连接迁移到不同的聚合器。
如前所述,查询聚合可以包括展宽(widening)一组查询。例如,给定一组查询Q={q1,q2,…},可以确定展宽ΔQ(例如,也写为Δi qi)。展宽一组查询本身可能是满足以下条件的查询:
换句话说,对于每条数据x,如果存在匹配x的Q中的某些查询,则ΔQ也匹配x。例如,ΔQ可能会过度近似(overapproximate)集合Q。结果可能是:
例如,如果某些数据x不匹配ΔQ,则q∈Q也不匹配x。展宽可以匹配比原始查询集更多的数据项。具体地,对于任何查询集,TRUE可以是有效的展宽。
例如,假设存在查询Q={inrange(0,10),inrange(15,20)}。Q的一些可能的展宽可以是:
ΔQ=inrange(0,10)∨inrange(15,20)
ΔQ=inrange(0,20)
ΔQ=inrange(0,∞)
ΔQ=TRUE
还可以定义用于查询和数据索引的展宽。对于查询索引,可以是索引中的查询集的展宽,并且对于数据索引D是:
如上所述,ΔD可能过度近似D。如果某些数据项x不匹配ΔD,则类似地,ΔD可以根据需要精确。例如,ΔD可能准确匹配D中的项目;ΔD可以匹配一切;或者ΔD可能介于两者之间任何项目。
例如,假设存在数据索引D={0,4,10}。D的一些可能的展宽可以是:
(ΔD)(x)≡x=0∨x=4∨x=10
ΔD=inrange(0,10)
ΔD=TRUE
实体缓存可以包含世界中的某些实体子集。缓存可以具有直接写入缓存中的数据的本地进程。缓存可以连接在一起形成网络。成对的缓存可以共享某些实体子集。写入可以发生在网络中的任何缓存中。缓存可以交换消息以便在它们之间同步数据。例如,缓存C1可以向另一个缓存C2发送消息,指令缓存C2更新其世界状态的视图。这些消息可以包括命令。作为另一示例,本地进程可以将具有ID 1337的实体添加到缓存C1。缓存C1可以发送AddEntity(id=1337)消息至C2,指令缓存C2将实体添加到其世界视图中。
缓存还可以发出描述缓存中发生的变更(mutation)的事件。例如,本地进程可以在缓存C1中将实体1337的位置从(0,0,0)更新为(0,0,1)。缓存C1可能会发出事件,例如:
StateUpdated(id:1337,old_state:{position:(0,0,0)},new_state:{position:(0,0,1)},update:{entity_id:1337,position:(0,0,0)}
缓存发出的事件可以包括缓存的事件流。
缓存的网络可以同步。图20示出了根据本文描述的一个或多个说明性方面的数据缓存的网络。缓存可以连接在一起形成网络。如上所讨论,每个聚合器可以被视为缓存,并且聚合器可以充当其直接客户端的数据源。连接的缓存可以作为对等体连接或以客户端/服务器关系连接。在图20中,诸如C1、C2和C3的对等体之间的连接可以由双线链路指示,并且客户端和服务器之间的连接可以由单线链路指示。例如, 和可以是C1的客户端;和可以是C2的客户端;和可以是C3的客户端。对等体可以星形拓扑连接在一起(例如,每个对等体直接连接到每个其他对等体)。另一方面,服务器/客户端链路可以形成树。其他分组是可能的。例如,树的特定级别的所有缓存可以形成一组对等体。如果缓存是C2的客户端,则C2可以将与网络的其余部分同步。如果C1和C2是对等体,则C1可以将C2与在C1处本地发起的事件同步。
可以使用递归查询。对于使其客户端与系统中的其他缓存同步的缓存Ci,缓存Ci可以向其对等体订阅足够大的查询,使得在系统中其他地方发生的每个事件可以被路由到Ci并由此路由到其感兴趣的客户端。对于具有客户端的缓存Ci,缓存的查询可以通过以下方式给出:
服务器Ci可以在其每个客户端上订阅TRUE查询,使得源自客户端的事件(例如,在Ci处生根的树中)前往Ci。服务器Ci还可以在其树中构建数据并集的最新版本。
可以实现同步的缓存。缓存可以包含一些实体的集合,并且缓存可以知道一些其他缓存的集合。这些缓存中的每一个可以订阅特定查询。本地进程可以搜索缓存中的实体的数据,并且可以变更缓存中的实体的数据。这可以通过针对每个连接的缓存使用数据索引来存储实体并通过使用查询索引来存储查询而有效地实现。如果客户端缓存更新其查询,则服务器缓存可以重新计算其展宽的查询,并且(如果已更改),则在其对等体之间更新其本身的查询。例如,客户端的更新的查询可以包含不在先前展宽的查询中的数据。当客户端或对等体将其查询从q更新到q'时,系统可确定是否存在要添加或移除的新实体。为了找到要添加的实体,可以针对数据索引执行查询为了找到要移除的实体,可以执行查询
缓存或本地进程可以订阅缓存的事件流(例如,流式查询)。如前所述,订阅者可以订阅对被订阅者的查询。可以将查询与每个发出的事件进行匹配,并且可以将匹配事件转换为被订阅者可以发送给订阅者的命令。命令可以描述订阅者要应用的改变以反映事件描述的状态。例如,缓存C1可能想知道在缓存C2处发生在边界框[(0,0,0),(10,10,10)]中的爬虫(spider)上的位置更新。缓存C1可以订阅以下查询:
SELECT update.position FROM SyncEvent WHERE new_state.position WITHIN((0,0,0),(10,10,10))AND new_state.is_spider=TRUE
作为另一个示例,在连接有电缆期间每当接通灯开关时,或者当电缆连接到接通的开关时,本地进程可以要求将消息发送给它。它可以订阅查询:
SELECT update FROM SyncEvent WHERE NOT(old_state.switch=TRUE ANDold_state.cable=TRUE)AND(new_state.switch=TRUE AND new_state.cable=TRUE)
作为又一示例,缓存C1可要求从与(0,0,0)距离1km和5km之间的实体接收大约10%的位置更新。它可以订阅查询:
SELECT update FROM SyncEvent WHERE INRANGE(new_state.position,(0,0,0),5000)AND NOT(INRANGE(new_state.position,(0,0,0),1000))AND RAND()<0.1)
用于基于查询的模拟的架构的示例
图7示出了根据本文描述的一个或多个说明性方面的说明性的基于查询的模拟开发环境的高级架构。该架构可以例如分成例如三层:工作器层705,网桥层715和数据库层725。每个层可以根据用于该层的机器和/或根据每个机器上的组件可扩展,如图7中的多个位置中的点所示。
工作器层705可以包括多个工作器。工作器可以包括:托管工作器,例如托管工作器730a-730c;以及非托管工作器,例如客户端工作器720a-720c。托管工作器可以由平台管理,例如针对托管工作器的使用寿命。托管工作器可以在机器(例如虚拟机)上运行。模拟运行时可以决定哪些托管工作器在哪些虚拟机上运行。模拟运行时还可以将工作器从一个虚拟机移动到另一个虚拟机,例如通过停止一个虚拟机并启动另一个虚拟机。可以在外部控制非托管工作器,例如针对非托管工作器的使用寿命。例如,非托管工作器可以包括外部工作器,应用程序的终端用户运行该外部工作器以连接到模拟世界。每个客户端机器可以包括一个客户端组件,或者可以包括多个客户端机器。托管工作器和非托管工作器可以连接到该平台。
客户端工作器720和托管工作器730可以合并和/或以其他方式包括如图5和图6所示的工作器560的一个或多个方面。客户端工作器720a可以在客户端计算设备和/或虚拟机710a内执行;客户端工作器720b可以在客户端计算设备和/或虚拟机710b内执行;以及,客户端工作器720c可以在客户端计算设备和/或虚拟机710c内执行。客户端计算设备710a-710c可以合并和/或以其他方式包括如图3所示的客户端计算设备340的一个或多个方面。托管工作器730a和730b可以在计算设备或虚拟机710f内执行;托管工作器730c可以在计算设备或虚拟机710g内执行。计算设备710f和710g可以包括服务器,例如图2至图3中所示的服务器(例如,240a-240n,202a-202f),并且还包括具有不同架构的其他系统(例如,图1的全部或一部分)。
通过工作器的连接或其他方式,工作器可以充当客户端,例如数据库的客户端。例如,工作器可以订阅零个或多个数据库订阅或查询,以便更新其本地视图或世界视图。此外,工作器可以通过其连接请求对数据库的更新。可以通过例如将组件从一个机器移动到另一个机器来改变每层中的机器(例如虚拟机)的数量和/或尺寸。例如,可以通过终结一个托管工作器并启动等效体来移动托管工作器。
网桥层715可包括多个网桥。网桥层715可用作分布式网关,例如图9中所示的分布式网关904,以供工作器与其连接。网桥层715中的网桥可用作供工作器连接的端点。网桥层715也可用作在工作器与数据库层725之间的代理。如前所述,每个工作器可具有网桥,而网桥可用作针对特定工作器的连接端点。如图7中所示,客户端工作器720a、720b和720c可以分别与网桥740a、740b和740d通讯。类似地,托管工作器730a、730b和730c可分别与网桥740c、740e和740f通讯。网桥740a-f可包含和/或以其它方式包括如图6中所示的网桥610的一个或多个方面。网桥740a-f也可相互通讯。每个网桥可为其工作器提供最新的世界视图,并允许工作器修改世界内的特定实体。
每个网桥可保持例如世界的两个视图:当实体存在于数据库层725中时其工作器有兴趣要看到的实体的视图,以及当实体被所述网桥的工作器观看到时实体的视图。所述网桥可负责使两个视图彼此一致,找出需要告知哪方视图应与世界的状态一致。工作器视图可包括工作器已被告知的相关网桥知识(例如关于其所订阅的一个或多个查询)。数据库视图可包括关于工作器视图的相关网桥知识。例如,网桥可以从数据库接收对数据库视图的更新。例如,所述网桥可接收数据库视图、存储数据库视图和/或将数据库视图与工作器视图比较。如果工作器视图不同于数据库视图,则所述网桥可向工作器发送更新,其中具有来自数据库视图的新的或更新的值。所述网桥也可更新其被工作器所观看的视图(例如工作器视图)以对应于数据库视图。
如果工作器向其网桥发送更新,则所述网桥可向数据库发送该更新以更新数据库的规范状态。例如,来自工作器的更新可绕过数据库视图和工作器视图,并直接发送到数据库。如果该更新成功应用于数据库,则数据库可将其更新后视图传回到网桥,例如当订阅的查询匹配于所发送的更新时。所述网桥可接收对数据库视图的更新,并执行一个或多个先前所述的步骤。例如,所述网桥可存储更新的数据库视图、将数据库视图与工作器视图比较、向工作器发送更新和/或更新工作器视图(当工作器视图不同于更新的数据库视图时,等等)
网桥层715可包括多个数据库客户端,例如数据库客户端750a、数据库客户端750b或其它数据库客户端。数据库客户端可包括软件组件,其使网桥连接到数据库层725中的一个、一些或所有的数据库分片。如图7中所示,网桥740a-740c可在模拟环境700中各自经由通讯通道与数据库客户端750a通讯。网桥740a、740b、740c和数据库客户端750a可在机器710d(例如虚拟机)内运行。网桥740d-740f可以在模拟环境700中各自经由通讯通道与数据库客户端750b通讯。网桥740d、740e、740f和数据库客户端750b可在机器710h(例如虚拟机)内运行。每个虚拟机710d、710h可以是网桥服务。一种部署可包含多个网桥服务,它们一起可用作面向工作器的分布式网关。网桥服务可将其所连接工作器的订阅或查询进行组合或集合,并可用作单个更高效的数据库客户端,例如以避免重复通信。
图7中所示的一些组件可同级通讯,而一些组件可作为伺服器/客户端来通讯。例如,数据库客户端750a和750b可同级通讯。网桥740a-c可以是数据库客户端750a的客户端。类似地,网桥740d-f可以是数据库客户端750b的客户端。工作器可以是网桥的客户端。例如,客户端工作器720a可以是网桥740a的客户端,客户端工作器720b可以是网桥740b的客户端,托管工作器730a可以是网桥740c的客户端,等等。
改变每层中的机器(例如虚拟机)的数量和/或尺寸可例如通过将各组件从一个机器移动到另一机器而实现。例如,可通过网桥迁移而修改网桥。在模拟过程中,运行时可执行网桥迁移。例如,运行时可告知工作器动态连接到不同的网桥,该不同的网桥可在不同的网桥服务上。随着模拟700继续,网桥740a可被指派从机器710d迁移到机器710h。在这样的情形中,新的网桥实例(未示出)可在机器710h中实例化,并且当实现网桥迁移时,客户端工作器720a可临时连接到网桥740a和新网桥实例。一旦迁移完成,则客户端工作器720a可与网桥740a脱离连接,并且网桥740a可终止。可替代地或另外地,网桥740a可以在机器710d中终止并在机器710h上恢复。例如,网桥可从运行时内临时存储的数据中恢复,或从数据库(例如实体数据库)中存储的数据中恢复。快照(例如快照326)可通常用于不定期地(例如每10分钟或一些其它时间间隔)获取实体数据库(例如整个实体数据库)的备份拷贝。
如前所述,运行时模拟可将工作器的网桥(其可具有重叠的订阅查询)放置到相同的网桥服务上。因此,运行时可通过减少重复而减少从数据库层725中的数据库分片到网桥服务710d、710h的通信。这可以通过将各查询集合为单个(例如更大的)查询而实现。当集合者(例如保持多个网桥的网桥服务)从匹配其查询的其数据源之一(例如通过数据库网桥的数据库分片)接收数据时,集合者可将此数据转发到其查询也匹配于所接收数据的客户端。
图8显示出根据本文所述一个或多个例示性方面的查询集合的示例。每个界定区域可代表查询。例如,界定区域805可代表查询a;界定区域810可代表查询b;界定区域815可代表查询c;界定区域820可代表查询d;而界定区域825可代表查询e。查询d可包括查询a和b的集合,其可为查询的扩展。查询e可包括查询a-d的集合,其也可被认为是查询的扩展。在一些示例中,查询可以是空间的。在其它示例中,查询可以不是空间的。在另外的其它示例中,一些查询可以是空间的,而其它查询可以不是空间的。
返回图7,工作器720a可经由网桥740a连接。假定工作器720a具有对图8中所示查询a、b的订阅。工作器720b可经由网桥740b连接。假定工作器720b具有对图8中所示查询c的订阅。网桥740a和网桥740b可位于相同的网桥服务710d上。另外,查询a-c中的一些可以重叠,并且各查询可被集合以减少在工作器与网桥之间和/或在各网桥和/或各数据分片之间的通信量。例如,网桥740a可将查询a和b集合,形成组合查询d。查询d可大于查询a和b的并集,如图8中所示。网桥740b可以不将查询集合,这是因为,工作器720b可能仅对查询c订阅。网桥服务710d经由数据库客户端750a可将查询c和d集合,形成组合查询e。查询e可大于查询c和d的并集,如图8中所示。图12显示出查询集合的另一示例。查询集合的其它示例如前所述。在一些示例中,数据库客户端(例如750a或750b)可为先前参照图11-19所述的集合者。工作器(例如客户端工作器720a-c或托管工作器730a-c)和/或其对应的网桥(例如网桥740a-f)可以是先前参照图11-19所述的客户端。数据库层725可对应于先前参照图11-19所述的数据源。
数据库层725可例如包括用于模拟的分布式内存数据库。例如,数据库可包括实体数据库,模拟的实体的一部分或全部状态可存储于实体数据库中。实体数据库可作为快照而保存(例如定期保存)到盘或另一介质以实现长期存储。实体数据库也可通过快照而恢复。实体数据库也可存储平台的内部信息。实体数据库的各种示例在美国申请No.16/042,068(2018年7月23日提交并且发明名称为“实体数据库”)中描述,其全文通过引用并入本文。
数据库层725可包括多个机器710j、710k等,其可包括虚拟机。每个虚拟机可包括在虚拟机内运行的一个或多个组件。例如,虚拟机710j可包括多个数据库分片,例如,数据库分片770a、数据库分片770b或其它数据库分片。虚拟机710k可包括数据库分片770c和/或其它数据库分片。每个数据库分片可保持与数据域的独立子集相对应的数据。这可通过以实体ID切分数据域(例如对数据库分片的数量取模)而实现。然后,每个数据库分片可用作根数据源,例如前述数据源(例如,数据源1004、1104、1304、1404或1604)。这样,虽然图7的系统包括一个集合层(例如,一层网桥),但是图7的系统还可包括一个或多个处于网桥层715与数据库层725之间的额外的集合层,如前所述。
每个虚拟机可包括数据库网桥,其可包括:在一侧上的用于数据库客户端(例如数据库客户端750a、750b、等等)的连接端点;和在另一侧上的数据库分片(例如数据库分片770a-c)。数据库的客户端可连接到一些或全部实体数据库分片,以例如对数据库进行读取或写入。例如,数据库网桥760a可将数据库客户端750a连接到数据库分片770a和/或数据库分片770b。类似地,数据库网桥760a可将数据库客户端750b连接到数据库分片770a和/或数据库分片770b。数据库网桥760b可将数据库客户端750a连接到数据库分片770c。类似地,数据库网桥760b可将数据库客户端750b连接到数据库分片770c。虽然数据库客户端750a和750b可以各自连接到数据库网桥760a和数据库网桥760b,但是数据库客户端750a和750b可能不接收来自这两个网桥的所有消息。例如,数据库客户端750a和750b可接收的消息包括由对应工作器所订阅的查询的更新。
改变每层中的虚拟机的数量和/或尺寸可通过将各组件从一个虚拟机移动到另一虚拟机而实现。例如,数据库分片的数量和/或尺寸可通过合并或切分分片(以及所述分片所对应的数据)而改变。数据库可通过例如实体ID而分片化。数据库也可支持对其状态的更新。这些更新可在相同实体的多个组件上或甚至在多个实体上分散,取决于数据库分片化策略。
可分布的和可定制化的负载平衡的示例
如前所述,模拟(例如模拟世界)可包括实体,并且这些实体可具有一个或多个组件。组件可包括可变的数据字段。本文中所述模拟平台可允许运行工作器中的代码(例如用户代码),以例如修改组件数据字段。工作器可在实体-组件上具有授权,例如有权对所述实体-组件进行写入访问。实体-组件可被分配到工作器,或者可当所述工作器在实体-组件上具有授权时由工作器模拟。授权信息可被存储为例如实体数据的一部分。另外地或可替代地,授权可为暂时的,并且授权可作为授权改变的消息发送到工作器。
图21显示出根据本文所述一个或多个例示性方面的例示性模拟环境的结构的一部分。如前所述,网桥和/或工作器可以从数据库2110(例如实体数据库)订阅查询。网桥可处理工作器可见的情况。例如,网桥2120a可连接到工作器2130a,并且网桥2120a可用作在数据库2110与工作器2130a之间的网关。类似地,网桥2120b可连接到工作器2130b,并且网桥2120b可用作在数据库2110与工作器2130b之间的网关。如前所述,每个实体可包括多个组件。其中一个组件可包括授权组件。实体的授权组件可指示出哪个工作器在其它实体组件上有授权。例如,实体1234可包括以下数据:
授权组件可对实体1234指示哪个工作器在实体1234的其它组件上有授权。例如,工作器B(例如图21中所示的工作器2130b)可在实体1234的位置组件上有授权。工作器2130b也可在实体1234的质量组件上有授权。授权组件可类似地指示在实体1234的其它组件上的授权。
网桥可从数据库2110订阅查询,所述查询可返回到对应工作器有授权的实体。例如,网桥2120b可订阅返回到工作器2130b有授权的实体的查询2150。示例查询可为:
Subscription query(SELECT*FROM entities WHERE authority=‘Worker B’)
数据库2110可返回数据,所述数据例如指示:工作器2130b在实体1234的位置组件、实体1234的质量组件和工作器2130b有授权的其它实体-组件上有授权。
工作器负载平衡可用于确定哪个工作器负责每个实体上的每个组件和/或平衡负载,使得存在适合数量的工作器正确模拟世界。特别地,工作器负载平衡可包括一系列工具和/或策略,其可有助于一个或多个以下项:(i)如何执行工作器的生存周期管控(例如,工作器的起动、停止、损毁时重新起动,等等);(ii)如何给予工作器在实体-组件上的授权以允许工作器对其模拟;(iii)如何确定哪个工作器对于哪个实体-组件将有授权;或(iv)如何确定在模拟平台的给定部署中待运行的工作器的数量和类型。
图22显示出根据本文所述一个或多个例示性方面的例示性的负载平衡策略系统。负载平衡策略2210可包括:产生策略意图2250的算法。策略意图2250可通过施行服务实现。负载平衡策略2210可从实体数据库2220查询模拟状态。负载平衡策略2210也可从配置数据源2230查询配置数据。负载平衡策略2210也可查询用于杂项数据(例如随时间变化的数据、天气数据等等)的外部服务2240。负载平衡策略2210可通过各种数据策略接收数据,并进行分区决策。作为使用部署中数据的示例,用于玩家定位的实体数据库数据可用于确定玩家的密集群被发现之处。用于各工作器之间边界的适合区域可基于例如插入式算法而确定。作为使用部署外数据的示例,分析可建议:游戏在雨天将更活跃。这样,天气数据可用于预先规定额外的工作器用于更活跃的部署。负载平衡策略2210可输出策略意图2250,其指示出哪些实体拟被分配到哪些工作器。例如,所述输出可指示一组分区和/或虚拟工作器。
策略意图施行可对于每个模拟层执行(例如物理和聊天),并且负载平衡策略可分为不同的部分,每个部分管控不同的模拟层。例如,假定模拟具有三个层:一层用于物理,一层用于模拟天气,并且一层用于聊天系统。这些层可独立于彼此而配置和负载平衡。例如,各层可不共享工作器。这可允许对每层选择不同策略。例如,物理和天气工作器可被设定为具有通过物理空间划分的世界,但聊天系统反而可以通过用户(例如玩家)ID范围划分。由于策略意图可体现出模拟世界如何负载平衡,因而其可通过开发者在模拟运行时上(动态地)配置。这可允许开发者写入其自身的负载平衡策略。
图23显示出根据本文所述一个或多个例示性方面的例示性负载平衡系统2300的高级结构。系统2300可包括数据库2315,例如实体数据库。如前所述,实体数据库可存储模拟实体的状态,并且网桥、工作器或其它元件可对数据库订阅。系统2300可包括:网桥服务或层2318,其可包括多个网桥。如前所述,网桥可用作分布式网关将工作器连接到数据库2315。系统2300可包括:工作器运行器或层2320。如前所述,工作器可包括托管工作器和未托管工作器,并可订阅由数据库2315提供的一个或多个查询。
系统2300可包括:一个或多个用于在模拟(例如大型虚拟世界模拟)中实现负载平衡的施行服务。施行服务可采取策略意图,并可将其应用于其域内的实体。如前所述,域可包括世界中实体的子组,并可通过查询(例如实体数据库查询)限定。在一些示例中,每个施行服务可作用于特定域上,所述特定域不同于其它施行服务作用的域。使用单个施行服务作用于特定域上,可防止各施行服务彼此干扰。由于模拟世界可动态地改变其尺寸和计算要求,因而域可被动态地修改。
策略意图可将预期的工作器映射到其分区。策略意图可包括具有例如两个(或更多个)场的数据:实体数据库查询(例如实体查询限制),和针对所述查询的预期工作器(例如虚拟工作器)(例如,满足所述查询的组件待被分配的工作器)。施行服务可用于使得:其域内的匹配于特定分区查询的实体被委派于对应的工作器。
意图可与用于在实体-组件上向工作器分配授权的施行或动作分离。例如,系统的一部分可负责意图(例如确定用于模拟该世界的工作器的数量和类型),而系统的另一部分可负责施行(例如使工作器起动和停止)。可使用技术托管工作器。例如,未托管工作器和托管工作器均可被分配于虚拟工作器。下表显示出用于模拟实体和用于具有工作器的意图和动作的示例。
意图可通过负载平衡决策而实现,如前所述。动作可通过负载平衡施行而实现。预期的工作器存在可被称为虚拟工作器。工作器调度服务可负责使工作器起动、停止和/或重新起动以确保虚拟工作器有对应的工作器运行。由于策略意图可对于每个分区规定预期的工作器,因而用于模拟的虚拟工作器清单可源自策略意图。
参见图23,系统2300可包括:天空装置之眼2330,其可用于运行负载平衡策略算法2332。天空装置之眼2330可与其它服务共同定位以节省所用伺服器的数量,或者可以不与其它服务共同定位。如前所述,负载平衡策略算法2332可以接收来自实体数据库2315的数据(例如模拟状态)、配置数据、外部服务(例如用于杂项数据,如随时间变化的数据),等等。负载平衡策略算法2332可输出策略意图,其指示哪些实体被分配于哪些工作器。策略意图可存储于实体数据库2315中,和/或直接提供到分区执行器。例如,负载平衡策略算法2332可向分区执行器2310发送一组分区2333。负载平衡策略算法2332也可以向虚拟工作器管控器2325发送一组虚拟工作器2334。
系统2300可包括:分区执行器2310或多个分区执行器,其可分散在多个伺服器上。这些分区执行器可与其它服务共享伺服器,以减少用于运行中模拟的虚拟机的数量。可替代地,分区执行器可驻留在其自身的伺服器中以例如隔离计算能力。模拟中的多个分区执行器的每个分区执行器可具有:域(其可以为空间)、实体ID范围或分片化分区施行的一些其它方式,使得各分区执行器彼此不干扰。分区执行器2310可从负载平衡策略算法2332接收成组的分区2333。每个分区可指示出:在模拟中规定实体-组件的子组的查询。
分区执行器2310中的分区授权逻辑可用于实现负载平衡策略(例如,如由天空装置之眼2330所确定)。另一方面,分区执行器2310中的特定的授权逻辑可当组件希望特定授权分配时使用。实体可承载自限定的读/写许可,其描述谁有资格在其组件上获得授权。这可以描述特定类型的模拟(例如“我需要由属于物理层的某物模拟”)或者特定的连接的工作器(例如“我需要由具有ID1234的工作器模拟”)。在后一种情况中,所关注组件可能未参与到负载平衡系统中,这是因为,其需要特定的授权分配(例如具有ID1234的工作器)。因此,对于此组件的分配可绕过在分区执行器2310中经历分区授权逻辑。
分区执行器2310可基于负载平衡策略算法2332的输出而向数据库2315发送授权更新(若存在)。每个分区执行器2310可订阅与该分区执行器负责的一个或多个分区对应的查询或数据域。分区执行器2310可从数据库2315接收与一个或多个域订阅对应的数据。例如,查询可为流式查询,并且分区执行器2310可在每次存在满足流式查询的实体更新时接收更新。可替代地,分区执行器2310可对其分区中实体更新而周期性地查询数据库2315。域可以限定分区执行器2310订阅的查询。实体数据库2315可使用实体更新数据完成所述订阅。实体数据库2315可发送与分区执行器2310所订阅的查询相对应的数据。订阅可作为初始配置提供,或者通过服务而动态地配置。
分区执行器可需要知晓与其域相关的分区。分区执行器可过滤掉与其域不相关的分区,使得模拟可更易于扩展。如果域查询不与分区查询重叠,则其可被过滤掉。例如,如果分区执行器的域是“具有奇数实体ID的实体”,而分区是“具有偶数实体ID的实体”,则查询可能被过滤掉。更复杂的过滤器可用于更复杂的域或分区(例如,不重叠的三维空间区域)。作为另一示例,对于基于组件和/或位置的查询以及分区执行器负责空间区域之处,施行器可以丢弃任何不适用于它们所关注的组件或者它们所关注的空间区域的分区。分区执行器可尝试确定哪些实体在其域中具有不匹配于任何分区的组件分配。对于这些具有无效分配的实体,分区施行可将预期的工作器组件设定为具有匹配分区。可使用不同的方法实现此目的。例如,分区执行器可订阅实体数据库查询,其返回处于分区执行器的域内且被错误分配的实体的计数。分区执行器当此计数非零时作出反应。作为另一示例,分区执行器可订阅其域内的所有实体,并在施行器内进行分区有效性检查。
系统2300可包括:虚拟进程管控器2325(例如虚拟工作器管控器)。类似于天空装置之眼2330,虚拟工作器管控器2325可与其它服务共同定位,以节省所用伺服器的数量,或者可以不与其它服务共同定位。虚拟工作器管控器2325可从负载平衡策略算法2332接收成组的虚拟进程(例如工作器)2334。成组的虚拟进程2334可包括存在的一系列虚拟进程,并且虚拟进程管控器2325可根据需要确定物理进程是否存在以及开始和停止进程是否存在。虚拟工作器管控器2325可管控工作器之间的虚拟到物理的映射。例如,虚拟工作器管控器2325可与工作器运行器或层2320通讯以根据需要起动和停止工作器以及创建新工作器。虚拟工作器管控器2325可起动和停止物理进程以运行虚拟工作器。虚拟工作器管控器2325也可从网桥伺服器或层2318(或一个或多个其它服务)接收关于工作器状态的信息,例如其是否连接,其是否损毁、延迟是否低、是否存在资源供其运行,等等。例如,满足虚拟工作器的物理进程在模拟过程中可能损毁,并且虚拟工作器管控器2325可起动另一物理进程以替代损毁的物理进程。虚拟工作器管控器2325也可接收指示出连接到网网桥层2318中的网桥的工作器的数量和类型的信息。分区执行器2310和虚拟工作器管控器2325可用于实现由负载平衡策略算法2332确定且基于从负载平衡策略算法2332接收的数据的策略意图。
图24显示出根据本文中所述的一个或多个例示性方面的分区和策略意图的示例。分区1可包括:在矩形2410(或其它形状)内分配到工作器A的物理组件。分区2可包括:在矩形2420(或其它形状)内分配到工作器B的物理组件。分区3 2430可包括分配到工作器C的天气组件。图24中所示用于示例性分区的策略意图2440可例如包括:
图25显示出根据本文所述一个或多个例示性方面的多个实体和实体分配的示例。此示例的策略意图可将分区R 2510内的实体(例如实体2505a-c)映射到工作器A。其它实体(例如实体2505d-f)可映射到其它工作器。
通常,模拟世界可以具有多个分区,并且每个分区可对应于实体可满足的不同度量。例如,分区可以是有界区域,例如球、圆柱、盒、矩形、或其它形状。上述的图24和25显示出不同有界区域的示例,例如矩形2410、矩形2420或圆形2510。实体可以满足分区的度量。在分区是有界区域的示例中,实体可位于第一有界区域中并因而满足第一有界区域的度量。在模拟过程中,实体可在模拟世界中运动并可在不同于第一有界区域的第二有界区域中结束。在此场景中,实体可不再满足第一有界区域的度量,但可满足第二有界区域的度量。分区可以使用其它度量。例如,如上文中对图24所述,度量可为不同类型的组件,例如物理组件、天气组件、或任何其它类型的组件。可使用不同度量的组合。再次参见图24,分区1的度量可以为矩形2410内的物理组件,分区2的度量可为矩形2420内的物理组件,并且分区3的度量可以为所有天气组件。模拟世界可分为多个不同的分区。分区可使用任意数量的不同类型的度量,并且在一时间点处满足这些度量的实体可在所述时间点处被分配到对应分区。
返回图23,系统2300可包括负载平衡器工作器2335。负载平衡器工作器可为外部的(例如在用户空间中),并可允许用户开发或添加负载平衡策略。例如,负载平衡器工作器2335在一些场景中可替代天空装置之眼2330。类似于天空装置之眼2330,负载平衡器工作器2335可确定待通过分区执行器2310和/或虚拟工作器管控器2325使用的策略意图。负载平衡器工作器2335可以存在于任意其它类型工作器可以运行之处。在一些场景中,多个负载平衡器工作器可有助于全局策略意图,并且负载平衡器工作器可从多个不同机器如此作用。使用一个或多个负载平衡器工作器2335可能是有益的,这是因为用户可具有对其专门应用情况的可形成更佳的负载平衡算法决策的额外知识。负载平衡器工作器2335能够在模拟运行时内查询或订阅模拟,知晓用户方案和/或改变某些状态。负载平衡器工作器2335可经由其网桥(未示出)从数据库2315订阅一个或多个查询。负载平衡器工作器2335可向负载平衡策略算法2332并经由其网桥发送负载平衡器实体更新。
图26显示出根据本文所述一个或多个例示性方面替换工作器的示例。开发者的计算机2640可运行外部工作器2642。如果开发者希望将现有工作器替换为运行在开发者的计算机2640上的外部工作器2642,则开发者的计算机2640可向虚拟工作器管控器2325发送虚拟工作器超控命令。基于所述命令,虚拟工作器管控器2325可将工作器2622替换为外部工作器2642。例如,虚拟工作器管控器2325可向工作器层2320发送请求以使工作器2622停止或使工作器与网桥2617脱离连接。然后,外部工作器2642可连接到先前由工作器2622使用的网桥2617并且使用该网桥。通过经历这种工作器替换过程,分配到托管工作器2622的实体组件现在可以由外部工作器2642处理。替换工作器可有助于用户试验负载平衡配置并更易于调试具有多个工作器的场景。例如,用户可观察在其模拟中的缺陷,所述缺陷可与被分配到特定托管工作器的特定的世界部分相关联。用户可将工作器连接到运行部署,并使新工作器在部署中从现有工作器接管负载,从而替换现有工作器在负载平衡器的策略中的作用。用户可将工作器连接于能够追踪先前工作器所经历问题的额外资料,或者连接于完全不同的逻辑。通过将托管工作器替换为在其自身控制下的工作器,用户可修改工作器所用的逻辑、添加额外的记录和调试和/或以其它方式调查缺陷原由。
分区组件可放置在不同类型的实体上。例如,假定模拟包括多个托管的物理工作器、一个全局的托管的拍卖行工作器和多个玩家。每个玩家实体(或每个玩家的客户端的虚拟工作器实体)可具有分区组件,该分区组件可用于使玩家在他或她的控制下得到授权。玩家实体或玩家客户端的虚拟工作器实体上的示例性分区组件如下:
在放置在整个世界的多个负载平衡实体上可存在分区组件,以在空间上分布物理工作器。在负载平衡实体上的示例性分区组件如下:
在用于单例拍卖行工作器的虚拟工作器实体上可存在分区组件。拍卖行工作器上的示例性分区组件如下:
如前所述,分区组件可放置在不同类型的实体上,取决于系统正在处理的特定负载平衡情况。对于未托管工作器(例如玩家),分区的生存时间可以对应于玩家的生存时间。此示例可假定当玩家脱离连接时玩家实体离开。然而,如果当玩家脱离连接时玩家实体不离开,则分区可以放置在与玩家客户端相关联的工作器实体上。对于空间负载平衡的工作器(例如物理),活动可依照空间区域发生,因而世界中的负载平衡实体可描述本地分区。对于单例或全局工作器而言,分区可放置在单例的虚拟工作器实体本身上。
使用分区组件可允许工作器负载平衡。这还可提供将粗粒度负载平衡意图烤制成快照的方式,其可允许模拟更妥善地处理在负载平衡过渡中所取的快照。表达负载平衡的分区组件还可允许围绕其构建工具(例如在检查者中提供分区)。负载平衡意图的分区组件还可以允许更容易地构建内部运行时特征。例如,工作器管控器可容易地确定需要起动以满足分区设定的工作器。
托管工作器的订阅政策(例如结算政策)可基于工作器意图有授权的区域,而不是工作器当前有授权的实体。这可意味着,托管工作器无需签到和结算实体的场景可以避免。例如,如果托管工作器不仅知晓其目前拥有以进行模拟的直接实体,而且还潜在地知晓描述其可能所模拟的更大查询,则托管工作器可以预加载资产或预充值现金而使得在所述查询的区域中(但不是现有实体附近)模拟实体可以更容易。
在一些场景中,两个或更多个分区可重叠。施行服务可用于决定分配对应预期工作器中的哪个。可用的冲突解决方式可以在当前分配不匹配于任何合格的预期工作器时,改变工作器分配。以此方式,可避免在不同预期工作器之间的摆动,其给予滞后并且出于性能原因而有所益处(例如,由于切换授权可能具有相关联成本)。每个分区执行器可察觉到世界中的分区,例如所有分区。
多个实体组件可属于单个分区,但是一些实体组件可属于多个分区,从而导致重叠分区。重叠分区的期望行为可被限定。例如,实体组件在不同分区之间的转移可被确定。
图27显示出根据本文所述一个或多个例示性方面的分区重叠的示例。例如,实体42可初始分配到工作器1,而实体42在位置2705处。当实体42移动到重叠分区的区域中(例如位置2710)时,实体42可能未被重新分配到工作器2,因为分区A可能仍然有效。如果实体42继续在分区A外且进入分区B有效(但分区A无效)的区域(例如位置2715)中,则实体42可被重新分配到工作器2。然而,如果在位置2710处时,实体42返回分区A有效(但分区B无效)的区域(例如位置2720),则系统可能未期望改变对工作器2的授权。
用户可配置重叠预期授权带以防止授权不足(例如空间滞后),以例如解决多分区有效的场景。如果预期行为可替代地是仅一个工作器对一个空间区域有授权,则配置可设定为没有重叠分区。
虽然实施例和方面已经关于虚拟硬件伺服器进行了描述,但是所述方法和系统也可用于其它硬件或包括本地或物理伺服器的伺服器。
虽然主题已经以结构特征和/或方法行为专用的语言进行描述,但是应理解,在所附权利要求书中限定的主题不必局限于前述的特定特征或行为。相反地,前述的特定特征和行为描述为所附权利要求书的示例性实施方案。
Claims (20)
1.一种装置,其包括:
一个或多个计算机处理器,其控制所述装置的一些操作;以及
存储器,其存储计算机可执行指令,所述计算机可执行指令在由所述一个或多个计算机处理器执行时使所述装置:
确定模拟世界的多个分区,其中所述多个分区中的每个分区对应于多个度量中的、用于所述模拟世界中的一个或多个实体或者所述模拟世界中的所述实体的组件的不同度量;
确定用于所述模拟世界的多个虚拟进程;
向所述多个分区中的每个分区分配所述多个虚拟进程中的不同虚拟进程;
向一个或多个分区执行器服务发送所述多个分区的指示以及针对所述多个分区中每个分区的分配;以及
向虚拟进程管理器发送所述多个虚拟进程的指示。
2.根据权利要求1所述的装置,其中:
所述模拟世界的所述多个分区包括第一分区和第二分区;
所述多个度量包括所述模拟世界的第一有界区域和所述模拟世界的第二有界区域;
所述模拟世界的所述第一有界区域不同于所述模拟世界的所述第二有界区域;
所述第一分区对应于所述模拟世界的所述第一有界区域中的实体;
所述第二分区对应于所述模拟世界的所述第二有界区域中的实体;以及
所述模拟世界中的实体能够在所述模拟世界的不同有界区域之间移动。
3.根据权利要求2所述的装置,其中:
所述模拟世界的所述多个分区包括第三分区;
所述多个度量包括组件类型;以及
所述第三分区对应于具有所述组件类型的实体。
4.根据权利要求1所述的装置,其中所述虚拟进程管理器被配置为基于从所述装置接收的数据来启动或停止虚拟进程层中的虚拟进程。
5.根据权利要求1所述的装置,其中所述多个虚拟进程包括多个虚拟工作器,并且其中所述存储器存储计算机可执行指令,所述计算机可执行指令在由所述一个或多个计算机处理器执行时使所述装置:
从外部计算设备接收将所述多个虚拟工作器中的第一虚拟工作器用所述外部计算设备上运行的外部虚拟工作器代替的请求;
向工作器层发送将所述第一虚拟工作器从网桥层中的网桥断开的请求;以及
将所述外部虚拟工作器连接到所述网桥层中的所述网桥以代替所述第一虚拟工作器。
6.根据权利要求1所述的装置,其中所述存储器存储计算机可执行指令,所述计算机可执行指令在由所述一个或多个计算机处理器执行时使所述装置:
从配置数据库接收表示用于所述模拟世界的配置数据的数据;以及
从外部服务数据库接收外部数据;
其中,确定所述模拟世界的所述多个分区是基于所述配置数据和所述外部数据。
7.根据权利要求1所述的装置,其中所述多个分区中的第一分区与所述多个分区中的第二分区重叠。
8.根据权利要求1所述的装置,其中所述多个分区中的第一分区与所述多个分区中的第二分区不重叠。
9.一种或多种非暂时性计算机可读介质,其存储计算机可执行指令,所述计算机可执行指令在由计算设备执行时使所述计算设备:
确定模拟世界的多个分区,其中所述多个分区中的每个分区对应于多个度量中的、用于所述模拟世界中的一个或多个实体或者所述模拟世界中的所述实体的组件的不同度量;
确定用于所述模拟世界的多个虚拟进程;
向所述多个分区中的每个分区分配所述多个虚拟进程中的不同虚拟进程;
向一个或多个分区执行器服务发送所述多个分区的指示以及针对所述多个分区中每个分区的分配;以及
向虚拟进程管理器发送所述多个虚拟进程的指示。
10.根据权利要求9所述的一种或多种非暂时性计算机可读介质,其中:
所述模拟世界的所述多个分区包括第一分区和第二分区;
所述多个度量包括所述模拟世界的第一有界区域和所述模拟世界的第二有界区域;
所述模拟世界的所述第一有界区域不同于所述模拟世界的所述第二有界区域;
所述第一分区对应于所述模拟世界的所述第一有界区域中的实体;
所述第二分区对应于所述模拟世界的所述第二有界区域中的实体;以及
所述模拟世界中的实体能够在所述模拟世界的不同有界区域之间移动。
11.根据权利要求10所述的一种或多种非暂时性计算机可读介质,其中:
所述模拟世界的所述多个分区包括第三分区;
所述多个度量包括组件类型;以及
所述第三分区对应于具有所述组件类型的实体。
12.根据权利要求9所述的一种或多种非暂时性计算机可读介质,其中所述虚拟进程管理器被配置为基于从所述计算设备接收的数据来启动或停止虚拟进程层中的虚拟进程。
13.根据权利要求9所述的一种或多种非暂时性计算机可读介质,其中所述多个虚拟进程包括多个虚拟工作器,并且其中所述一种或多种非暂时性计算机可读介质存储计算机可执行指令,所述计算机可执行指令在由所述计算设备执行时使所述计算设备:
从外部计算设备接收将所述多个虚拟工作器中的第一虚拟工作器用所述外部计算设备上运行的外部虚拟工作器代替的请求;
向工作器层发送将所述第一虚拟工作器从网桥层中的网桥断开的请求;以及
将所述外部虚拟工作器连接到所述网桥层中的所述网桥以代替所述第一虚拟工作器。
14.根据权利要求9所述的一种或多种非暂时性计算机可读介质,其存储计算机可执行指令,所述计算机可执行指令在由所述计算设备执行时使所述计算设备:
从配置数据库接收表示用于所述模拟世界的配置数据的数据;以及
从外部服务数据库接收外部数据;
其中,确定所述模拟世界的所述多个分区是基于所述配置数据和所述外部数据。
15.根据权利要求9所述的一种或多种非暂时性计算机可读介质,其中所述多个分区中的第一分区与所述多个分区中的第二分区重叠。
16.根据权利要求9所述的一种或多种非暂时性计算机可读介质,其中所述多个分区中的第一分区与所述多个分区中的第二分区不重叠。
17.一种方法,其包括:
由计算设备确定模拟世界的多个分区,其中所述多个分区中的每个分区对应于多个度量中的、用于所述模拟世界中的一个或多个实体或者所述模拟世界中的所述实体的组件的不同度量;
由所述计算设备确定用于所述模拟世界的多个虚拟进程;
由所述计算设备向所述多个分区中的每个分区分配所述多个虚拟进程中的不同虚拟进程;
向一个或多个分区执行器服务发送所述多个分区的指示以及针对所述多个分区中每个分区的分配;以及
向虚拟进程管理器发送所述多个虚拟进程的指示。
18.根据权利要求17所述的方法,其中:
所述模拟世界的所述多个分区包括第一分区和第二分区;
所述多个度量包括所述模拟世界的第一有界区域和所述模拟世界的第二有界区域;
所述模拟世界的所述第一有界区域不同于所述模拟世界的所述第二有界区域;
所述第一分区对应于所述模拟世界的所述第一有界区域中的实体;
所述第二分区对应于所述模拟世界的所述第二有界区域中的实体;以及
所述模拟世界中的实体能够在所述模拟世界的不同有界区域之间移动。
19.根据权利要求18所述的方法,其中:
所述模拟世界的所述多个分区包括第三分区;
所述多个度量包括组件类型;以及
所述第三分区对应于具有所述组件类型的实体。
20.根据权利要求17所述的方法,其中所述虚拟进程管理器被配置为基于从所述计算设备接收的数据来启动或停止虚拟进程层中的虚拟进程。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US16/054,135 | 2018-08-03 | ||
US16/054,135 US10380282B2 (en) | 2016-08-24 | 2018-08-03 | Distributable and customizable load-balancing of data-associated computation via partitions and virtual processes |
Publications (1)
Publication Number | Publication Date |
---|---|
CN110851266A true CN110851266A (zh) | 2020-02-28 |
Family
ID=69594728
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910719294.6A Pending CN110851266A (zh) | 2018-08-03 | 2019-08-05 | 通过分区和虚拟进程的负载平衡 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110851266A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111445696A (zh) * | 2020-03-11 | 2020-07-24 | 武汉大学深圳研究院 | 基于商滤波器边缘计算的信号灯路口交通数据检测方法 |
CN111478937A (zh) * | 2020-02-29 | 2020-07-31 | 新华三信息安全技术有限公司 | 一种负载均衡方法和装置 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20100050237A1 (en) * | 2008-08-19 | 2010-02-25 | Brian Ronald Bokor | Generating user and avatar specific content in a virtual world |
CN102103657A (zh) * | 2010-11-29 | 2011-06-22 | 广州明朝网络科技有限公司 | 虚拟世界系统及实现虚拟世界的方法 |
CN104182502A (zh) * | 2014-08-18 | 2014-12-03 | 浪潮(北京)电子信息产业有限公司 | 一种数据抽取方法及装置 |
-
2019
- 2019-08-05 CN CN201910719294.6A patent/CN110851266A/zh active Pending
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20100050237A1 (en) * | 2008-08-19 | 2010-02-25 | Brian Ronald Bokor | Generating user and avatar specific content in a virtual world |
CN102103657A (zh) * | 2010-11-29 | 2011-06-22 | 广州明朝网络科技有限公司 | 虚拟世界系统及实现虚拟世界的方法 |
CN104182502A (zh) * | 2014-08-18 | 2014-12-03 | 浪潮(北京)电子信息产业有限公司 | 一种数据抽取方法及装置 |
Non-Patent Citations (1)
Title |
---|
FENGYUN LU等: "Load Balancing for Massively Multiplayer Online Games" * |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111478937A (zh) * | 2020-02-29 | 2020-07-31 | 新华三信息安全技术有限公司 | 一种负载均衡方法和装置 |
CN111478937B (zh) * | 2020-02-29 | 2022-05-27 | 新华三信息安全技术有限公司 | 一种负载均衡方法和装置 |
CN111445696A (zh) * | 2020-03-11 | 2020-07-24 | 武汉大学深圳研究院 | 基于商滤波器边缘计算的信号灯路口交通数据检测方法 |
CN111445696B (zh) * | 2020-03-11 | 2022-05-20 | 武汉大学深圳研究院 | 基于商滤波器边缘计算的信号灯路口交通数据检测方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11816402B2 (en) | Simulation systems and methods | |
US11550621B2 (en) | Distributable and customizable load-balancing of data-associated computation via partitions and virtual processes | |
US10728091B2 (en) | Topology-aware provisioning of hardware accelerator resources in a distributed environment | |
US10325343B1 (en) | Topology aware grouping and provisioning of GPU resources in GPU-as-a-Service platform | |
US10643010B2 (en) | Scalable simulation system with scalable data propagation | |
US11936734B2 (en) | Simulation systems and methods using query-based interest | |
US20200174840A1 (en) | Dynamic composition of data pipeline in accelerator-as-a-service computing environment | |
US10878146B2 (en) | Handover techniques for simulation systems and methods | |
US11416305B2 (en) | Commands for simulation systems and methods | |
CN110851266A (zh) | 通过分区和虚拟进程的负载平衡 | |
CN112912850B (zh) | 使用基于查询的兴趣的模拟系统和方法 | |
US11087047B2 (en) | Scalable update propagation via query aggregations and connection migrations | |
US20220121796A1 (en) | Simulation systems using inverse interest | |
US11651005B2 (en) | Intelligent datastore determination for microservice | |
US20220300675A1 (en) | Event-Based View Synchronization Systems and Methods |
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 | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20200228 |
|
WD01 | Invention patent application deemed withdrawn after publication |