tech

Quelle stack pour Phresque.com ? (2/3)

oct. 7, 2020

Phresque.com se divise en trois applications

1. Node.js & React - Front & Back

2. Python & PostgreSQL - Base de Données

3. PyTorch & Redis - Transformations d'images

Cet article de blog se concentrera uniquement sur la deuxième partie:

Une architecture de orientée services plutôt qu'un modèle MVC

L'avantage d'une architecture orientée services c'est que chaque service s'occupe de sa tâche et attend un signal précis pour commencer à travailler. image antennas

Pour Phresque, React et Node ne s'occupent que de traiter les interactions avec l'utilisateur. Dès qu'une information doit être conservée, ce n'est plus le couple React/Node qui s'en occupe mais une application Bottle qui est un tout petit framework web pour Python. Ainsi chaque fois qu'un utilisateur décide de passer commande sur Phresque, Node transfert ces informations à l'application Bottle qui la stocke dans la base de données PostgreSQL.

L'application Bottle sait faire un nombre de choses très limitées. Insertions en base, suppressions, mises à jour d'informations et affichage des photos. Comme toute application web, elle est capable de traiter des requêtes GET ou POST. Ainsi Node, ne communique avec Bottle qu'avec ces deux types de requêtes en lui transmettant par moment des fichiers JSON.
Dans tous les cas, Bottle renvoie toujours des fichiers JSON avec les informations nécessaires pour que le front sache quoi afficher sur la page web.

L'avantage d'une telle architecture c'est que les deux services peuvent être développés de façon indépendante. Deux dépôts git différents sont utilisés, un pour React/Node et un autre pour Bottle/Python. Il n'y a aucune raison qu'un bug dans une application vienne affecter l'autre application.

Mais alors comment ça fonctionne Bottle pour Phresque ?
Bottle est relié à la base de données PostgreSQL via un ORM qui s'appelle SQLalchemy ainsi chaque fois qu'une requête en provenance de Node est captée. Les données concernées sont automatiquement récupérées sous forme d'objets. On peut modifier les caractéristiques de ces mêmes objets et ces modifications seront prises en compte directement dans la base de données. Hyper pratique car on n'a jamais besoin d'avoir à écrire du SQL!
Un petit exemple ci-dessous:

@app.route('/payment_stripe_success', method='POST')
def stripewatcher(db):
    stripe_ids = [c['source'] for c in request.json]
    ft_list = db.query(Orders).filter(Purchase.IdStripeCharge.in_(stripe_ids)).all()
    for ft in ft_list:
        ft.Status = 'paid'

Chaque fois que Stripe signale qu'un paiement a réussi:

  1. Node transfert le fichier JSON reçu de Stripe à Bottle sur l'url /payment_stripe_success
  2. la liste de toutes les transactions en attente est récupérée à partir des id stripe sont directement récupérées depuis la base de données.
  3. et pour chacune des transactions, leur statut change de 'pending' à 'paid'.
    Pour info, l'argument db de la fonction stripewatcher est disponible grâce au très bon package bottle-sqlalchemy

La même logique est utilisée pour créer les commandes, sauvegarder les images stylisées, mettre à disposition les images que l'utilisateur veut voir etc...

Comment est gérée PostgreSQL ?

PostgreSQL c'est fiable, c'est rodé, c'est open source, c'est largement utilisé, c'est rapide. Et ça permet de ranger de l'information, comme une bibliothèque. image library

Quand on crée une base de données, il faut d'abord créer des tables. Des colonnes dans ces tables. Des colonnes qui acceptent uniquement un certain type de données. Est-ce que dans cette colonne je vais stocker des nombres, du texte ? Quelle sera la longueur de ce texte ? Cela fait-il remonter des souvenirs ?
La création d'une base de données entre dans ce qu'on appelle l'architecture logicielle. Il n'y a pas de bases de données parfaites, car elles devraient tenir compte de tous les cas d'usages actuels et futurs et comme toute architecture, chaque architecte aura son propre plan et son mot à dire. Mais toutes choses ayant été entendues, tant que le bâtiment tient debout et permet de faire ce pour quoi il a été pensé, pourquoi ergoter ?

Pour Phresque, huit tables suffisent. Sincèrement navré, nous ne publierons pas le schéma utilisé de peur que Shopify ne s'en inspire. jk :)

Pour gérer les bases de données PostgreSQL, rien de mieux que pgAdmin configuré en tunnel SSH depuis votre PC vers vos serveurs.