1
0
Fork 0
mirror of synced 2024-10-05 12:43:13 +13:00

Add smarter traefik load balancing with health check

This commit is contained in:
Matej Bačo 2024-02-19 14:08:15 +00:00
parent db792999c1
commit 2ab6156db4
5 changed files with 24 additions and 5 deletions

2
.env
View file

@ -1,6 +1,6 @@
_APP_ENV=development _APP_ENV=development
_APP_LOCALE=en _APP_LOCALE=en
_APP_WORKER_PER_CORE=6 _APP_WORKER_PER_CORE=1
_APP_CONSOLE_WHITELIST_ROOT=disabled _APP_CONSOLE_WHITELIST_ROOT=disabled
_APP_CONSOLE_WHITELIST_EMAILS= _APP_CONSOLE_WHITELIST_EMAILS=
_APP_CONSOLE_WHITELIST_IPS= _APP_CONSOLE_WHITELIST_IPS=

View file

@ -51,8 +51,16 @@ App::get('/v1/health/version')
->label('sdk.response.code', Response::STATUS_CODE_OK) ->label('sdk.response.code', Response::STATUS_CODE_OK)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON) ->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_HEALTH_VERSION) ->label('sdk.response.model', Response::MODEL_HEALTH_VERSION)
->inject('http')
->inject('response') ->inject('response')
->action(function (Response $response) { ->action(function (mixed $http, Response $response) {
$stats = $http->stats();
\var_dump(\gethostname() . ': ' . $stats['idle_worker_num'] . '/' . $stats['worker_num']);
if(($stats['idle_worker_num'] ?? 0) <= 1) {
throw new Exception(Exception::GENERAL_SERVER_ERROR, 'Can not process more requests at the moment.');
}
$response->dynamic(new Document([ 'version' => APP_VERSION_STABLE ]), Response::MODEL_HEALTH_VERSION); $response->dynamic(new Document([ 'version' => APP_VERSION_STABLE ]), Response::MODEL_HEALTH_VERSION);
}); });

View file

@ -10,6 +10,7 @@ App::get('/versions')
->label('scope', 'public') ->label('scope', 'public')
->inject('response') ->inject('response')
->action(function (Response $response) { ->action(function (Response $response) {
\sleep(60);
$platforms = Config::getParam('platforms'); $platforms = Config::getParam('platforms');
$versions = [ $versions = [

View file

@ -327,4 +327,11 @@ $http->on('request', function (SwooleRequest $swooleRequest, SwooleResponse $swo
} }
}); });
$register->set('http', function () use ($http) {
return $http;
});
App::setResource('http', function ($register) {
return $register->get('http');
}, ['register']);
$http->start(); $http->start();

View file

@ -44,7 +44,9 @@ services:
- appwrite - appwrite
appwrite: appwrite:
container_name: appwrite deploy:
mode: replicated
replicas: 3
<<: *x-logging <<: *x-logging
image: appwrite-dev image: appwrite-dev
build: build:
@ -53,8 +55,6 @@ services:
DEBUG: false DEBUG: false
TESTING: true TESTING: true
VERSION: dev VERSION: dev
ports:
- 9501:80
networks: networks:
- appwrite - appwrite
labels: labels:
@ -62,6 +62,9 @@ services:
- "traefik.constraint-label-stack=appwrite" - "traefik.constraint-label-stack=appwrite"
- "traefik.docker.network=appwrite" - "traefik.docker.network=appwrite"
- "traefik.http.services.appwrite_api.loadbalancer.server.port=80" - "traefik.http.services.appwrite_api.loadbalancer.server.port=80"
- "traefik.http.services.appwrite_api.loadbalancer.healthcheck.path=/v1/health/version"
- "traefik.http.services.appwrite_api.loadbalancer.healthcheck.interval=3s"
- "traefik.http.services.appwrite_api.loadbalancer.healthcheck.timeout=2s"
#http #http
- traefik.http.routers.appwrite_api_http.entrypoints=appwrite_web - traefik.http.routers.appwrite_api_http.entrypoints=appwrite_web
- traefik.http.routers.appwrite_api_http.rule=PathPrefix(`/`) - traefik.http.routers.appwrite_api_http.rule=PathPrefix(`/`)