You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: questions.md
+138Lines changed: 138 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -5374,6 +5374,144 @@ USING — это сокращённая запись условия, полез
5374
5374
5375
5375
Еще есть cross join - декартово произведение.
5376
5376
5377
+
# Дизайн-интервью
5378
+
5379
+
[Как задизайнить Facebook за пол часа или секреты System Design Interview / Алексей Петров](https://www.youtube.com/watch?v=Be7INI_U6GY)
5380
+
5381
+
Тема очень обширная, поэтому этот раздел следует воспринимать как чеклист для его прохождения.
5382
+
5383
+
## План интервью
5384
+
5385
+
Будем считать что тайм-слот интервью - 40 минут.
5386
+
5387
+
1. Уточнить требования и ограничения (4 минуты)
5388
+
2. Сделать эстимейты проектируемой системы (пропускная способность, сколько нужно хранить информации, количество серверов и т.д.) (3 минуты)
5389
+
3. System interface - какие сервисы предоставляет система, какие сервисы использует система (3 минуты)
5390
+
4. System high-level design - какие компоненты входят в систему, как они взаимодействуют друг с другом (5 минут)
5391
+
5. Component detailed design - какие компоненты входят в систему, как они взаимодействуют друг с другом. Описать возможные ботлнеки (15 минут)
5392
+
6. Масштабирование - как система будет масштабироваться (5 минут)
5393
+
7. Summary - общий обзор и презентация решения (5 минут)
5394
+
5395
+
## 1. Сбор требований
5396
+
5397
+
Собираем ответы на вопросы "Что система делает?" и "Какой должна быть система?"
5398
+
5399
+
Примеры вопросов:
5400
+
5401
+
- Это должна быть глобальная система или региональная?
5402
+
- Как быстро система должна реагировать на внесенные изменения (latency)?
5403
+
- Какая должна быть доступность системы (availability)?
5404
+
- Сколько у нас пользователей активно ежедневно?
5405
+
- Сколько пользователи генерируют трафика ежедневно (количество постов, публикаций и тд)?
5406
+
- Какое количество информации пользователь просматривает каждый день?
5407
+
5408
+
Если нам предлагают спроектировать систему по примеру существующей (twitter, facebook, google docs, etc), то мы можем спросить:
5409
+
- Какую часть системы мы проектируем?
5410
+
- Какие именно функции должны быть реализованы?
5411
+
5412
+
Сразу формируем для себя чек-лист требований, чтобы не забыть что-то важное.
5413
+
Например нам предложили спроектировать Facebook с такими требованиями:
5414
+
5415
+
- Дизайним ленту новостей (news feed) фейсбука
5416
+
- Фото/видео не реализуем
5417
+
- Ранжирование постов не нужно, хронологический порядок
5418
+
- Встраиваем реламу в ленту (желательно)
5419
+
- Глобальная система (multi-region)
5420
+
- Latency (внутри региона) < 1s
5421
+
- Latency (между регионами) < 60s
5422
+
- Durability (постоянство данных) очень важно
5423
+
- Availability (доступность) менее важно
5424
+
- Миллиард пользователей
5425
+
- 10 миллионов постов в день
5426
+
- 500 друзей в среднем
5427
+
- 5 просмотров фида на пользователя в день
5428
+
5429
+
## 2. Эстимейты
5430
+
5431
+
Чтобы посчитать эстимейты нужно примерно представить какой тип информации сколько весит.
5432
+
5433
+
Хранение информации:
5434
+
- Символ - 1 байт
5435
+
- Метаданные (строка в базе, вес поста, etc) - 5-10 килобайт
5436
+
- 1080p изображение - 2 мегабайта
5437
+
- 1080p видео (минута) - 30 мегабайт
5438
+
5439
+
Сервера:
5440
+
- Дисковое пространство - 10 терабайт
5441
+
- RAM - 256-512 гигабайт
5442
+
5443
+
Итого считаем эстимейты для примера с фейсбуком:
5444
+
- Read-write ratio - 5B / 10M = 500:1
5445
+
- RPS
5446
+
- Read: 5B / (24 * 60 * 60) = ~58k rps
5447
+
- Write: 10M / (24 * 60 * 60) = ~115 rps
5448
+
- Storage:
5449
+
- 10KB * 10M = 100GB ежедневно
5450
+
- 30 * 100GB = 3TB ежемесячно
5451
+
- Пропускная способность:
5452
+
- Read: 5B * 20 постов * 10KB = 1PB ежедневно
5453
+
- Write: 10M * 10KB = 100GB ежедневно
5454
+
5455
+
PS. RPS мы посчитали "постоянный", в пиках он может увеличиваться в 10 раз (условно)
5456
+
5457
+
## 3. API
5458
+
5459
+
Описываем максимально просто - какие методы будут доступны, какие параметры будут принимать.
5460
+
5461
+
## 4. High-level design
5462
+
5463
+
Не стоит называть какие-то конкретные технологии, а просто описывать какие компоненты будут в системе и как они будут взаимодействовать.
5464
+
Ну тоесть не нужно прям называть Nginx, а просто описать что будет балансировщик нагрузки.
5465
+
5466
+
- Если ставим лоад-балансер, то какой? (Round-robin, sticky sessions, etc)
5467
+
- Если БД, то какая? (RDBMS, NoSQL, inmemory etc)
5468
+
5469
+
## 5. Detailed design
5470
+
5471
+
- Описываем схему БД и запросы к ней (можем прям примеры запросов писать)
5472
+
- Перебираем подходы по обработке данных (pros/cons)
5473
+
- Выбираем решения и объясняем их tradeoffs
5474
+
- Проверяем требования (список который мы составили на шаге 1)
5475
+
- Определить edge cases (если они есть)
5476
+
5477
+
### Performance mantras
5478
+
5479
+
В процессе, если мы сталкиваемся с проблемой производительности, то мы можем применять следующие [мантры](https://www.brendangregg.com/methodology.html):
5480
+
- Не делай этого
5481
+
- Делай, но только один раз
5482
+
- Делай это реже
5483
+
- Сделай это позже
5484
+
- Сделай пока пользователь этого не видит
5485
+
- Сделай это параллельно
5486
+
- Сделай это дешевле
5487
+
5488
+
## 6. Масштабирование
5489
+
5490
+
Если говорим про шардирование, то сразу оговариаем какой ключ шардирования выбираем.
5491
+
5492
+
### Performance bottlenecks
5493
+
5494
+
В зависимости от количества пользователей нам может понадобиться разные инфраструктурные решения:
5495
+
5496
+
- 1000 пользователей
5497
+
- 1 сервер
5498
+
- 1 БД
5499
+
- 10 000 пользователей
5500
+
- Read replicas
5501
+
- Несколько серверов
5502
+
- Load balancer(s)
5503
+
- 100 000 пользователей
5504
+
- Message queue
5505
+
- Rate limits
5506
+
- Cache
5507
+
- CDN
5508
+
- 1 000 000 пользователей
5509
+
- Stateless services (если они еще не такие)
5510
+
- Возможно появится noSQL (если еще не использовался)
5511
+
- Database sharding
5512
+
- 1 000 000 000 пользователей
5513
+
- Regional DCs
5514
+
5377
5515
# Вопросы работодателю
5378
5516
5379
5517
-[Вопросы не мальчика, а джуна. 22 вопроса работодателю на собеседовании на позицию «Middle Python-разработчик»](https://habr.com/ru/post/428283/)
0 commit comments