Важно помнить, что реализации «чата» обычно транслируют фактическое содержимое подписчикам.
В Discourse у нас довольно сложный конвейер, из-за которого наивная реализация становится сложной и приводит к большому объему трафика.
- Пользователь публикует ответ.
- Все пользователи, просматривающие тему, узнают через трансляцию о новом содержимом.
- Все пользователи запрашивают содержимое поста у сервера (100 зрителей = 100 запросов).
- Мы загружаем изображения и оптимизируем их.
- Все пользователи, просматривающие тему, узнают через трансляцию о новом содержимом.
- Все пользователи запрашивают содержимое поста у сервера (100 зрителей = 100 запросов).
(у нас есть различные оптимизации, ограничения скорости, повторные попытки и так далее, но суть именно в этом).
Все эти запросы должны проходить через наш конвейер безопасности, чтобы убедиться, что у пользователя есть права на просмотр поста и так далее.
Если бы содержимое было коротким, и мы каким-то образом могли бы реализовать безопасность более легким способом для «быстрой полосы», то мы могли бы распространять сообщения чата через трансляцию. Это привело бы к значительно лучшей производительности: с такой архитектурой мы, вероятно, смогли бы обрабатывать 10 000 пользователей на одном недорогом Droplet DigitalOcean с 2 ГБ памяти.
Безопасность — очень сложная задача. Кэширование также сложно из-за проблем с инвалидацией кэша.
Так что да, мы определенно думаем над этой проблемой. Но на данный момент…
Много авторизованных зрителей в одной теме + много нового содержимого в одной теме = дорогие счета за сервер.