- Отправка сообщения пользователю (метод /dialog/{user_id}/send из спецификации)
- Получение диалога между двумя пользователями (метод /dialog/{user_id}/list из спецификации)
- Обеспечить горизонтальное масштабирование хранилищ на запись с помощью шардинга.
- Предусмотреть: Возможность решардинга
-
в ходе выполнения работы написан микросервис диалогов
-
подключены прометеус и графана для просмотра метрик приложения
-
реализован алгоритм консистентного хэширования, который размазывает данные по шардам
- данный подход поможет реализовывать решардинг с меньшими потерями, в отличие от определения через обычное хэширование
-
в качестве проверки было имплементировано 2 "шарда"
-
реализованы 3 ручки
- создание диалога
[POST] localhost:8070/dialog
- создание сообщения
[POST] localhost:8070/dialog/send
- получение сообщений в диалоге
[GET] localhost:8070/dialog/{dialogId}/list
- создание диалога
-
ключом шардинга является
dialogID
потому что следует держать все сообщения для одного диалога в одном и том же шарде -
можно было бы сделать размазывание по
dialogID
и времени написания сообщения, но хотелось сделать самописное решение, которое сможет хотя бы базово работать с шардированием -
в качестве продового решения стоит использовать ydb. (ну или монгу, если хочется Nosql решения)
- данные инструменты из коробки позволяют использовать шардирование, причем без даунтайма
-
в моем решении самым простым решением шардирования без даунтайма может быть следующее:
- создаем N подов с приложением и катим туда новую версию.
- создаем копию шардов + новые шарды и решардируемся уже в нее
- отключаем запись в старой версии и катим решардинг одновременно с этим изменением
- возможны аномалии и разъезд стейта, на старых данных
- это достаточно коряво ;) поэтому стоит сразу использовать надстройки над постгрей (не самописные), которые знают в каком шарде сейчас лежат данные.
- склонировать данный репозиторий и поднять его с помощью команды
make rebuild
- склонировать cервис диалогов и поднять его с помощью команды
make rebuild
- зарегистрироваться в ручке
/user/register
(для проверки будет достаточно двух пользователей). - залогиниться и получить свой токен для авторизации для обоих пользователей (в каждом последующем запросе его передавать в заголовке
Authorization
). - создать диалог
[POST] localhost:8070/dialog
(в ручке сервиса диалогов) или в[POST] localhost:8080/dialog
. - отправить сообщение в диалог
[POST] localhost:8070/dialog/send
(в ручке сервиса диалогов) или в[POST] localhost:8080/dialog/send
. - получить все сообщения в диалоге
[GET] localhost:8070/dialog/{dialogId}/list
(в ручке сервиса диалогов) или в[GET] localhost:8080/dialog/{dialogId}/list
. - все необходимые ручки есть в постман коллекции. В работе можно использовать ручки в коллекции
8th hw http collection
.
Логи:
2024-07-05T18:19:08.561Z INFO servers/http.go:146 http request: localhost:8070/dialog/dlgd5f0c5434208b46a98cbfdcf0ea06798f/list
2024-07-05T18:19:08.577Z INFO sharder/core.go:75 get shard: second_shard
2024-07-05T18:18:53.019Z INFO servers/http.go:146 http request: localhost:8070/dialog
2024-07-05T18:18:53.044Z INFO sharder/core.go:75 get shard: first_shard
2024-07-05T18:57:16.406Z INFO servers/http.go:146 http request: localhost:8070/dialog/send
2024-07-05T18:57:16.465Z INFO sharder/core.go:75 get shard: second_shard
- из логов видно, что запросы размазываются по разным шардам и все методы работают корректно