Aller au contenu principal

La Clock

Qu'est-ce que c'est ?

La clock est un service qui vous permet d'accélérer le temps pour vos applications. Vous pouvez aller jusqu'à une vitesse de x16000, si vous le souhaitez (mais c'est beaucoup trop rapide pour nos besoins). Elle vous permet d'enregistrer des jobs via des identifiants, et d'associer ces identifiants à des triggers qui seront appelés selon un cron pattern. Attention cependant: pour des raisons de performance, la clock trigger les événements toutes les 10 secondes, donc vous ne pourrez pas les déclencher à une fréquence supérieure.

Des conteneurs supplémentaires sont apparus dans votre docker-compose.yaml afin de l'utiliser. Vous devrez normalement faire un docker login registry.cri.epita.fr -u prenom.nom -p mot-de-passe avec la registry du CRI afin de pouvoir pull les images (utilisez vos identifiants du CRI, comme si vous vous connectiez à une machine pour les exams).

Comment la paramétrer

La clock s'appuie sur des variables d'environnement:

APP_NAME=e-commerce
CLOCK_API_HOME=http://localhost:8080
KONG_API_KEY=dev-kong-api-key-ubsi
RABBITMQ_URL=amqp://guest:guest@localhost:5672

Vous pouvez utiliser une instance de la clock qui tourne en local (option par défaut), ou utiliser celle de staging. Pour utiliser celle de staging, modifiez vos variables d'environnement:

CLOCK_API_HOME=https://kong-proxy.staging.ubsi.fr

Comment l'utiliser dans votre application

Un exemple est disponible sur la template-app, les changements nécessaires sont dans ce commit.

N'oubliez pas d'importer le module de la clock aux bons endroits. Pour schedule un job, deux opérations sont nécessaires:

Dans votre service contenant le job:

  constructor(
private readonly configService: ConfigService,
@Inject('INJECTABLE_CLOCK') private readonly injectableClock: ClockClient,
) {
injectableClock.registerHandler(
'votre-identifiant-unique-de-job-kebabcase',
async () => {
await this.votreFonctionDeJob();
},
);
}

Dans votre main.ts:

  const injectableClock: ClockClient = app.get('INJECTABLE_CLOCK'); // n'écrivez cette ligne qu'une seule fois
void injectableClock.startConsuming(); // n'écrivez cette ligne qu'une seule fois
void injectableClock.scheduleCron(
'0 * * * *', // votre expression CRON
'votre-identifiant-unique-de-job-kebabcase', // doit être le même que celui que vous avez enregistré plus tôt
{},
);

Vous pouvez/devriez également afficher l'heure de la clock dans votre frontend. Des endpoints NestJS et un composant React sont disponibles dans la template-app, nous vous faisons confiance pour les rendre magnifiques.

Comment manipuler le temps

Afin d'accéler le temps, une interface graphique vous est fournie. Si vous êtes en local, elle est disponible sur localhost:8081. Si vous êtes sur staging, elle est disponible sur https://augustin.clock.staging.ubsi.fr/. Attention, l'aiguille ne va que dans un sens... Pas de retour en arrière possible. Essayez de ne pas dépasser les limites du raisonnable lorsque vous êtes sur des environnements partagés.

Si vous voulez réinitialiser la clock en local, c'est possible: (Attention, cela supprimera également votre configuration rabbitmq)

# à la racine du projet
docker compose down
docker volume rm ubsi-rabbitmq-data ubsi-redis-data

Documentation supplémentaire

Pour plus d'informations sur la clock et le ClockClient: