Source de données : SQS


1Présentation

Amazon SQS (Simple Queue Service) est une file de messages qui sert à enregistrer des ordres de traitement d'un côté, et de l'autre côté de récupérer ces ordres pour les traiter.

Si vous avez correctement configuré les paramètres de connexion à SQS, Temma crée automatiquement un objet de type \Temma\Datasources\Sqs. Par convention, nous partirons du principe que vous avez nommé cette connexion sqs dans le fichier etc/temma.php (voir la documentation de la configuration).

La connexion est alors disponible dans le contrôleur en écrivant :

$sqs = $this->sqs;

Dans les autres objets gérés par le composant d'injection de dépendances, la connexion à SQS est accessible en écrivant :

$sqs = $loader->dataSources->sqs;
$sqs = $loader->dataSources['sqs'];

2Installation

Pour pouvoir se connecter à AWS (Amazon Web Services), Temma a besoin d'accéder au SDK AWS PHP. Cela peut se faire en l'installant avec Composer, ou en l'installant manuellement.

2.1Installation avec Composer

Pour installer le SDK AWS PHP avec Composer, il suffit de taper cette commande depuis la racine du projet :

$ composer require aws/aws-sdk-php

2.2Installation manuelle

Pour installer le SDK AWS PHP manuellement, il faut télécharger le fichier aws.phar et le placer dans le répertoire lib/ du projet. Par exemple en exécutant la commande suivante :

$ wget -O lib/aws.phar https://docs.aws.amazon.com/aws-sdk-php/v3/download/aws.phar

Vous pouvez choisir d'installer le SDK AWS PHP au niveau du système entier, pour ne pas avoir à le réinstaller dans chaque projet. Pour cela, vous n'avez qu'à copier le fichier aws.phar dans un répertoire qui fait partie des chemins d'inclusion, comme par exemple /usr/share/php (au lieu de le mettre dans le répertoire lib/ de votre projet).


3Configuration

Dans le fichier etc/temma.php (voir la documentation de la configuration), vous déclarez le DSN (Data Source Name) qui permet de se connecter à SQS.

Le DSN permettant de se connecter à SQS s'écrit de la forme : sqs://CLÉ_ACCÈS:CLÉ_PRIVÉE@QUEUE_URL[#WAIT_POLLING]

  • La clé d'accès et la clé privée sont fournis par AWS.
  • QUEUE_URL correspond à l'URL de la file de messages, sans le préfixe "https://".
    Exemple : sqs://AKXYZ:PWD@sqs.eu-west-3.amazonaws.com/123456789012/queue_name
  • WAIT_POLLING est la durée optionnelle (en secondes) pendant laquelle la lecture attendra de recevoir une message avant d'échouer et de retourner un message vide. Peut prendre une valeur entre 1 et 20.
    Exemple : sqs://AKXYZ:PWD@sqs.eu-west-3.amazonaws.com/123456789012/queue_name#8

4Spécificités des files de messages

Contrairement aux autres sources de données, l'ajout de messages dans une file de message se fait sans fournir d'identifiant (nom, clé, chemin…). L'identifiant est créé automatiquement par SQS. Lorsqu'un message est lu, son identifiant est retourné en même temps que ses données ; cet identifiant est utile par la suite pour effacer le message de la file.

En conséquence, SQS ne permet pas de vérifier l'existence d'un message à partir de son identifiant, ni de sélectionner un message, ni de définir une valeur par défaut lors de la récupération d'un message.

Attention, contrairement à Beanstalk, où les lectures sont bloquantes jusqu'à ce qu'un message soit disponible, les lectures sur SQS ne sont pas bloquantes. Il est possible de faire du long polling en donnant un délai d'attente qui peut aller jusqu'à 20 secondes. Mais l'appel en lecture pour retourner une valeur nulle ; il faut alors refaire des essais de lecture.


5Appels unifiés

5.1Accès de type tableau

// écriture d'un message (sérialisé)
$sqs[''] = $data;

// lecture d'un message (désérialisé)
// retourne un tableau associatif avec les clés "id" et "data"
$msg = $sqs[''];

// effacement d'un message
unset($sqs[$msg['id']]);

// nombre de messages en attente
$nbr = count($sqs);

5.2Méthodes générales

// effacement d'un message
$sqs->remove($msg['id']);

// effacement de tous les messages
$sqs->flush();

5.3Gestion de données complexes sérialisées

// lecture d'un message (désérialisé)
// retourne un tableau associatif avec les clés "id" et "data"
$msg = $sqs->get('');

// lecture d'un message (désérialisé) avec une attente maximale de 8 secondes
// retourne un tableau associatif avec les clés "id" et "data"
$msg = $sqs->get('', options: 8);

// écriture d'un message (sérialisé)
$sqs->set('', $msgData);

// écriture de plusieurs messages (sérialisés)
$sqs->mSet([
    $user1data,
    $user2data,
    $user3data,
]);

5.4Gestion de données brutes

// lecture de données (brutes)
// retourne un tableau associatif avec les clés "id" et "data"
$html = $sqs->read('');

// lecture de données (brutes) avec une attente maximale de 8 secondes
// retourne un tableau associatif avec les clés "id" et "data"
$html = $sqs->read('', options: 8);

// écriture d'un message (brut)
$sqs->write('', $msgData);

// écriture de plusieurs messages (bruts)
$sqs->mWrite({
    $user1data,
    $user2data,
    $user3data,
]);

// écriture d'une message (brut) à partir d'un fichier local
$sqs->copyTo('', '/path/to/file');

// écriture de plusieurs données (brutes) à partir de fichiers locaux
$sqs->mCopyTo([
    '/path/to/file1',
    '/path/to/file2',
    '/path/to/file3',
]);