Р
Разработка Riseonly
@nicsbar345 подп.
179просмотров
51.9%от подписчиков
15 февраля 2026 г.
Score: 197
--------- Превью ссылок и зачем отдельный микросервис: В сообщениях люди кидают ссылки, и хочется показывать карточку с заголовком, описанием и картинкой страницы. Но чтобы это сделать, наш сервер должен сходить по ссылке, скачать HTML, вытащить оттуда og:title, og:description, og:image. Сайты бывают медленные, глючные, плюс надо защищаться от SSRF чтобы по ссылке не попросили сходить на внутренний адрес. Если бы мы делали это прямо в момент отправки сообщения, юзер бы ждал несколько секунд пока мы качаем чужую страницу, и это ужас. Поэтому вынесли в отдельный link-preview-service на Rust. create_message просто пишет сообщение в БД и кидает задачу в Nats, ответ клиенту сразу, сообщение улетело. В фоне воркер забирает задачу, смотрит может эту ссылку мы уже качали (кэш по link_hash, одна ссылка в десяти сообщениях один фетч), если нет проверяем URL на SSRF, качаем с таймаутом и лимитом размера, парсим og-теги, сохраняем в Redis и Scylla. Потом обновляем у сообщения has_preview и шлём всем в чате событие link_preview_ready. На мобилке список обновляется и карточка появляется без перезапроса. При редактировании или удалении сообщения связи с ссылкой чистим. Ещё есть отдельный метод get_link_preview для админки или когда хочешь превью до отправки. В общем решение правильное и не блокирует юзера. --------- Уведомления от чатов на реакции и упоминания: notify-service подписан на user.events. Приходит message_created смотрим кому слать, не замьючен ли чат, формируем заголовок и тело пуша. В личке имя отправителя и текст, в группе название чата и "Имя: текст". При медиа можем добавить ссылку на превью в пуш. reaction_added обрабатываем, пушим автору "Имя отреагировал(а) 👍". Под упоминания всё тоже готово --------- Остальные системы: Бля так как времени прошло много давайте я просто напишу методы которые я сделал за это время, а дальше сами додумаете зачем это нужно авххвах потому что иначе пост будет слишком большим: ForwardMessages, GetMediaMessages, GetFavMessages, GetFileMessages, GetMusicMessages, GetAudioMessages, GetShortVideoMessages, GetGifMessages, GetLinkMessages, GetMessagesHistory, MarkAllMessagesAsRead, GetMessageReadUsers, MarkMessageAsViewed ================ Mobile: Обновы: Куча баг фиксов, новые экраны и компоненты. Давайте лучше расскажу о самом главном что реально меняет процесс разработки и использование чатов. Моки в Debugger UI: Проблема знакомая: бэкенд лежит, нет интернета, или нужны стабильные данные чтобы не зависеть от сервера. В дебаггере сделал вкладку Mock рядом с Fetches, Cache, Logger. Включаешь режим моков, и mobxSaiWs при запросе с id сначала смотрит в mockCache, если есть сохранённый ответ подставляет его сразу, onSuccess с этими данными, на сервер не идём. Список всех моков на вкладке из localStorage по ключам ws_mock_*, можно удалить, скопировать, очистить всё. Самое афигенное это экспорт и загрузка из конфига. Экспорт собирает все моки в один JSON в буфер, вставляешь в MOCK_CACHE в core/config/mock.ts. Наловил с сервера или накидал руками, экспортнул, и при следующем запуске или по кнопке "Загрузить из config" они подтянутся. То что уже есть в localStorage и не из конфига не трогается, слияние. В репе общий набор моков, будущая команда тянет и у всех одинаковая база. В истории запросов ответы из мока помечены тегом MOCK чтобы было видно что это не с сервера. Теперь разрабатывать без бэка или с нестабильным бэком в разы удобнее.
179
просмотров
3437
символов
Нет
эмодзи
Нет
медиа

Другие посты @nicsbar

Все посты канала →
--------- Превью ссылок и зачем отдельный микросервис: В соо — @nicsbar | PostSniper