Skip to main content

redis_streams_event_sourcing

🚂 Implement Event Sourcing with Redis Streams​

Leverage Redis Streams to build an append-only event log in Rails, capturing every domain change in a scalable, fault‑tolerant way. By pushing events to a named stream, you can replay, audit, or project state into read models.

# app/models/order_event.rb
class OrderEvent
STREAM_KEY = "orders:events"

def self.publish(event_type, payload)
Redis.current.xadd(
STREAM_KEY,
{ type: event_type, data: payload.to_json, timestamp: Time.now.to_f }
)
end
end

# Usage in controller or service
OrderEvent.publish('order_created', { id: order.id, total: order.total })

# Consumer example
Redis.current.xread({ Stream: OrderEvent::STREAM_KEY, count: 100, block: 1_000 }) do |stream, events|
events.each do |id, fields|
data = JSON.parse(fields['data'])
# project into read model or handle side effect
end
end