Coucou

  • twitter.com/timbarray
  • github.com/tyx

Timothée Barray

développeur PHP depuis 12 ans

Attention chérie

ça va couper !

Retour d'expérience de 20 mois

Agenda

  • Microservices
  • HTTP
  • CQRS
  • Event Sourcing
  • Message broker

Microservices

Points clés

Petit

Indépendant

Résilient

Résilience

en informatique, la résilience est la capacité d'un système ou d'une architecture réseau à continuer de fonctionner en cas de panne

Stack Mature

  • Docker
  • Traefik
  • AWS
  • Consul
  • Eureka

Beaucoup plus facile de se lancer aujourd'hui

Approche traditionnelle

Ecommerce Simpliste

Cart

Product

Customer

GET

GET

POST

Ajouter un produit au panier

{
    "product_id": "e4dc6426-eb0f-42aa-9f77-f2f6f9e198f1",
    "customer_id": "368c748f-d636-4acb-a632-d5257ffb0764",
    "quantity": 1
}

Avantages

  • Simple
  • HTTP
  • Agnostic
  • Fonctionne pour pas cher !

Problématiques

  • Couplage fort
  • Temps de réponse
  • Faible résilience

Service A

Service B

Service C

Une meilleure résilience

Wrapping appels HTTP via des fault-handling librairies

https://github.com/Tolerance/Tolerance

  • Symfony
  • Guzzle
  • PhpHttp
  • Plusieurs stratégies de retry
<?php

$this->httpClient = new PluginClient(
    new HttpClient,
    [
        new RetryPlugin(new CountLimited(new SleepWaiter(), 10)),
    ]
);

// L'appel ne change pas, tout le mécanisme est intégré dans le plugin
$this->httpClient->sendRequest($this->messageFactory->createRequest('GET', '/'));

Exponential backoff

Service

Stratégie de retry

Pas suffisant

POST

Product

{
    "title": "Maillot de l'OM 93",
    "quantity": 1,
    "photo": "http://autresite.com/maillot.jpg"
}

Ajouter un produit à partir d'une photo existante

Déceptif et pourtant pas de notre faute

Approche
alternative

CQRS

Source: CQRS Journey by microsoft

EventSourcing

Source: CQRS Journey by microsoft

EventBus

EventStore

EventBus

QueryStore

Publish

Listen

Quels changements ?

POST

Product

{
    "title": "Maillot de l'OM 93",
    "quantity": 1,
    "photo": "http://autresite.com/maillot.jpg"
}

Ajouter un produit à partir d'une photo existante

On s'occupera de cette photo plus tard

ES

PhotoWasAdded

Un petit peu plus tard...

Ajouter un produit à partir d'une photo existante

PhotoWasAdded

EventBus

PhotoWasAdded

PhotoWasDownloaded

PhotoWasNotDownloaded

EventStore

Listener

Service Product

Appliqué aux microservices

spoiler alert : c'est tout pareil

Query Storage

EventStore

App A

Query Storage

EventStore

App B

EventBus

EventBus comme canal de communication

Retour sur notre Ecommerce

Cart

Product

Customer

EventBus

Nouvelles possibilités

Product

Cart

Customer

Cart

ProductWasRegistred

Publish

Listen

CustomerWasSignedUp

Publish

Listen

Nouvelles possibilités

Cart

Product

Customer

GET

GET

POST

Ajouter un produit au panier

Avantages

  • Bénéficie des avantages de l'ES et CQRS
  • Meilleur résilience
  • Couplage faible

Problématiques

  • Beaucoup d'efforts
  • Asynchronisme debug et test
  • Couplage quand même

One more thing

Tests

Problématiques

  • Approche traditionnelle : HTTP
  • Approche alternative : Async

Moco

https://github.com/dreamhead/moco

requestbin

Outils utiles

Stub Server

https://github.com/Runscope/requestbin

Inspect HTTP calls

Fonctionnement

Tester un EventListener qui fait un appel HTTP

MyEvent

SUT

Mon test

Moco

requestbin

ack

EventBus

POST

Polling

Questions ?

Merci