Вопрос с собеседования · System design

Пользователь публикует комментарий и должен сразу видеть его в ленте, а остальным допустима задержка в несколько секунд. Какие гарантии согласованности вы заложите и как это реализуете?

MiddleCAP и согласованность
Ещё спрашивают так:
  • Как показать пользователю его комментарий сразу?
Коротко

Требование несимметрично: автору — чтение своих записей, остальным — согласованность в конечном счёте. Линеаризуемость на всех чтениях ленты не нужна и дорога.

  • Чтения автора — на лидера в течение окна после записи
  • Или ожидание версии: реплика отвечает, догнав позицию записи
  • Или показать комментарий из ответа на запись, не перечитывая

А ещё Для мультирегиональной аудитории — особенно важно не ходить к лидеру на каждое чтение

Подробно

Сначала стоит явно сказать, что требование продукта здесь несимметрично: автору нужна гарантия чтения собственных записей, всем прочим достаточно согласованности в конечном счёте. Это важно, потому что линеаризуемость на всех чтениях ленты стоила бы обращения к лидеру или кворуму на каждый запрос, а при мультирегиональной аудитории — межконтинентального обмена на каждое открытие страницы. Реализаций несколько. Простейшая — в течение нескольких секунд после записи направлять чтения этого пользователя на лидера, что стоит небольшого роста нагрузки на него. Более точная — возвращать клиенту версию или позицию журнала после записи и передавать её в последующих запросах, чтобы реплика при необходимости дождалась этой позиции. Дополнительно полезно монотонное чтение — привязка сессии к одной реплике, чтобы лента не «прыгала» назад при обновлении страницы. В интерфейсе комментарий показывают оптимистично сразу после подтверждения записи. В эксплуатации обязателен контроль репликационного лага во времени, а при его росте — временное переключение чтений на лидера.

Что хотят услышать

  • Разделение гарантий для автора и остальных.
  • Способы реализации read-your-writes.
  • Почему не линеаризуемость для всех.

Частые ошибки

  • Предлагать строгую согласованность там, где достаточно сессионной гарантии.
  • Забыть про монотонное чтение и получить исчезающий при обновлении страницы комментарий.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Линеаризуемость для всех чтений ленты, чтобы все видели одно и то же
  • ✓Автору — свои записи сразу, другим — с задержкой
  • ✗Только согласованность в конечном счёте для всех, автор подождёт несколько секунд, как и остальные читатели
  • ✗Синхронная репликация на все реплики перед ответом на любую запись

Что спросят дальше

  • Как изменится решение, если пользователи распределены по нескольким регионам?
  • Что произойдёт при росте репликационного лага и как это заметить?

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования