Проектируем соцсеть (задача с собеса)

Поділитися
Вставка
  • Опубліковано 8 вер 2024
  • Задача на system design
    UPDATE: Файлы нужно хранить в распределенном файловом хранилище, а не в базе данных.
    Телеграм канал t.me/roadofbug...
    Блог на бусти boosty.to/road...

КОМЕНТАРІ • 25

  • @SinX
    @SinX Місяць тому +5

    Спасибо за видео!
    Есть несколько вопросов/уточнений:
    1. Фотографии нужно хранить в Object Storage (S3, например)
    2. Откуда в БД подписок будет ID ленты?
    3. Для БД подписок лучше использовать, например, GraphDB, чтобы быстрее находить связи между подписками
    4. Нет Load Balancer, это самое первое, что нужно нарисовать на собеседованиях
    5. Нет CDN для фотографий
    6. Нет какой-то логики генерации лент, если у человека действительно много подспичиков
    7. Лучше изначально использовать реляционные базы данных

    • @roadofbugs
      @roadofbugs  Місяць тому +1

      Привет.
      1. Думал об этом. Не смог объяснить, чем это лучше любой распределенной документной БД.
      2. ID ленты = ID юзера. Например, юзер с ID=123 подписался на 10 других юзеров. В ленте с ID=123 будет поток событий от этих 10 юзеров.
      3. В задаче нет нужды обрабатывать граф связей и находить, например, подписчиков подписчиков. Если бы такая нужда была, то, конечно, графовая БД подошла бы. Но сходу такой необходимости не увидел.
      4. Согласен с замечанием.
      5. Согласен с замечанием.
      6. Логика описана в видео. Ленты обновляются асинхронно. Конфликтов обновления нет, так как топик событий лент партицирован по ID ленты. То есть, все события обновления ленты приходят в один consumer.
      7. Реляционная БД будет ограничивать масштабирование в части записи. Нагрузка по части записи высокая, как раз в сервисе лент.

    • @SinX
      @SinX Місяць тому +1

      "Реляционная БД будет ограничивать масштабирование в части записи. Нагрузка по части записи высокая, как раз в сервисе лент."
      Для собесов лучше использовать реляционные с ремаркой, что если мы достигнем потолка в этом типе СУБД, то перейти на NoSQL решения, т.к. у него есть свои минусы и плюсы, если конечно не хочешь сразу отвечать, а почему NoSQL? :)
      "ID ленты = ID юзера. Например, юзер с ID=123 подписался на 10 других юзеров. В ленте с ID=123 будет поток событий от этих 10 юзеров."
      К сожалению, я всё равно до конца не понял концепцию, т.к. нам нужно обновлять ленту не того пользователя, который запостил фотку, а ленты всех его подписчиков и тут как раз нужна графовая БД. И как раз про алгоритм, что иногда нет смысла обновлять все ленты всех подписчиков, можно ограничиться, например, 10% самых активных пользователей, а для остальных генерировать "на лету". Просто представьте, что пользователь с большим количеством подписок запостит 50 фото в течение 5-10 минут.
      "Думал об этом. Не смог объяснить, чем это лучше любой распределенной документной БД."
      Любой контент: фото, видео, аудио и т.д. должны храниться только в Object Storage, а в БД должны быть только ссылки на эти файлы

    • @nnz13
      @nnz13 Місяць тому

      ​@@SinXхранение файлов в БД уже выстрел в ногу 😂 сервис фотографий идюзера+идфайла, сервис ленты идюзера+идфайла, никого не смутило. Также я бы посмотрел на сценарий удаления или изменения файлы в ленте, думаю он будет очень веселым. Ну и главный вопрос: чем 3 масштабируемые монги лучше одной.

    • @Deciptikon
      @Deciptikon 26 днів тому

      @@roadofbugs
      2. В качестве самой примитивной возможности, да, ID ленты = ID юзера, но в перспективе можно заложить основу для нескольких лент для каждого пользователя (об этом и спрашивал человек как мне кажется, по типу премиум ленты, ленты со скрытым контентом если в будущем будут уровни подписки как например на бусти...).
      6. Здесь тоже "Логика описана в видео", на сколько я понял будет показываться, условно, 20 последних событий, но можно предусмотреть возможность ранжирования, исключения ранеепоказанного (если у вас 1000 подписок и вы всегда смотрите одно и тоже не добираясь до конца из-за того что сервис не определяет что вы уже видели, а что нет) и так далее... может быть увеличение вероятности показа в зависимости от статуса пользователя (сейчас все пользователи равны, но в перспективе при развитии проекта лучше иметь такую архитектуру изначально)
      Это не замечания, так как я не разработчик таких систем)))) скорее мои мысли как диванного эксперта

    • @Deciptikon
      @Deciptikon 26 днів тому

      @@nnz13 "хранение файлов в БД уже выстрел в ногу" - а как их надо хранить? (п.с. я не разработчик, поэтому понятия не имею, но интересно)

  • @ILMIX007
    @ILMIX007 26 днів тому +5

    Не хватает расчета нагрузки: количество клиентов, постов, запросов

  • @dr.pepper8399
    @dr.pepper8399 Місяць тому

    хорошее видео, спасибо!

  • @kgb9742
    @kgb9742 Місяць тому +1

    Сколько лет у вас опыт разработки, если не секрет?

  • @nnz13
    @nnz13 Місяць тому +2

    А если я подписался на юзера вот только что, тогда я не увижу его старые записи, потому что меня не было в сервисе подписок на него?
    И еще вопрос: если у юзера миллион подписчиков, то 1 его фотка сгенерит миллион записей в такой архитектуре?

    • @user-rs3lv9yc1g
      @user-rs3lv9yc1g 24 дні тому +2

      В предложенной архитектуре - да.
      А какова альтернатива?
      Не хранить, а генерировать ленты при каждом ображении каждого юзера за лентой? Нагрузка побольше будет на систему, имхо

    • @gradovvladimir4315
      @gradovvladimir4315 18 днів тому

      ​@@user-rs3lv9yc1g, а что такое лента? Это просто выборка из таблицы событий, отфильтрованная по ид юзера. Большинство SQL баз данных отлично справляются с такими запросами.
      Все эти навороты с MongoDB и Kafka только на собеседованиях прикольно выглядят.
      В реальности PostgreSQL+Redis за глаза хватает для подобных систем

  • @kolyastark3320
    @kolyastark3320 Місяць тому +2

    а как называется программа для создания схемы соцсети ?

  • @politlab1
    @politlab1 Місяць тому +1

    Базы данных лучше не виртуализировать, насколько мне известно.

    • @denyskovzikov1034
      @denyskovzikov1034 Місяць тому +1

      Интересная мысль👍, а почему так? Было бы интересно узнать🤔

    • @Mytest437
      @Mytest437 Місяць тому +2

      Их не надо в Docker запихивать или другие контейнеры. А вот без виртуальных машин не обойтись в ЦОДах и Cloud -> там все виртуализировало 🙂 Ну или использовать их платформы-хранилища.

    • @denyskovzikov1034
      @denyskovzikov1034 Місяць тому +1

      @@Mytest437 Да я понял, ты просто продублировал его коментарий. Я же спросил почему так? Никогда не слышал такого вот и интересуюсь почему?

    • @Mytest437
      @Mytest437 Місяць тому

      @@denyskovzikov1034 Тема в принципе холиварная. Но несколько причин почему не стоит именно долгосрочную информацию там сохранять:
      - драйверы управления сохранением данных считаются до сих пор не такие надежные у контейнеров, чем у компьютерных машин, даже виртуальных.
      - контейнеры изначально не задумывались как полноценная замена виртуальной машины. Это скорее узел в распределенной среде, где контейнеры как элементы Лего, легко можно поднимать/запускать/вынимать/разрушать и вместо ставить новый, если старый завис или вышел из строя. За счет контейнеров можно универсально поднимать много одинаковых нод и балансировать нагрузку больших распределенных приложений. То есть это контейнер с программным кодом, который легко поднять как сервер и легко утилизировать, если он не нужен. И хранить в таких динамичных контейнерах долгосрочную информацию опасно, чтоб не попрощаться с ней) Плюс если мы говорим о распределенном приложении, то база данных общая и не должна принадлежать одной ноде. Ноды только как канал обработки вытягивают/обрабатывают и складывают обратно в базу инфу.
      - на сколько я знаю, если нода Docker вышла из строя, вытянуть от туда нужные файлы или базы уже достаточно проблематично.

    • @user-lt7rn4of7y
      @user-lt7rn4of7y 20 днів тому

      @@denyskovzikov1034 потому что любая виртуализация это лишний слой общения с железом. Современная бд, оптимизирована на прямое общение с диском (особенно если это hdd). Плюс представь контейнер размером несколько терабайт, где 99.999% его размера это данные, которые просто так не извлечешь, нужно запустить контейнер. Перенести его просто тоже не получится.

  • @user-mj6pp5un8k
    @user-mj6pp5un8k Місяць тому

    Балансировщика не хватает

    • @206-3
      @206-3 21 день тому +1

      Думаю Api (http) может быть как прокси так и балансировщиком