Пишу свой дискорд с блекджеком и шлюхами #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-сервера - набросал постик.
Всем чмоки

2020
55 комментариев

Ты уверен что на нужный сайт запостил?

1
Ответить
Автор

Да, нормас. Хабр для душнил, тж давно помер. Куда еще постить? :D

13
Ответить

Можно клиент без джаваскрипта, желательно что-нибудь нативное или хотя бы компилируемое?

4
Ответить
Автор

Сами разберете обмен, сами напишете альтернативный клиент. Кто я такой чтобы мешать людям развлекаться? :D

Ответить

Комментарий недоступен

Ответить

Сначала хотел спросить зачем КХ, а потом посмотрел, что его используют для всего. У меня с ним ассоциации в первую очередь с аналитикой, не для хранения/чтения данных под сервис.

4
Ответить

там от вк уже аналоговнет выкатили =D

1
Ответить