Appearance
缓存与性能
平台的瓦片与元数据都带标准的 HTTP 缓存头,浏览器、CDN 与反向代理可以直接利用。本页说明各类地址的缓存时长、数据改动后多久能看到新结果,以及何时预切片。
瓦片从哪里来
浏览器 / CDN → 平台的运行时缓存 → 预切缓存 → 现场生成- 浏览器 / CDN:按下表的
Cache-Control与ETag缓存。 - 运行时缓存:平台把现场生成的瓦片保存在内存与磁盘中,同一瓦片同时被多次请求时只生成一次。
- 预切缓存:提前切好的瓦片,在预切的级别范围内直接读取,见预切片。
- 以上都没有命中时现场生成,单张瓦片可能需要数百毫秒到数秒。
各类地址的 Cache-Control
公开服务的实际值:
| 地址 | Cache-Control | 说明 |
|---|---|---|
VectorTileServer 矢量瓦片 tile/{z}/{y}/{x}.pbf | public, max-age=300 | 读自预切缓存时 public, max-age=3600 |
MapServer 切片 tile/{z}/{y}/{x}、WMTS 切片 | public, max-age=300 | 读自预切缓存时 3600 |
| 空瓦片(HTTP 204) | 与同地址的非空瓦片相同 | 避免对没有数据的区域反复请求 |
tiles.json、resources/styles、WMTS 能力文档 | no-cache | 每次向平台确认,没有变化时返回 304 |
| 服务内的雪碧图与字形 | public, max-age=86400 | |
平台字体 /fonts/… | public, max-age=86400 | 字形缺失时用更短的时长 |
平台雪碧图 /sprites/… | public, max-age=300 | 图标集可以在控制台编辑,缓存时间较短 |
MapServer、VectorTileServer 的 export 图片,WMS GetMap 图片 | public, max-age=60 | 参数组合多,短时缓存 |
地图方案样式 style.json、服务目录 | no-cache | |
| 不完整的瓦片与出图 | no-store | 有图层因超时、过密等原因被跳过,不缓存,下次重新生成 |
| 一切错误响应 | no-store | 包括 4xx、5xx |
ETag与 304:瓦片与元数据(tiles.json、样式、WMTS 能力文档、雪碧图、字形)带强ETag。客户端带If-None-Match再次请求、内容未变时返回 304,没有正文。export与GetMap的图片不带ETag、不支持 304。- 非公开服务(「API Key」与「私有」级别):成功响应改为
private(保留max-age),并带Vary: X-GeoBridge-Token。只进浏览器的私有缓存,CDN 与共享代理不应缓存。 - 共用电脑:浏览器在
max-age内可能直接复用上一个账号读过的私有瓦片。同一浏览器退出后换账号登录时,请清除浏览器缓存。 - gzip:矢量瓦片以 gzip 压缩传输(请求带
Accept-Encoding: gzip时),响应带Vary: Accept-Encoding。 - 有图层没有绘制的瓦片与出图带响应头
X-GeoBridge-Omitted-Layers(逗号分隔的图层编号)。只因超出比例尺范围而省略的图层不算不完整,照常缓存;分级样式的大图层在某个比例尺首次出图、要素数尚未统计完成而暂时省略时,以及按样式放宽后读取超出上限时,算不完整,不缓存。
服务从公开改为非公开
改级别之前以 public 发出的瓦片若已被 CDN 或共享代理缓存,会保留到各自的 max-age 过期(瓦片 300 秒,预切瓦片 3600 秒,出图 60 秒),期间任何人都能从 CDN 取到。改级别后请在 CDN 上清除该服务的地址前缀。 见访问级别。
瓦片相关的错误
| 情形 | 响应 |
|---|---|
| 服务没有切片方案(MapServer 切片与 WMTS 只在服务启用了预切片时;未预切片的服务按需出图,不需要切片方案) | 404 TILING_NOT_CONFIGURED「该服务未配置切片」 |
| 级别、行列号为负数 | 400 |
| 预切缓存读取失败 | 503,不返回空瓦片 |
| 代理的远程切片源出错 | 503 |
| 其他生成错误 | 500「切片生成失败」 |
数据改动后多久能看到
经平台修改的数据
以下操作会让服务的缓存自动失效,下次访问重新生成:
- 通过 FeatureServer 的编辑接口修改要素(被编辑的图层所在的所有服务都会失效);
- 修改服务引用的图层、数据源或样式,或重新发布服务;
- 启动、重新启动服务;
- 修改服务的署名。
此时用户看到新结果的最长延迟等于浏览器缓存时长:瓦片约 5 分钟(max-age=300)。经过 CDN 时还要加上 CDN 的缓存时间。
在平台之外直接修改数据库
平台感知不到这类修改。两种办法:
- 等待:平台的运行时缓存最长保留 24 小时。
- 在控制台点「清除瓦片缓存」(见下文),之后只受浏览器缓存约束(约 5 分钟)。
字体与图标
字体库、图标库的变更不会让服务的瓦片缓存失效。矢量瓦片本身不含字体与图标,受影响的主要是服务端出图(栅格切片、export);需要旧区域立刻使用新字体或图标时,请对相关服务点「清除瓦片缓存」。
清除瓦片缓存
- 位置:控制台服务详情页右上角「更多操作」菜单中的「清除瓦片缓存」,仅在服务能力包含 MapServer 或 VectorTileServer 时显示。
- 确认:点击后弹出确认框。清除后所有瓦片在下次访问时重新生成,期间访问会变慢;预切缓存不受影响,按需生成的图片切片会一并清除。确认后提示「瓦片缓存已清除」。
- 权限:与启动、停止服务相同,需要该工作空间的服务管理权限。
- 已被浏览器或 CDN 缓存的瓦片不受影响,在
max-age内仍可能看到旧的。
预切片
什么时候该预切
- 数据稳定、很少变化,访问量大的服务;
- 级别不超过 14(级别越高,瓦片数量增长越快);
- 希望第一次访问也很快:运行时缓存只能加速第二次及以后的访问,第一次仍要现场生成。
数据经常变化的服务不适合预切:预切瓦片只在重新切片后才更新,读取时的缓存时长也更长(3600 秒)。
怎样发起
在控制台服务详情页右上角点「生成切片缓存」(服务需要有切片方案),进入新建处理任务页,按「规划切片范围 → 生成切片 → 打包切片」的流程创建任务。任务完成后,预切级别范围内的请求直接读预切缓存;范围之外的请求照常走运行时缓存与现场生成。
性能建议
- 浏览器端的地图优先用矢量瓦片(VectorTileServer)或切片(MapServer
tile、WMTS),它们可以被浏览器与 CDN 缓存;export与 WMSGetMap只适合偶尔出图。 - 「API Key」级别的服务在跨域网页里用请求头传 Key 时,浏览器会对每个不同的地址先发一次预检请求。瓦片多、对速度敏感的页面可以改用查询参数
token,见 API Key 与来源白名单。 - 公开服务可以放在 CDN 之后,CDN 按平台返回的
Cache-Control缓存即可;非公开服务的响应为private,CDN 不应缓存。