upscale/swoole-dispatch

Swoole 网络服务器的请求分发策略

2.3.0 2019-03-23 01:11 UTC

This package is auto-updated.

Last update: 2024-09-18 06:54:45 UTC


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 方法(默认为 HEADGET)。

注册 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许可。