Пишу свой дискорд с блекджеком и шлюхами #1
Ай здорова. На волне запретов я подумал, а почему бы не написать свою вариацию дискордика.Ну, поехали. Дано: неуемное желание заниматься хуйней и неопределенные компетенции в разработке. Собственно, чо я хочу получить в итоге - я хочу получить дискорд, но с возможностью использования локальных серверов (немного позднее)
Накидываем решение
Разберем чо и кто зачем:
Клиент – приложение на ElectronJS+React.JS или webview-приложение на андроиде, или просто фронтенд-приложение на React.JS. Нет необходимости собирать отдельные версии приложения, переиспользуемость максимальная.
Coturn – это STUN/TURN сервер. Штука. Которая поможет нашим клиентам подключится друг к другу, а если это невозможно – то проксирует трафик через себя.
ALB и NLB – Application Load Balancer и Network Load Balancer. ALB будем использовать для того, чтобы маршрутизировать трафик до кластера Minio и иметь возможность масштабирования – LoadBalancer предоставит провайдер облачных услуг. NLB необходимо использовать, так как использование webrtc требует наличия UDP-соединения. Через ALB этот трафик просто не обработать.
Rabbitmq – сервис очередей. Это специальная база данных, которая ориентирована на прием данных и их передачу. Например, когда приходит очень много сообщений – именно Rabbitmq примет удар и позволит сервису сообщений или clickhouse спокойно обработать сообщения, пусть и не в реальном времени. А также количество неотвеченных сообщений в очереди – это очень емкая метрика, которая показывает текущую фактическую нагрузку в системе.
Gateway – сервис трансляции http-запросов в сообщения в определенные очереди в RabbitMQ. Почему так? Почему нельзя напрямую? Потому что так проще переваривать взрывные нагрузки. Потому что асинхронность и возможность масштабироваться любым сервисом или очередью. В энтерпрайзе используют Kafka.
Микросервисная архитектура подразумевает, что мы разделяем приложение на компоненты, которые будут выполнять операции с ограниченным набором сущностей (например, только мессаги или только каналы, или только сервера). Пока начнем с ограниченного набора микросервисов: - Сервис авторизации;
- Сервис пользователей;
- Сервис каналов;
- Сервис серверов.
Clickhouse – это база данных, в которой мы будем хранить огромные объемы сообщений (возможно). Она идеально подходит под вычитку большого количества данных за раз, и нормально переваривает вставку. Да, есть болячки, но я больше люблю Клик, чем Кассандру🤷♂ К тому же ничего не мешает смигрировать, если что.
Postgres возможно использовать для хранения ограниченного количества данных. Я прикинул – максимум 10 млн юзеров, нормально. Пойдет. Redis – для кеширования. Key-value база, которая позволяет быстро писать и быстро читать. И много.
Minio – масштабируемое S3-хранилище. Данных придется хранить прям дохрена. Надо сразу озаботиться.
Как пользаки коннектятся – да также как в дискорде. Пиринговое соединение (это когда пользак к пользаку коннектится), да релей в случае невозможности соединения напрямую.
В целом выглядит несложно.
Накидываем PlantUML-диаграмму. Она плюс-минус приблизительная, уточнится она после тестирования гипотезов
Для начала я решил на одной VM развернуть инфру и потестить как это все будет работать в единой связке. Пока вот жду, пока домен делегируется на новые NS-сервера - набросал постик.
Всем чмоки