Сервис работает на двадцати инстансах. Добавление ещё десяти не уменьшает время ответа. Как вы будете искать причину и что предпримете?
- Почему новые экземпляры не ускорили сервис?
Ограничение не в приложении: нужно разложить время запроса и найти насыщенный общий ресурс — чаще всего база или пул соединений.
- Трассировка показывает, где время: CPU, ожидание базы, внешние вызовы, очередь за соединением
- Общие ограничения: пул, единственный лидер записи, глобальная блокировка, строка-счётчик, квота внешнего API
- Исправлять узкое место: запросы, кэш, реплики, шардирование, разбиение счётчиков
А ещё Закон Амдала: последовательная часть ограничивает ускорение
Подробно
Начинать нужно с измерения, а не с гипотез: по трассировке видно, где проведено время — в процессоре приложения, в ожидании базы, во внешних вызовах или в очереди на получение соединения из пула. Если время уходит на ожидание, добавление инстансов бесполезно по определению. Дальше ищем разделяемое ограничение: полностью занятый пул соединений при низкой загрузке процессора, единственный лидер записи, глобальная блокировка или строка-счётчик, которую обновляют все, квота внешнего API. Полезно назвать и общий принцип: последовательная часть работы задаёт потолок ускорения, а координация между узлами способна дать отрицательную отдачу — тридцать инстансов открывают в полтора раза больше соединений и могут ухудшить положение базы. Дальше действуем по найденной причине: убрать запросы в цикле и добавить индексы, включить пакетную обработку, поставить кэш, развести чтения по репликам, при упоре в запись — шардировать, а число соединений ограничить пулером. И обязательно назвать метрику, по которой станет видно, что помогло: задержка на девяносто девятом перцентиле и насыщение пулов, а не средняя загрузка процессора.
Что хотят услышать
- Измерение до гипотез.
- Поиск общего насыщенного ресурса с примерами.
- Меры против конкретного узкого места.
Частые ошибки
- Добавлять инстансы, не измерив, где проведено время запроса.
- Смотреть на утилизацию процессора вместо насыщения пулов и очередей.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Добавить ещё двадцать инстансов и включить автомасштабирование
- ✗Поднять размер кучи и число потоков на каждом инстансе приложения, так как упирается сам код сервиса
- ✓Искать общий насыщенный ресурс
- ✗Заменить балансировщик на более быстрый и перейти на HTTP/2
Что спросят дальше
- Почему при приближении утилизации к ста процентам задержка растёт нелинейно?
- В каком порядке вы будете применять кэш, реплики и шардинг?
Разбор темы
- Масштабирование
Что именно упирается, вертикальный и горизонтальный рост, stateless и балансировка, шардинг и consistent hashing, реплики на чтение и лаг, автоскейл и поиск настоящего узкого места.
Связанные вопросы
- Сервер приложений загружен на 30% по CPU, но задержки растут, а пул соединений к базе занят полностью. Что даст добавление ещё нескольких серверов приложений? Middle
- Почему удвоение числа серверов не удваивает пропускную способность? Senior
- Зачем нужен пул соединений к базе и как выбрать его размер? Middle
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.