RailsEventStore in Billetto

Billetto is the leading subculture event marketplace in the Nordics and operates in most of the EU countries. It connects ticket buyers to indie events and push for cultural diversity by promoting subcultures that make us human. The Billetto community has grown to 3+ million members over the last 12 years. Billetto is more than just a ticket sales tool. It provides users with a fully-kitted platform for ticket sales and effortless event advertisement.

Rails Event Store has been introduced to the codebase as a tool to help integrate with 3rd party systems. After a few months successfully running in production the Rails Event Store concepts was proven by raising usage of event store and acceptance by Billetto team members.

Domains events in time

Some statistics

as for October 2024
  • First event published: November 2014
  • Current number of events: 876 949 097
  • Current number of streams: 35 408 173
  • RES tables size: ~2 TB
  • Unique number of event types: 932
  • Event handlers: 547

Benefits of RailsEventStore

Implementation of event store, and in more general a event centric approach, has enabled Billetto team to embrace asynchronous processing, changed the way of thinking about building the monolithic system and allowed improvements in several areas of the application.

improved performance as significant part of data processing is handled asynchronously
results in faster responses to web requests and allowed much higher requests / second processed concurrently
audit log of user's actions
by storing facts (domain events) for each change in the system state - allowing not only to debug what happened in this distributed asynchronous system but also business analysis of system state & users behaviour
simpler & less fragile integration with 3rd party systems
allowing the app to operate when some of them are not responding or even automatically switch to fallback system when the primary one is experiencing issues (i.e. payment processors)
internal & external read models
optimised for reads and build asynchronously (with eventual consistency) that allowed tracking of complex calculations results and business metrics almost in real time without additional use on transactional database
improved resilience to errors,
automatic errors handling mechanisms (i.e. retry with exponential backoff)