Pulse
Чат и социальная платформа в реальном времени. WebSocket для доставки, Redis Pub/Sub для рассылки между процессами и асинхронный FastAPI под всем этим.
Почему Pub/Sub, а не просто WebSocket
Один сервер может держать все открытые сокеты в памяти и доставить сообщение, найдя получателя. Это работает ровно до второго сервера. Отправитель подключён к одному, получатель — к другому, и сообщение не доходит никуда.
Redis Pub/Sub это решает: сервер публикует в канал, каждый подписанный на канал сервер это получает, и каждый доставляет тем сокетам, которые держит сам. Приложению перестаёт быть важно, на какой процесс попал пользователь — а это то свойство, без которого нельзя запустить больше одного.
Остальной стек
Бэкенд — FastAPI с асинхронной SQLAlchemy 2 и миграциями Alembic, чтобы обращения к базе не блокировали event loop, в котором живут сокеты. Загрузки уходят в MinIO по S3 API, то есть тот же код работает с S3 в продакшене без переписывания. Долгие задачи выполняются в воркере ARQ, а не внутри запроса.
Фронтенд — React 19 на Vite и TypeScript, TanStack Query для серверного состояния и Zustand для локального.
Весь стек поднимается через Docker Compose — вместе с Postgres, Redis, MinIO и локальным перехватчиком почты, — так что свежий клон запускается одной командой.