Project: STRM Privacy

STRM Privacy is een startup die "privacy first" data streams aanbiedt. Als eerste freelance-opdracht bouwde ik een PHP implementatie van hun driver.

Stream Machine BV

Streammachine is een data processing platform, dat ervoor zorgt dat alle data altijd gevalideerd is aan de hand van een voorgedefinieerd schema, en dat het voldoet aan privacy-richtlijnen zoals GDPR/AVG, door al aan het begin (bij creatie van de data) de mate van privacy-gevoeligheid van alle velden te specificeren, in plaats van pas aan het eind, waar het eigenlijk al te laat is.
Ik kwam via een ex-collega in contact met dit bedrijf, omdat ze een PHP developer zochten. Ze hadden al driver implementaties voor diverse talen zoals typescript, Python en Java, maar nu was er ook vraag naar een PHP implementatie. Deze heb ik voor ze gebouwd. In de kern kwam het neer op een client die event data op de juiste manier serialiseert en dit op correcte en efficiente wijze naar de streammachine gateway verstuurt.

Requirements

  • Op de juiste manier authenticeren met de backend
  • Qua opzet en object-structuur overeenkomend met de bestaande drivers voor andere talen
  • EfficiĆ«nt naar de backend: hergebruiken van bestaande connecties en objecten; gebruik van http/2
  • Duidelijke en behulpzame feedback naar de gebruiker bij fouten of excepties
  • Data moet geserialiseerd kunnen worden op basis van JSON en AVRO_BINARY
  • Voorzien van tests en CI pipelines

Ontwerp-keuzes

Er was niet bekend wat de minimale PHP versie was die ondersteund moest worden. Voor de veiligheid heb ik ervoor gekozen om versie 7.2 nog te ondersteunen. Deze versie is weliswaar al een tijd niet meer ondersteund, maar in de praktijk wordt 7.2 hier en daar toch nog wel gebruikt.

De driver zou net als de andere drivers open source worden. Dus heb ik er uiteraard een composer package van gemaakt, dat gepubliceerd is op Packagist en dus eenvoudig geinstalleerd kan worden dmv composer.

Apache Avro

De driver is in wezen een simpele API client en dus niet heel complex. Maar van Apache Avro had ik eerlijk gezegd nog nooit gehoord. Dit blijkt niets meer dan een serialisatie-systeem te zijn, maar wel een die een stuk efficienter is dan bijvoorbeeld JSON, en bovendien schema-gebaseerd. Alle data moet dus voldoen aan een schema-definitie, die je zelf kan definieren. Dit zorgt er enerzijds voor dat data altijd een bekende structuur en geldige inhoud heeft; en anderzijds dat het binary geserialiseerde formaat erg efficient is en zeer weinig overhead heeft.

Integratie van Avro bleek niet zo moeilijk. De meeste tijd ging in het zoeken van de beste PHP library, want er bleken een aantal verschillende versies en implementaties te zijn. Uiteindelijk bleek die van Wikimedia de meest up to date. Deze was rechtstreeks gebaseerd op de officiele versie van Apache en inclusief composer support. Wel beetje jammer dat de library niet PSR-4 compliant is. Er is wel een PSR-4 compliant port maar die bleek nog niet productie-rijp genoeg.

Tests en CI

Projecten als deze lenen zich goed voor TDD, al miste ik hier wel het "inversion of control" principe dat in bijv Laravel zit. Hiermee is het makkelijker om in je tests met een custom binding bijvoorbeeld een mock http client te injecteren, in plaats van de standaard client. Maar er zijn natuurlijk ook andere manieren om dit te bereiken. Iets minder elegant misschien, maar uiteindelijk gaat het om het resultaat.

Toen de driver zelf af, getest en goedgekeurd was, heb ik nog de Continuous Integration pipelines ingericht door middel van Github actions, om bij elke push de unit tests te draaien, en om bij een nieuwe release de repository van Packagist automatisch te updaten door middel van een webhook.

In de andere repositories van het bedrijf werd daarnaast ook gebruik gemaakt van Husky in combinatie met commitizen, voor afdwingen van consistente commit messages, en automatische semantic versioning en changelog generatie op basis van deze commits. Ik kende deze tools nog niet, maar ze bleken handig en nuttig, dus ik ga ze zeker vaker gebruiken.

Heb jij ook een project waar je mijn hulp bij kan gebruiken?

Ik help je graag! Neem contact met me op, en we bespreken je wensen.