upscale / swoole-dispatch
Swoole 网络服务器的请求分发策略
2.3.0
2019-03-23 01:11 UTC
Requires
- php: >=5.4
- ext-swoole: ^4.0
README
这是一个为 Swoole 网络服务器 收集的请求 分发策略 的集合,它补充了内置的 分发模式。粘性会话分发策略也称为会话亲和性,是该库的基石。其他策略作为没有会话上下文的访客请求的备用方案提供。它们模仿了设计上相互排斥的本地分发模式。
策略
- 固定客户端
- 根据客户端 ID 将请求分发到工作者
- 轮询
- 以循环顺序将请求分发到工作者
- 粘性会话
- 根据会话 ID 将请求分发到工作者
- 查询字符串中的会话 ID
- cookie 中的会话 ID
- URL 路径
- 根据 URL 路径将请求分发到工作者
- 是否排除或包含查询字符串
- 自定义 URL 路径模式
- HTTP 方法过滤器
安装
该库通过 Composer 作为依赖项进行安装
composer require upscale/swoole-dispatch
分发策略
固定客户端
根据客户端连接 ID 将请求分发到工作者,相当于内置的 固定分发模式。
注册分发器
require 'vendor/autoload.php'; $server = new \Swoole\Http\Server('127.0.0.1', 8080); $server->set([ 'dispatch_func' => new \Upscale\Swoole\Dispatch\FixedClient(), ]); $server->on('request', function ($request, $response) use ($server) { $response->header('Content-Type', 'text/plain'); $response->end("Served by worker {$server->worker_id}\n"); }); $server->start();
发送一些测试请求
- 不同的连接在所有工作者之间分配
curl -s 'http://127.0.0.1:8080/?[1-4]' -H 'Connection: close' Served by worker 0 Served by worker 1 Served by worker 2 Served by worker 3
- 每个连接都分发到指定的单独工作者
curl -s 'http://127.0.0.1:8080/?[1-4]' Served by worker 1 Served by worker 1 Served by worker 1 Served by worker 1
轮询
以循环顺序将请求分发到工作者,相当于内置的 轮询分发模式。
注册分发器
$server->set([ 'dispatch_func' => new \Upscale\Swoole\Dispatch\RoundRobin(), ]);
发送一些测试请求
- 所有连接的请求在所有工作者之间分配
curl -s 'http://127.0.0.1:8080/?[1-4]' -H 'Connection: close' curl -s 'http://127.0.0.1:8080/?[1-4]' Served by worker 0 Served by worker 1 Served by worker 2 Served by worker 3
粘性会话
根据会话 ID 分发请求到工作者,也称为粘性会话(session affinity)。属于同一会话的所有请求都将分发到指定的单独工作者。会话 ID 在查询字符串和 cookie 标头的优先级顺序中识别。
这种策略与会话锁定互补,并可以弥补其不足。它防止工作者在争夺相同会话 ID 的独占锁时发生竞争条件。工作者只拾取各自的会话请求以及没有会话上下文的访客请求。
访客请求将委派给指定的备用策略。
注册粘性会话分发器,并将访客回退到轮询
$server->set([ 'dispatch_func' => new \Upscale\Swoole\Dispatch\StickySession( new \Upscale\Swoole\Dispatch\RoundRobin() ), ]);
发送带有和没有会话上下文的测试请求
- 访客请求被委派给备用策略轮询
curl -s 'http://127.0.0.1:8080/?[1-4]' Served by worker 0 Served by worker 1 Served by worker 2 Served by worker 3
- 会话请求被分发到指定的单独工作者
curl -s 'http://127.0.0.1:8080/?PHPSESSID=ExampleSessionIdentifier11&[1-4]' curl -s 'http://127.0.0.1:8080/?[1-4]' -H 'Cookie: PHPSESSID=ExampleSessionIdentifier11' Served by worker 2 Served by worker 2 Served by worker 2 Served by worker 2
URL 路径
根据 HTTP 请求的 URL 路径分发请求到工作者。配置是否使用路径之外的查询字符串(默认情况)。可以通过 PCRE 正则表达式语法提供自定义 URL 路径过滤器。也可以限制分发到特定的 HTTP 方法(默认为 HEAD
和 GET
)。
注册 URL 路径分发器,并将回退到轮询
$server->set([ 'dispatch_func' => new \Upscale\Swoole\Dispatch\UrlPath( new \Upscale\Swoole\Dispatch\RoundRobin() ), ]);
发送一些测试请求
- 请求通过 URL 路径分发到指定的单独工作者
curl -s 'http://127.0.0.1:8080/page1.html' curl -s 'http://127.0.0.1:8080/page2.html' curl -s 'http://127.0.0.1:8080/page3.html' curl -s 'http://127.0.0.1:8080/page3.html?ignored=any' Served by worker 2 Served by worker 0 Served by worker 1 Served by worker 1
贡献
欢迎提交带有修复和改进的拉取请求!
许可
版权所有 © Upscale Software。保留所有权利。
遵循Apache许可证,版本2.0许可。