Ingrid idioms

Design principles

All of our services and applications were implemented using the twelve-factor app methodology for building software-as-a-service apps.

The Twelve Factors

I. Codebase

One codebase tracked in revision control, many deploys

II. Dependencies

Explicitly declare and isolate dependencies

III. Config

Store config in the environment

IV. Backing services

Treat backing services as attached resources

V. Build, release, run

Strictly separate build and run stages

VI. Processes

Execute the app as one or more stateless processes

VII. Port binding

Export services via port binding

VIII. Concurrency

Scale out via the process model

IX. Disposability

Maximize robustness with fast startup and graceful shutdown

X. Dev/prod parity

Keep development, staging, and production as similar as possible

XI. Logs

Treat logs as event streams

XII. Admin processes

Run admin/management tasks as one-off processes

Single Responsibility Principle

Each component must be responsible for a specific feature or a functionality or aggregation of cohesive functionality. We chose a microservices / event-based architecture where each component is encapsulated and does exactly one job.

Performance

Performance is measured by throughput, response time (eg. 2500 TPS -transactions per second). The performance requirements must be available in the beginning of the design phase itself. So, appropriate technology and design decisions must be taken, to avoid re-work in the later stage.

We choose Golang (for most use-cases) to reach exatcly this goal. Our components are designed to be highly performant and extermely lightweight build.

Availability and Scalability

The golden rule for availability says, anticipate failures and design accordingly so that the systems will be available for 99.999% (Five Nines). It means the system can go down only for a 5.5 minutes for an entire year. The cluster model is used to support high availability, where it suggests having group of services run in Active-Active mode or Active-Standby model.

Microservices must be scale-able both horizontally and vertically. Being horizontally scale-able, we can have multiple instances of components to increase the performance of the system.