Концепции для успешного собеседования по проектированию системы

Это был обычный воскресный полдень. Бабушка, как обычно, отдыхала в кресле с откидной спинкой и баловалась своим любимым домашним печеньем.

В течение многих лет Мэри была нашим дружелюбным поставщиком печенья по соседству. Ее печенье, хоть и аппетитное, было причиной ухудшения здоровья бабушки.

В энный раз бабушка попыталась завязать со мной разговор. Как всегда, все началось с

«Итак, внук, чем ты занимаешься в качестве инженера-программиста в компании, занимающейся электронной коммерцией?»

— Это вы выкладываете продукты?

«Узнаете ли вы из первых рук о последней рекламе файлов cookie?»

Я мельком взглянул на часы и пробормотал:

«Ну, сегодня у меня есть немного времени, давайте покончим с этим вопросом раз и навсегда».

Я осторожно отложил книгу, которую поглощал, и постепенно встретился взглядом с бабушкой.

«Привет, бабушка, позволь мне рассказать тебе сказку. Название начинается с…”

Интернет, одним словом.

Модель клиент-сервер

Помните веб-сайт famousamos.com, который вы просматриваете почти каждый день?

Как вы можете увидеть эти веб-страницы?

По сути, это файлы, написанные инженерами. Ваш браузер читает эти файлы и отображает их как привлекательные веб-страницы.

Возникает вопрос, учитывая бесконечное количество веб-контента, как ваш браузер хранит все эти файлы?

Это будет просто слишком много или почти невозможно.

Следовательно, когда вы кладете большой палец на кнопку обзора, ваш браузер запрашивает эти файлы с удаленного компьютера через Интернет.

Вы — клиент, а удаленные компьютеры — серверы. Это то, что мы называем моделью клиент-сервер.

Сетевой протокол

HTTP

Помните, ранее вы отправили свой заказ на печенье Мэри?

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

Это будет хаотично.

Следовательно, Мэри стандартизировала формат, или вы можете назвать это протоколом. Чтобы заказать файлы cookie, вам необходимо заполнить специальную форму и отправить ее через почтовый ящик.

HTTP работает аналогично — протокол или набор правил для отправки браузером запроса.

Когда ваш браузер отправляет HTTP-запрос, он соответствует предопределенным правилам HTTP. Это включает в себя наличие метода, пути, версии протокола, заголовка и тела запроса.

IP

После того, как вы заполнили форму, вам потребуется адрес перед отправкой, верно?

Аналогичным образом, чтобы отправить запрос на сервер, ваш браузер должен указать адрес сервера — IP-адрес. Это 128-битное число, похожее на 2001:db8:0:1234:0:567:8:1.

Номер порта

Если вы помните, Мэри живет в большом доме. Каждый день они получают множество писем. Помимо адреса вам также нужно будет указать получателя — Марию.

Сервер — это просто еще один компьютер, на котором одновременно запущено множество приложений, таких как Chrome, Paint и т. д. Каждое из этих приложений имеет номер порта.

Следовательно, при отправке запроса вы должны указать как IP-адрес сервера, так и номер порта приложения, на которое вы отправляете.

DNS

Бабушка: «Хммм, но я никогда не видела IP-адреса за всю свою жизнь».

Ты прав. Эти загадочно выглядящие термины слишком сложно запомнить. Именно здесь в игру вступает наш спаситель — DNS.

DNS – это сервер, который действует как телефонная книга. Он хранит все соответствующие IP-адреса и номера портов веб-сайтов.

Когда вы просматриваете www.famousamos.com, ваш браузер получает IP-адрес и номер порта сервера от DNS и отправляет запрос на указанный IP-адрес и номер порта после их получения.

Вот как ваш браузер взаимодействует с удаленным сервером!

А теперь, извините, можно мне одно печенье?

Вертикальное масштабирование против горизонтального масштабирования

Вертикальное масштабирование

По мере того, как дела идут лучше, Мэри принимает больше заказов. Точно так же сервер ежедневно получает множество запросов.

Как Мэри справляется с этими растущими заказами?

Она может работать больше часов, дней и ночей.

Это известно как вертикальное масштабирование.

Существует ограничение на количество одновременных запросов, которые может обработать компьютер. Вертикальное масштабирование означает добавление к серверу большего объема памяти, оперативной памяти и мощности ЦП, чтобы он мог выполнять больше работы и обрабатывать больше запросов.

Как вы можете сказать, это НЕ является устойчивым, поскольку бизнес продолжает расти. Существует предел того, насколько Мэри может «масштабироваться».

Горизонтальное масштабирование

К счастью, на помощь приходит горизонтальное масштабирование.

Вместо того, чтобы масштабировать себя, Мэри может масштабироваться горизонтально, нанимая больше работников! Каждый из этих работников будет работать вместе, чтобы обработать больше заказов.

Точно так же мы можем задействовать больше серверов для одновременной обработки большего количества входящих запросов, что также называется горизонтальным масштабированием.

Балансировщик нагрузки

Бабушка: «Если серверов больше, то к какому идет мой запрос?»

Фантастический вопрос!

Вопрос на миллион долларов: когда приходит запрос, как Мэри решает, кому передать запрос, чтобы каждый получил справедливую долю работы?

Она может либо

  • Распределять случайным образом
  • Распределять последовательно (Круговой алгоритм)
  • Распределяйте в зависимости от возможностей работников (в зависимости от веса, дайте им больше, если они могут справиться с большим объемом)
  • Распространение на основе вкуса файлов cookie (на основе пути)
  • Распространять на основе отправителя (User Hashing)

В этом случае Мэри выступает в роли балансировщика нагрузки.

Часто ваш запрос сначала попадает на сервер, который действует как балансировщик нагрузки. Затем балансировщик нагрузки направит запрос на сервер в зависимости от алгоритма.

Балансировщик нагрузки играет жизненно важную роль в предотвращении перегрузки и недостаточной загрузки серверов. Это гарантирует, что каждый сервер выполнит нужный объем работы.

Ограничение скорости

Живя по соседству так долго, вы должны знать, что Мэри и Паркер не ладят друг с другом.

Бабушка: «Да… Паркер планировал саботировать бизнес Мэри».

Да. Одна из возможных атак, которую может предпринять Паркер, — отправить множество недействительных запросов с неправильным видом. Хотя рабочие могут легко их идентифицировать, тем не менее, это истощает их пропускную способность.

Они будут заняты сканированием этих запросов, и у них не будет времени обрабатывать обычные. Клиенты в конечном итоге уйдут из-за длительного времени ожидания.

Это называется атакой отказа в обслуживании (DOS).

Злоумышленник отправляет на сервер большое количество одновременных пустых или недействительных запросов. Сервер будет зарезервирован и в конечном итоге будет отключен.

Ограничение скорости — это противоядие. Если пользователь отправляет несколько запросов за короткий промежуток времени, Мэри просто рассеивает их, не передавая рабочим процессам.

Серверы могут выполнять ограничение скорости, проверяя, отправляет ли пользователь большое количество запросов за короткий период. Кроме того, это можно сделать с помощью балансировщика нагрузки.

Микросервисы

На случай, если ты забудешь, Мэри нужен кто-нибудь, чтобы испечь печенье.

Конечно, она может оставить это рабочим. Они могут ввести заказ, броситься на кухню, испечь печенье, доставить его и вернуться на свое место.

Это много работы! И что? У вас есть предложение?

Да, ты прав. Мы можем разделить обязанности, наняв человека на каждую роль.

Каждый из них делает только ОДНУ вещь и делает это ХОРОШО.

Вот что такое микросервисы!

Например, приложение электронной коммерции часто содержит выделенный сервер для каждой из этих функций.

  • Обработка аутентификации
  • Выполнить платеж
  • Уведомить о доставке

Сервер, который принимает ваш запрос, выполняет только базовую предварительную обработку. Затем он направляет ваш запрос на соответствующий сервер для выполнения определенной задачи.

Система Pub-Sub/Очередь сообщений

По мере накопления заказов Мэри требует, чтобы эти процессы выполнялись одновременно при поступлении заказа.

  • Человек начинает месить тесто
  • Человек разогревает печь
  • Человек готовит пакет

Это означает, что работник, вводящий заказ, должен уведомить всех! Ему/ей нужно будет побегать, чтобы убедиться, что все получили сообщение.

Чтобы добавить что-то в болото, рабочий должен следить за тем, кого уведомлять по мере добавления новых параллельных процессов.

Как проницательная деловая женщина, Мэри добавила доску.

Работник добавляет заметку на доску, когда заказ сделан. Заинтересованные стороны, просто наблюдайте и извлекайте данные с доски.

Это известно как система pub-subтакже известная как очередь сообщений. Это важно для связи между микросервисами.

Например, когда пользователь оформляет заказ, сервер проверки должен уведомить

  • Сервер заказов для создания нового заказа
  • Стоковый сервер для уменьшения стока
  • Складской сервер для отправки товара

Все это следует делать одновременно.

При использовании сервера pub-sub серверу проверки НЕ нужно никого уведомлять. Он просто добавляет событие на сервер pub-sub, а заинтересованные стороны подписываются на него и получают соответствующие уведомления.

Кэширование

База данных

Держитесь, и мы скоро закончим!

Что ж, бабушка, я уверен, что ты сделала предварительный заказ печенья на следующие несколько месяцев. Мэри нужно где-то хранить эти предварительные заказы.

К счастью, она купила несколько полок и конструктивно хранит на них все эти записи.

Эти полки очень похожи на базы данныхпостоянное хранилище для серверов для сохранения данных и информации.

Когда дело доходит до баз данных, существует много технических тонкостей. Так как наше время сна не за горами, я пока пропущу это.

Кэширование

Пока Мэри и ее команда хранили все записи о заказах на полках, чтобы отслеживать их, обнаружилось новое узкое место.

При поступлении заказа работник на передовой должен будет

  • Обработать заказ
  • Добавьте заметку на доску
  • Бросьте на полки и включите его в записи

Бабушка: «Много народу будет бегать и толпиться у прилавков»

Точно! Время, потраченное впустую на беготню к полкам, можно использовать для обработки большего количества запросов. Более того, переполненность полок еще больше замедлит работу.

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

Базы данных хранят данные на жестком диске, и для их извлечения требуется время. Постоянные запросы к базам данных также будут нагружать сервер базы данных и замедлять работу.

Вот где в дело вступает кеширование. Оно хранит данные в памяти сервера (ОЗУ). Это быстрее, но также нестабильно. Если сервер выйдет из строя, данные будут потеряны.

Бабушка: «А если кто-нибудь убежит с тетрадью?»

Это умный вопрос! Да, кэширование помогает ускорить работу, но оно также сопряжено с проблемами.

  • Если сервер выйдет из строя, данные будут потеряны
  • Данные устареют, если они будут обновлены либо только в базе данных, либо в кеше.
  • Кэш может потреблять много памяти, если не установлена ​​надлежащая политика вытеснения кеша.

Следовательно, когда дело доходит до проектирования кеша, вкладывается много соображений и усилий.

Закрытие

Опс! Кажется, у нас закончилось печенье! Что ж, думаю, пора заканчивать.

Я верю, что если немного углубиться в изучение, бабушка быстро пройдет собеседование по проектированию системы!

А теперь извините, мне нужно вздремнуть, прежде чем снова выставлять рекламу печенья!

Чао!

Рекомендации