Skip to content
← Back to selected work
Project Case Study

Snappio Backend

Django Channels backend combining WebSocket messaging, Redis, and PostgreSQL persistence.

Problem

A social/chat backend has to combine realtime messaging with durable API state so conversations are interactive without treating all data as temporary socket traffic.

Constraints

  • Use WebSockets for realtime messaging while keeping durable records in PostgreSQL-backed API flows.
  • Stay within the Django ecosystem through Django REST and Django Channels.
  • Keep Redis as realtime infrastructure rather than the primary record of user-facing data.

Architecture

Django REST owns durable resources, Django Channels handles WebSocket traffic, Redis supports realtime channel infrastructure, and PostgreSQL remains the persistence layer.

01

Client app

02

Django REST endpoints

03

Django Channels consumers

04

Redis channel layer

05

PostgreSQL database

06

Swagger API documentation

Client uses REST endpoints for durable resources and documented API flows

Client opens WebSocket connections for chat-style updates

Channels consumers coordinate realtime events through Redis

Durable state is persisted through PostgreSQL-backed Django models

Swagger exposes the REST API surface for inspection and integration

Tradeoffs

  • Django Channels keeps realtime work close to the REST API, but WebSocket behavior still needs separate operational thinking.
  • PostgreSQL persistence protects durable state, but chat workloads need careful transaction and delivery semantics.
  • Redis is useful for channel infrastructure, but it should not be treated as the only source of message truth.

Failure modes

  • WebSocket disconnects can leave clients with stale conversation state unless reconnect behavior is deliberate.
  • Realtime delivery and database persistence can disagree if message writes and broadcasts are not ordered carefully.
  • Redis or worker availability can affect realtime updates even when REST endpoints remain reachable.

What I would improve next

  • Define message acknowledgement and reconnect behavior in the API documentation.
  • Add health checks that separate REST availability from realtime channel availability.
  • Make persistence-versus-delivery ordering explicit in tests and documentation.