From d462c5dce5c3296ac5c06bb98edb49952e8a0fc4 Mon Sep 17 00:00:00 2001 From: Torsten Dittmann Date: Wed, 10 Mar 2021 14:39:37 +0100 Subject: [PATCH] adapt to review --- app/controllers/api/health.php | 11 ----------- app/realtime.php | 14 ++++++++------ src/Appwrite/Realtime/Realtime.php | 10 ++++++++++ 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/app/controllers/api/health.php b/app/controllers/api/health.php index 4658ac079..696247f3d 100644 --- a/app/controllers/api/health.php +++ b/app/controllers/api/health.php @@ -33,17 +33,6 @@ App::get('/v1/health/version') $response->json(['version' => APP_VERSION_STABLE]); }); -App::get('/v1/health/realtime') - ->desc('Get Realtime') - ->groups(['api', 'health']) - ->label('scope', 'public') - ->inject('response') - ->action(function ($response) { - /** @var Utopia\Response $response */ - // TODO: realtime health - $response->json(['status' => 'OK']); - }); - App::get('/v1/health/db') ->desc('Get DB') ->groups(['api', 'health']) diff --git a/app/realtime.php b/app/realtime.php index 2c7656c90..55634c506 100644 --- a/app/realtime.php +++ b/app/realtime.php @@ -119,12 +119,12 @@ $server->on('start', function (Server $server) { }); $server->on('open', function (Server $server, Request $request) use (&$connections, &$subscriptions, &$register) { - Console::info("Connection open (user: {$request->fd}, connections: {}, worker: {$server->getWorkerId()})"); - $app = new App(''); $connection = $request->fd; $request = new SwooleRequest($request); + Console::info("Connection open (user: {$connection}, worker: {$server->getWorkerId()})"); + App::setResource('request', function () use ($request) { return $request; }); @@ -152,8 +152,10 @@ $server->on('open', function (Server $server, Request $request) use (&$connectio /* * Abuse Check + * + * Abuse limits are connecting 128 times per minute and ip address. */ - $timeLimit = new TimeLimit('url:{url},ip:{ip}', 60, 60, function () use ($register) { + $timeLimit = new TimeLimit('url:{url},ip:{ip}', 128, 60, function () use ($register) { return $register->get('db'); }); $timeLimit @@ -209,9 +211,9 @@ $server->on('message', function (Server $server, Frame $frame) { $server->close($frame->fd); }); -$server->on('close', function (Server $server, int $fd) use (&$connections, &$subscriptions) { - Realtime::unsubscribe($fd, $subscriptions, $connections); - Console::info('Connection close: ' . $fd); +$server->on('close', function (Server $server, int $connection) use (&$connections, &$subscriptions) { + Realtime::unsubscribe($connection, $subscriptions, $connections); + Console::info('Connection close: ' . $connection); }); $server->start(); diff --git a/src/Appwrite/Realtime/Realtime.php b/src/Appwrite/Realtime/Realtime.php index 93e5cffd9..615a07d43 100644 --- a/src/Appwrite/Realtime/Realtime.php +++ b/src/Appwrite/Realtime/Realtime.php @@ -87,6 +87,16 @@ class Realtime /** * Identifies the receivers of all subscriptions, based on the permissions and event. * + * The processing works in linear time complexity, meaning it will increase in time - the same amount it increases in space. + * + * Example with a event with user:XXX permissions and with X users spread across 10 different channels: + * - 0.014 ms (±6.88%) | 10 Connections / 100 Subscriptions + * - 0.070 ms (±3.71%) | 100 Connections / 1,000 Subscriptions + * - 0.846 ms (±2.74%) | 1,000 Connections / 10,000 Subscriptions + * - 10.866 ms (±1.01%) | 10,000 Connections / 100,000 Subscriptions + * - 110.201 ms (±2.32%) | 100,000 Connections / 1,000,000 Subscriptions + * - 1,121.328 ms (±0.84%) | 1,000,000 Connections / 10,000,000 Subscriptions + * * @param array $event * @param array $connections * @param array $subscriptions