Our Architecture Is a
- reactive
responsive, resilient, elastic, scalable by design. Communication happens asynchronous, no HTTP between services. Check reactivemanifesto.org! - message-driven
event-carried state transfer & some event-sourcing - fully decoupled
We truly believe in doing things distributed. Microservices share no databases and survive each other’s failure - microservice
All services have a well-defined purpose derived from our business requirements - architecture
we live polyglott persistence and heavily invest into researching and developing patterns and best practices - running on node.js
we are rapidly moving from OOP to FRP (functional reactive programming). JavaScript allows us to do that - written in TypeScript
having static typing greatly increases development speed and fun. We don’t use TypeScript to create a JS-OOP zombie but to make development more fun and patterns easier to use - properly tested
We strongly believing in writing tests. Most (and all new) components have a coverage from 60%-90% - continuously monitored
We use Prometheus and Grafana to keep track of what our services do. We also use Grafana for company KPIs, BI and marketing metrics - and continuously deployed
We use containers to develop locally using the same images that run on production. We deploy with Wercker and do so about 7 times per day - into a kubernetes cluster
DNS, load balancing and redundancy are automatically done by our deployment system. We happily run many hundreds of kubernetes pods.
Our Web App
- like all components consists of microservices
We group microservices into components to make the overall architecture easier to understand - only targets nextgen browsers
We decided to develop for the future and optimize parts that will become obsolete before we get really big. We therefore completely ignore IE11 - uses state-of-the-art features
like flexbox, sendBeacon and others - is written in TypeScript
To easily use static typing and the most recent JS features (async/await, destructuring, …) - and styled properly
We use a style guide, BEM, postCSS and some sass - but still mainly uses laravel and angular1.5
We are currently migrating towards react/redux and will hopefully be done by the end of 2017
What Else?
- We like functional reactive programming, best practices, design patterns, schema validation, idempotency, eventual consistency and above all simplicity.
- We spend time discussing and implementing the right solutions that allow us to stay scalable and reactive towards growth and changing requirements.
- We design our architecture using Lego and a whiteboard. 🎃
Our Stack in a Nutshell
const getStack = async () => ({ architecture: 'reactive microservices', hosting: ['gcloud', 'aws'], monitoring: ['grafana', 'prometheus'], deployment: ['wercker', 'kubernetes', 'terraform'], persistence: ['redis', 'riak KV', 'mongo', 'neo4j', 'elasticsearch', 'MySQL', 'BigQuery', 'influxdb'], languages: ['TypeScript', 'ESnext'], runtimes: ['node.js', 'electron', 'nextgen browsers only'], brokers: ['rabbitmq'], client: ['react', 'redux', 'redux-saga', 'BEM'], build: ['webpack', 'postCSS', 'tslint'], tests: ['mocha', 'chai', 'istanbul', 'ava'], tools: ['@style/kbomb', '@style/peacekeeper'], office: ['Slack', 'G Suite'], team: { backendDevs: 5, microservices: 52, hiring: true }, legacy: new Date() >= new Date('2018') ? [] : ['PHP', 'laravel', 'Phalcon', 'Postgres', 'Ansible', 'StackDriver', 'angular1.5', 'sass/compass', 'influxdb'] });
Moar. MOAR!
Find us at StackShare and Stack Overflow or check out @style at npm and StyleLounge at GitHub!