Project

General

Profile

Actions

Développement #94082

closed

Ajouter backend de cache en base de donnée.

Added by Nicolas Roche over 1 year ago. Updated over 1 year ago.

Status:
Rejeté
Priority:
Normal
Assignee:
Category:
-
Target version:
-
Start date:
14 August 2024
Due date:
% Done:

0%

Estimated time:
Patch proposed:
No
Planning:
No

Description

Avoir du cache cohérent entre les nœuds.
Sur base du backend de base natif à django :
https://docs.djangoproject.com/fr/3.2/topics/cache/#database-caching
(Tiré de https://git.entrouvert.org/entrouvert/passerelle/pulls/609)


Related issues 1 (0 open1 closed)

Related to Passerelle - Développement #94060: Introduction d'un cache cohérent et transactionnel en base lié aux resourcesRejetéNicolas Roche13 August 2024

Actions
Actions #1

Updated by Nicolas Roche over 1 year ago

  • Status changed from Nouveau to Information nécessaire

Dans la doc Django (le lien ci-dessus) je lis :

"Note : sans raison impérieuse, comme par exemple un hôte qui ne les prend pas en charge,
il est recommandé de se restreindre aux moteurs de cache inclus dans Django.
Ils sont intensivement testés et bien documentés."

Un premier backend de cache étant défini dans hobo, j'imagine que c'est là qu'il faudrait ajouter le second.
Je vois que tout y semble déjà prévu pour ajouter ce second backend de cache dans /debian_config_common.py

    # cache by tenant
    CACHES = {
        'default': {
            'BACKEND': 'hobo.multitenant.cache.TenantCache',
            # add a real Django cache backend, with its parameters if needed
            'REAL_BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache',
            'LOCATION': '127.0.0.1:11211',
        },
        'database': {
            'BACKEND': 'hobo.multitenant.cache.TenantCache',
            # add a real Django cache backend, with its parameters if needed
            'REAL_BACKEND': 'django.core.cache.backends.db.DatabaseCache',
            'LOCATION': 'tenant_cache',
        }
    }

Ensuite, je sèche sur la façon propre de créer la table où seront rangé les données sur nos serveurs multitenants,
j'imagine que ça passerait par une commande à ajouter dans service passerelle "debian/passerelle.service" :

Avant d’utiliser le cache en base de données, vous devez créer la table du cache avec cette commande :
python manage.py createcachetable

Je n'arrive pas à jouer cette commande en local :

passerelle-manage createcachetable --verbosity 3 --dry-run

Le routeur multitenant recherche 'django_cache' dans settings.SHARED_APPS,
à condition ensuite de pouvoir importer cette application (qui n'en est pas une).
Si je bidouille pour que ça passe,
j'obtiens, la création de la table sur le schéma 'public' de la base de donnée.

CREATE TABLE "tenant_cache" (
    "cache_key" varchar(255) NOT NULL PRIMARY KEY,
    "value" text NOT NULL,
    "expires" timestamp with time zone NOT NULL
);

Cela fonctionne mais n'a pas vraiment de sens.
Si je crée la table dans le bon schéma, le cache fonctionne également.
Faut-il prévoir une migration (dans chacune des briques où le cache sera utilisé),
pour créer la table dans le bon schéma et abandonner l'usage de la commande createcachetable ?

Actions #2

Updated by Nicolas Roche over 1 year ago

  • Related to Développement #94060: Introduction d'un cache cohérent et transactionnel en base lié aux resources added
Actions #3

Updated by Benjamin Dauvergne over 1 year ago

Je ne suis pas pour, ça demande de lancer une commande spécifique sur chaque tenant actuel puis à chaque initialisation d'un tenant etc... ce n'est pas vraiment possible de gérer ça via une migration (ou si on le fait avec une migration on sort de la doc de Django et on se retrouve dans la situation où on utilise un truc interne à Django mais de travers).

C'est vraiment un cas où une solution maison sera plus pratique pour nous, c'est juste un modèle c'est géré comme le reste et ça marche partout, pas de configuration au niveau des settings, c'est lié au modèle ressource simplifiant le nom des clés, etc...

Actions #4

Updated by Nicolas Roche over 1 year ago

on se retrouve dans la situation où on utilise un truc interne à Django mais de travers

C'est aussi mon avis.
Je ne rejette pas encore, pour voir si on a d'autres veulent intervenir ici.

Actions #5

Updated by Nicolas Roche over 1 year ago

  • Status changed from Information nécessaire to Rejeté

D'après nos discussions, on resterait sur du cache propre à chacun des connecteurs.

Actions

Also available in: Atom PDF