mirror of
https://github.com/appwrite/appwrite
synced 2026-05-24 09:28:40 +00:00
Merge pull request #9687 from appwrite/PLA-2807
feat(dispatch): add contextual dispatch logic
This commit is contained in:
commit
09ca143231
1 changed files with 89 additions and 83 deletions
52
app/http.php
52
app/http.php
|
|
@ -43,29 +43,6 @@ $http = new Server(
|
||||||
$payloadSize = 12 * (1024 * 1024); // 12MB - adding slight buffer for headers and other data that might be sent with the payload - update later with valid testing
|
$payloadSize = 12 * (1024 * 1024); // 12MB - adding slight buffer for headers and other data that might be sent with the payload - update later with valid testing
|
||||||
$totalWorkers = intval(System::getEnv('_APP_CPU_NUM', swoole_cpu_num())) * intval(System::getEnv('_APP_WORKER_PER_CORE', 6));
|
$totalWorkers = intval(System::getEnv('_APP_CPU_NUM', swoole_cpu_num())) * intval(System::getEnv('_APP_WORKER_PER_CORE', 6));
|
||||||
|
|
||||||
$http
|
|
||||||
->set([
|
|
||||||
'worker_num' => $totalWorkers,
|
|
||||||
'dispatch_func' => 'dispatch',
|
|
||||||
'open_http2_protocol' => true,
|
|
||||||
'http_compression' => false,
|
|
||||||
'package_max_length' => $payloadSize,
|
|
||||||
'buffer_output_size' => $payloadSize,
|
|
||||||
'task_worker_num' => 1, // required for the task to fetch domains background
|
|
||||||
]);
|
|
||||||
|
|
||||||
$http->on(Constant::EVENT_WORKER_START, function ($server, $workerId) {
|
|
||||||
Console::success('Worker ' . ++$workerId . ' started successfully');
|
|
||||||
});
|
|
||||||
|
|
||||||
$http->on(Constant::EVENT_BEFORE_RELOAD, function ($server, $workerId) {
|
|
||||||
Console::success('Starting reload...');
|
|
||||||
});
|
|
||||||
|
|
||||||
$http->on(Constant::EVENT_AFTER_RELOAD, function ($server, $workerId) {
|
|
||||||
Console::success('Reload completed...');
|
|
||||||
});
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Assigns HTTP requests to worker threads by analyzing its payload/content.
|
* Assigns HTTP requests to worker threads by analyzing its payload/content.
|
||||||
*
|
*
|
||||||
|
|
@ -83,6 +60,7 @@ $http->on(Constant::EVENT_AFTER_RELOAD, function ($server, $workerId) {
|
||||||
*/
|
*/
|
||||||
function dispatch(Server $server, int $fd, int $type, $data = null): int
|
function dispatch(Server $server, int $fd, int $type, $data = null): int
|
||||||
{
|
{
|
||||||
|
$resolveWorkerId = function (Server $server, $data = null) {
|
||||||
global $totalWorkers, $domains;
|
global $totalWorkers, $domains;
|
||||||
|
|
||||||
// If data is not set we can send request to any worker
|
// If data is not set we can send request to any worker
|
||||||
|
|
@ -151,8 +129,36 @@ function dispatch(Server $server, int $fd, int $type, $data = null): int
|
||||||
$worker = rand(0, $riskyWorkers - 1);
|
$worker = rand(0, $riskyWorkers - 1);
|
||||||
Console::warning("swoole_dispatch: Non-risky branch: did not find a idle worker, picking random worker {$worker}");
|
Console::warning("swoole_dispatch: Non-risky branch: did not find a idle worker, picking random worker {$worker}");
|
||||||
return $worker;
|
return $worker;
|
||||||
|
};
|
||||||
|
$workerId = $resolveWorkerId($server, $data);
|
||||||
|
$server->bind($fd, $workerId);
|
||||||
|
return $workerId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$http
|
||||||
|
->set([
|
||||||
|
Constant::OPTION_WORKER_NUM => $totalWorkers,
|
||||||
|
Constant::OPTION_DISPATCH_FUNC => dispatch(...),
|
||||||
|
Constant::OPTION_DISPATCH_MODE => SWOOLE_DISPATCH_UIDMOD,
|
||||||
|
Constant::OPTION_HTTP_COMPRESSION => false,
|
||||||
|
Constant::OPTION_PACKAGE_MAX_LENGTH => $payloadSize,
|
||||||
|
Constant::OPTION_OUTPUT_BUFFER_SIZE => $payloadSize,
|
||||||
|
Constant::OPTION_TASK_WORKER_NUM => 1, // required for the task to fetch domains background
|
||||||
|
]);
|
||||||
|
|
||||||
|
$http->on(Constant::EVENT_WORKER_START, function ($server, $workerId) {
|
||||||
|
Console::success('Worker ' . ++$workerId . ' started successfully');
|
||||||
|
});
|
||||||
|
|
||||||
|
$http->on(Constant::EVENT_BEFORE_RELOAD, function ($server, $workerId) {
|
||||||
|
Console::success('Starting reload...');
|
||||||
|
});
|
||||||
|
|
||||||
|
$http->on(Constant::EVENT_AFTER_RELOAD, function ($server, $workerId) {
|
||||||
|
Console::success('Reload completed...');
|
||||||
|
});
|
||||||
|
|
||||||
include __DIR__ . '/controllers/general.php';
|
include __DIR__ . '/controllers/general.php';
|
||||||
|
|
||||||
function createDatabase(App $app, string $resourceKey, string $dbName, array $collections, mixed $pools, callable $extraSetup = null): void
|
function createDatabase(App $app, string $resourceKey, string $dbName, array $collections, mixed $pools, callable $extraSetup = null): void
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue