针对传统单机切缓存技术的耗时长、无故障恢复等缺点,SuperMap iServer 提出了分布式地图瓦片生成和调度技术,通过一个 TileMaster 和多个 TileWorker 搭建起分布式地图瓦片系统。在 TileMaster 端对切图任务拆分为多个单元任务,由多个 TileWorker 同步执行,提升切图效率;TileMaster 通过与 TileWorker 的实时通信实现切图任务的动态分配和实时监控。此外,SuperMap iServer 的分布式切图系统支持地图瓦片的分布式存储管理,支持多种分布式文件系统,进一步提升了地图瓦片的存取速度和在线地图服务的访问速度。

1. 分布式切图的任务拆分机制

分布式切图技术要实现多机并行的切图方式,面临的首要问题就是如何将一个完整的切图任务拆分开来,让多台机器协同工作。任务拆分的方式可以多种多样,比如直接将单张瓦片作为单元任务,或按照机器数均分切图任务,但这些都不能满足并行切图的高性能、动态可扩展和稳定性要求。因为如果将单张瓦片直接作为切图单元,会因为粒度太小,节点之间的通信频率、存储时的写入频率都太高,而严重影响切图效率;而单元任务太大时会使单元任务完成时间过长,出现问题时不能及时发现,任务重切的时间成本又太高,且性能低的节点会成为切图的瓶颈,同样会影响切图效率。

基于以上考虑,分布式切图服务提供了一种自动化的切图任务拆分策略,用于根据比例尺、地理范围、瓦片大小、地图复杂度等因素,把大的切图任务细分为粒度适中的系列单元任务。切图任务拆分的基本原理是:在每个比例尺的地图中,以左上角为起点,根据瓦片大小计算总的瓦片行列数,按照逐行计算的顺序,取 N*N 个瓦片作为切图单元任务,使绝大多数单元任务均分并大小合适。其中,N 的选取与地图的复杂度以及瓦片大小(包括像元大小、文件大小)有关,地图复杂度高、瓦片大时 N 的取值较小,地图复杂度低、瓦片小时 N 的取值较大。默认的瓦片格式为 PNG,大小为256*256,N 的参考取值为20,即单元任务中瓦片数默认为400张。

如图所示,每个小的单元格代表一张地图瓦片,如果单元切图任务的瓦片张数为20*20,则从地图左上角开始以20行*20列为单元将地图进一步划分为单元任务区。最后一部分的单元任务如果不能满足20*20,如本例中只有10行,则会将任务范围扩大至10*n≤400,且尽量按照瓦片列数均分,本例中第7、8个单元任务中瓦片数为10*30。

单元任务拆分完成后将存储在单元任务池中,切图服务器会根据节点状况自动转发给各个空闲的切图节点。总体来说,并行切图的任务拆分机制有以下特点:

1) 单元任务相互独立,便于分配给不同的切图节点同步执行;

2) 单元任务自动拆分,不需要手工控制,一般采用默认参数即可满足需求;

3) 单元任务自动分发,切图服务器自动分发和控制单元任务的完成情况,不需要人工干预。

2. 分布式切图的通信机制

分布式切图技术中的切图工作系统,包含一个 TileMaster(切图主节点)和多个 TileWorker(切图子节点)。TileMaster 负责将整个切图任务拆分成粒度适中的单元任务,分配给多个 TileWorker 同步执行切图任务。

TileMaster 与 TileWorker 的模块设计:

  • TileMaster 主要包括任务管理模块与任务调度模块。任务管理模块负责切图任务的管理,通过这一模块可以添加、删除或启动、暂停切图任务。任务调度模块负责将切图任务拆分为粒度适中的单元任务,并分配给 TileWorker 执行,接收 TileWorker 报告的状态和负载信息,做出合理的判断并发出相应的任务指令。
  • TileWorker 主要包含报告器模块和切图模块。报告器模块负责向 TileMaster 端报告单元切图任务的执行状态和负载信息以及切片结果的存储信息,如果空闲则向 TileMaster 端发送任务请求。切图模块具体执行收到的单元切图任务,将地图瓦片存储到指定位置。

TileMaster 通过与 TileWorker 的实时通信实现切图任务的动态分配和实时监控,整个分布式切图系统工作流程中二者的通信可以描述为:

1) 用户向 TileMaster 端发送切图请求,传送切图参数,包括地图服务、地图名称、地理范围、比例尺集合、瓦片格式、瓦片大小等信息;

2) TileMaster 端根据用户输入创建切图任务;

3) TileMaster 端根据上文介绍的切图任务拆分机制,将切图任务拆分为粒度适中的单元任务,放在单元任务池中;

4) TileWorker 端与 TileMaster 端通信,报告当前的 TileWorker 空闲状态;

5) TileWorker 端从 TileMaster 的单元任务池获取单元任务;

6) TileMaster 端标记该单元任务状态为已被领取;

7) TileWorker 端执行单元任务,切图并在切图过程中向 TileMaster 报告单元任务执行的状态,将切图结果保存到指定存储位置;

8) TileMaster 端实时接收 TileWorker 报告的状态信息,并通过界面显示;

9) TileWorker 端单元任务完成后,向 TileMaster 端发送任务完成报告;

10) TileMaster 端验证 TileWorker 端的地图瓦片结果,记录单元任务完成;

11) TileWorker 端空闲后立即向 TileMaster 端报告空闲状态,循环执行流程中的 4)到 10)步;

12) TileMaster 端判断出现严重延时的单元任务,则将该单元任务的状态标识为未分配,由其他 TileWorker 领取执行,循环执行流程中的 4)到 10)步

13) TileMaster 端记录所有单元任务完成后,通过界面显示任务完成和切图结果信息。

单元任务的分配和执行过程可以下图简单示意。首先,空闲的 TileWorker1向 TileMaster 报告自身空闲的负载状态;TileMaster 接受到消息后将单元任务2分配给 TileWorker1;TileWorker1收到单元任务后立即执行任务,并将切图结果存储到指定位置。TileWorker1完成单元任务后会再次向 TileMaster 报告,TileMaster 判断单元任务执行完成后会标记该任务完成,并给 TileWorker1分配下一个单元任务。

并行切图过程中,TileMaster 对各个 TileWorker 的切图工作实时监控,一旦发现某个单元切图任务挂起或失败,则将该单元任务分配给其他 TileWorker 继续执行,从而可以避免因单个 TileWorker 的失效或某个单元任务的失败影响整个切图工作。此外,分布式切图系统中,切图节点是动态可伸缩的,即闲置的服务器可随时向 TileMaster 报告加入切图工作体系,也可以随时取消报告并离开。