控制流模块

这个 control-flow geoserver模块允许管理员控制实际在服务器内部执行的并发请求的数量,并提供机会减缓用户发出过多请求的速度。这种控制有很多原因:

  • 性能 :测试表明,对于本地数据源,在 GetMap 请求是在允许最多2倍于CPU核心数的请求并行运行时实现的。

  • 资源控制 :请求,例如 GetMap 可以使用大量内存。这个 WMS request limits 允许控制每个请求使用的内存量,但是 OutOfMemoryError 如果并行运行的请求太多,仍有可能。通过控制执行请求的数量,可以限制在实际给Java虚拟机的内存下使用的内存总量。

  • 公平 :一个用户不应该用大量的请求压倒服务器,而让其他用户拥有很小的整体处理能力。

控制流方法通常不拒绝请求,它只是将多余的请求排队并延迟执行。但是,可以将模块配置为拒绝队列中等待时间过长的请求。

安装

  1. 访问 website download 页面,找到您的版本,并下载: geoserver-2.24.x-control-flow-plugin.zip

    警告

    确保与插件匹配(示例 2.24.x 以上)版本设置为Geoserver实例的版本。

  1. 将此存档中的文件提取到 WEB-INF/lib 地理服务器安装目录。

  2. 重新启动geoserver

规则语法引用

控制流模块的当前实现从 controlflow.properties 属性文件位于 地理服务器数据目录 .

OWS请求总数

并行执行的OWS请求的全局数目可以指定为::

ows.global=<count>

当其他请求完成时,超过的每个请求都将排队并执行,留下一些空闲的执行槽。

按请求控制

可以使用以下语法要求每个请求类型控件:

ows.<service>[.<request>[.<outputFormat>]]=<count>

在哪里?

  • <service> OWS服务有问题吗(在编写本文时可以是 wmswfswcs

  • <request>, optional, is the request type. For example, for the wms service it can be GetMap, GetFeatureInfo, DescribeLayer, GetLegendGraphics, GetCapabilities

  • <outputFormat> ,可选,是请求的输出格式。例如,对于 wms GetMap 请求可能是 image/pngimage/gif 等等。

几个例子:

# don't allow more than 16 WCS requests in parallel
ows.wcs=16
# don't allow more than 8 GetMap requests in parallel
ows.wms.getmap=8
# don't allow more than 2 WFS GetFeature requests with Excel output format
ows.wfs.getfeature.application/msexcel=2

请求优先支持

由上述“OWS.*”控制器控制的请求也可以按优先级顺序执行,如果请求太多,请求将阻塞并等待,我们将按优先级(从高到低)醒来。

当前唯一指定请求优先级的方法是将其添加到请求HTTP头:

ows.priority.http=<headerName>,<defaultPriority>

头“headername”将包含一个定义请求优先级的数字,如果/当找不到头时,默认优先级将用作回退。

使用报头意味着优先级管理中涉及到某个其他系统。这在使用负载均衡器时尤其好,因为请求优先级需要在集群元素之间平均分配,控制流只具有单个实例的可见性。例如,如果有两个节点,则实际上将在集群级别忽略优先级,并且无论是什么机会或设计,高优先级请求最终都会汇聚在同一集群节点上。

每用户并发控制

有两种机制可以识别用户请求。第一种是基于cookie的,所以它在浏览器中可以很好地工作,但对其他类型的客户机来说就没那么好了。第二种是基于IP的,它适用于任何类型的客户机,但是它可以限制同一路由器后面的所有用户。

这样可以避免单个用户(由cookie标识)并行发出过多的请求:

user=<count>

哪里 <count> 是单个用户可以并行执行的最大请求数。

以下内容可避免单个IP地址并行发出过多请求:

ip=<count>

哪里 <count> 是单个IP地址可以并行执行的最大请求数。

还可以使其更具体一些,并使用以下方法限制单个IP地址:

ip.<ip_addr>=<count>

哪里 <count> 中指定的IP的最大请求数 <ip_addr> 将并行执行。

要拒绝来自IP地址列表的请求,请执行以下操作:

ip.blacklist=<ip_addr1>,<ip_addr2>,...

每用户速率控制

速率控制规则允许基于cookie或IP地址设置每单位时间的最大请求数。这些规则如下(有关“用户”和“IP”的含义,请参阅“每用户并发控制”):

user.ows[.<service>[.<request>[.<outputFormat>]]]=<requests>/<unit>[;<delay>s]
ip.ows[.<service>[.<request>[.<outputFormat>]]]=<requests>/<unit>[;<delay>s]

在哪里?

  • <service> OWS服务有问题吗(在编写本文时可以是 wmswfswcs

  • <request>, optional, is the request type. For example, for the wms service it can be GetMap, GetFeatureInfo, DescribeLayer, GetLegendGraphics, GetCapabilities

  • <outputFormat> ,可选,是请求的输出格式。例如,对于 wms GetMap 请求可能是 image/pngimage/gif 等等。

  • <requests> 是以时间为单位的请求数

  • <unit> 是时间单位,可以是“s”、“m”、“h”、“d”(秒、分、时和日)。

  • <delay> 是应用于超过当前时隙中最大请求数的请求的可选延迟。如果未指定,一旦超过限制,将立即向调用者发送HTTP代码429的失败响应(“太多请求”)。

以下规则将允许每天执行1000个WPS请求,并将每个请求延迟超过30秒:

user.ows.wps.execute=1000/d;30s

以下规则将允许每秒最多30个getmap请求,但会立即使任何超过上限的请求失败:

user.ows.wms.getmap=30/s

在这两种情况下,通知用户请求速率控制的头将添加到HTTP响应中。例如::

X-Rate-Limit-Context: Any OGC request
X-Rate-Limit-Limit: 10
X-Rate-Limit-Remaining: 9
X-Rate-Limit-Reset: 1103919616
X-Rate-Limit-Action: Delay excess requests 1000ms

如果多个速率控制规则适用于一个请求,则会在每个请求的响应中添加一批头,因此建议避免并行添加太多这些规则。

在哪里?

  • X-Rate-Limit-Context 请求类型是否受控制

  • X-Rate-Limit-Limit 是控制间隔中允许的请求总数

  • X-Rate-Limit-Remaining 速率控制启动前允许的剩余请求数

  • X-Rate-Limit-Reset 是新控制间隔开始的Unix时期

  • X-Rate-Limit-Action 指定对超过速率控制的请求采取的操作

超时

使用以下语法指定请求超时::

timeout=<seconds>

在哪里? <seconds> 请求可以排队等待执行的秒数。如果请求在超时到期前未进入执行状态,则将被拒绝。

限制磁贴请求(WMS-C、TMS、WMT)

geoWebcache向geoserver提供三个缓存的tiles服务:wms-c、tms和wmt。也可以通过将以下规则添加到配置文件中,使用控制流模块对其进行节流:

ows.gwc=<count>

哪里 <count> 是GeoWebCache在任何给定时间将传送的并发切片请求的最大数量。

还要注意,tile请求对其他规则敏感(基于用户、基于IP、超时等)。

一个完整的例子

假设我们要保护的服务器有4个内核,则示例配置可以是:

# if a request waits in queue for more than 60 seconds it's not worth
# executing, the client will  likely have given up by then
timeout=60

# don't allow the execution of more than 100 requests total in parallel
ows.global=100

# don't allow more than 10 GetMap in parallel
ows.wms.getmap=10

# don't allow more than 4 outputs with Excel output as it's memory bound
ows.wfs.getfeature.application/msexcel=4

# don't allow a single user to perform more than 6 requests in parallel
# (6 being the Firefox default concurrency level at the time of writing)
user=6

# don't allow the execution of more than 16 tile requests in parallel
# (assuming a server with 4 cores, GWC empirical tests show that throughput
# peaks up at 4 x number of cores. Adjust as appropriate to your system)
ows.gwc=16