Сообщения

Сообщения за январь, 2021

Основы дизайна систем: логирование, мониторинг, предупреждения

Изображение
Логирование Со временем ваша система будет собирать много данных. Большая часть этих данных чрезвычайно полезна. Она может дать вам представление о состоянии вашей системы, ее производительности и проблемах. Это также может дать вам ценную информацию о том, кто использует вашу систему, как они ее используют, как часто, какие части используются более или менее и так далее. Эти данные важны для аналитики, оптимизации производительности и улучшения продукта. Это также чрезвычайно ценно для отладки, не только при входе в консоль во время разработки, но и для поиска ошибок в тестовой и производственной средах. Таким образом, журналы также помогают в отслеживании и аудите. Ключевой прием, который следует помнить при ведении журнала, - это рассматривать его как последовательность последовательных событий, что означает, что данные становятся данными временного ряда, а инструменты и базы данных, которые вы используете, должны быть специально разработаны для помощи в работе с такими данными.

Основы дизайна систем: обмен сообщениями и Pub-Sub

Изображение
Когда вы проектируете и строите крупномасштабные и распределенные системы, чтобы эта система работала согласованно и бесперебойно, важно обмениваться информацией между компонентами и службами, составляющими систему. Но системы, которые полагаются на сети, страдают той же слабостью, что и сами сети - они хрупки. Сети выходят из строя, и это не редкость. Когда сети выходят из строя, компоненты в системе не могут обмениваться данными и могут вывести систему из строя (в лучшем случае) или вызвать полный отказ системы (в худшем случае). Таким образом, распределенные системы нуждаются в надежных механизмах для обеспечения продолжения или восстановления связи с того места, где оно было прервано, даже если существует «произвольный раздел» (то есть сбой) между компонентами в системе. Представьте, например, что вы бронируете авиабилеты. Вы получаете хорошую цену, выбираете места, подтверждаете бронирование и даже платите кредитной картой. Теперь вы ждете, пока ваш PDF-файл с билетами не поступи

Основы дизайна систем: защита выходных точек (Endpoint Protection)

Изображение
Когда вы строите крупномасштабные системы, становится важным защитить вашу систему от слишком большого количества операций, когда такие операции фактически не нужны для использования системы. Это звучит очень абстрактно. Но подумайте об этом - сколько раз вы яростно нажимали кнопку, думая, что это сделает систему более отзывчивой? Представьте, если бы каждое из этих нажатий кнопки отправляло пинг на сервер, и сервер пытался обработать их все! Если пропускная способность системы по какой-то причине низкая (скажем, сервер испытывал необычную нагрузку), то каждый из этих щелчков делал бы систему еще медленнее, потому что ей приходилось обрабатывать их все! Иногда дело даже не в защите системы. Иногда вы хотите ограничить операции, потому что это часть вашей службы. Например, вы могли использовать бесплатные уровни для сторонних служб API, где вам разрешено делать только 20 запросов за 30-минутный интервал. Если вы сделаете 21 или 300 запросов в 30-минутном интервале, после первых 20, это

Основы дизайна систем: опрос, потоковая передача, сокеты

Изображение
В современную эпоху непрерывных обновлений, push-уведомлений, потокового контента и данных в реальном времени важно понимать основные принципы, лежащие в основе этих технологий. Чтобы данные в вашем приложении обновлялись регулярно или мгновенно, необходимо использовать один из двух следующих подходов. Опрос (Polling) Опрос - это просто проверка вашего клиента на сервере путем отправки ему сетевого запроса и запроса обновленных данных. Эти запросы обычно выполняются через регулярные интервалы, например 5 секунд, 15 секунд, 1 минуту или любой другой интервал, необходимый для вашего варианта использования. Опрос каждые несколько секунд все же не совсем то же самое, что и в реальном времени, и также имеет следующие недостатки, особенно если у вас более миллиона одновременных пользователей: почти постоянные сетевые запросы (не очень удобно для клиента) почти постоянные входящие запросы (не очень хорошо для серверных нагрузок - 1 млн + запросов в секунду!) Таким образом, быстрый опр

Основы дизайна систем: выборы лидера

Изображение
Вернемся к серверам снова для более сложной темы. Мы уже понимаем принцип доступности и то, как избыточность является одним из способов повышения доступности. Мы также рассмотрели некоторые практические соображения при обработке маршрутизации запросов к кластерам избыточных серверов. Но иногда при такой настройке, когда несколько серверов делают примерно одно и то же, могут возникнуть ситуации, когда вам нужен только один сервер, чтобы взять на себя инициативу. Например, вы хотите убедиться, что только один сервер отвечает за обновление некоторого стороннего API, потому что несколько обновлений с разных серверов могут вызвать проблемы или увеличить расходы стороннего производителя. В этом случае вам нужно выбрать тот первичный сервер, которому вы хотите передать ответственность за это обновление. Этот процесс называется выборами лидера . Когда несколько серверов находятся в кластере для обеспечения избыточности, они могут быть сконфигурированы между собой так, чтобы иметь одного и

Основы дизайна систем: базы данных

Изображение
Существуют различные типы решений для хранения данных (баз данных), предназначенные для различных сценариев использования, и некоторые из них более специализированы для определенных задач, чем другие. Однако на очень высоком уровне базы данных можно разделить на два типа: реляционные и нереляционные. Реляционные базы данных Реляционная база данных - это база данных, в которой строго установлены отношения между вещами, хранящимися в базе данных. Эти отношения обычно становятся возможными благодаря требованию, чтобы база данных представляла каждую такую вещь (называемую «сущностью» (entity)) в виде структурированной таблицы - с нулем или несколькими строками («записи», «вхождения») ("records", "entries") и одним или несколькими столбцами («атрибуты», «поля») ("attributes", "fields"). Установив такую структуру в сущности, мы можем гарантировать, что каждый элемент/вхождение/запись имеет правильные данные, которые могут быть связаны с ней. Это

Основы дизайна систем: последовательное хеширование

Изображение
Одна из немного более сложных концепций для понимания - хеширование в контексте балансировки нагрузки. Чтобы понять это, сначала необходимо понять, как работает хеширование на концептуальном уровне. Оно заключается в том, что хеширование преобразует ввод в значение фиксированного размера, часто целочисленное значение (хеш). Один из ключевых принципов хорошего алгоритма или функции хеширования заключается в том, что функция должна быть детерминированной - идентичные входные данные будут генерировать идентичные выходные данные при передаче в функцию. Итак, детерминированный означает - если я передаю строку «Код» (с учетом регистра), а функция генерирует хеш 11002, то каждый раз, когда я передаю «Код», она должна генерировать «11002» как целое число. И если я передам «код», он будет генерировать другое число (последовательно). Иногда хеш-функция может генерировать один и тот же хеш для нескольких входных данных - это еще не конец света, и есть способы с этим справиться. Фактически это

Потоковая передача событий и Apache Kafka

Изображение
Что такое потоковая передача событий? Потоковая передача событий - это цифровой эквивалент центральной нервной системы человеческого тела. Это технологическая основа для «постоянно активного» мира, в котором предприятия все больше определяются и автоматизируются с помощью программного обеспечения и где пользователь программного обеспечения в большей степени является программным обеспечением. С технической точки зрения, потоковая передача событий - это практика сбора данных в реальном времени из источников событий, таких как базы данных, датчики, мобильные устройства, облачные сервисы и программные приложения в форме потоков событий; долговременное хранение этих потоков событий для последующего извлечения; манипулирование, обработка и реагирование на потоки событий в реальном времени, а также ретроспективно; и маршрутизацию потоков событий к различным технологиям назначения по мере необходимости. Таким образом, потоковая передача событий обеспечивает непрерывный поток и интерпретацию

Основы дизайна систем: балансировка нагрузки

Изображение
Если вы подумаете о двух словах, нагрузка и баланс, вы начнете интуитивно понимать, что балансировка нагрузки делает в мире вычислений. Когда сервер одновременно получает много запросов, он может замедлиться (снижается пропускная способность, увеличивается задержка). После определенной точки он может даже выйти из строя (стать недоступным). Вы можете наделить сервер большей мощностью (вертикальное масштабирование) или добавить больше серверов (горизонтальное масштабирование). Но теперь вам нужно выяснить, как входящие запросы распределяются между различными серверами - какие запросы маршрутизируются на какие серверы и как гарантировать, что они не будут перегружены? Другими словами, как вы балансируете и распределяете нагрузку запросов? Введите балансировщики нагрузки. Задача балансировщика нагрузки - сидеть между клиентом и сервером (но есть и другие места, где он может быть вставлен) и разбираться, как распределять нагрузку входящих запросов между несколькими серверами, чтобы конеч

Основы дизайна систем: прокси

Изображение
Прокси. Что это? Многие из нас слышали о прокси-серверах. Возможно, мы видели параметры конфигурации в некоторых наших программах для ПК или Mac, в которых говорится о добавлении и настройке прокси-серверов или доступе «через прокси». Итак, давайте разберемся с этой относительно простой, широко используемой и важной технологией. В вычислениях прокси обычно является сервером, и это сервер, который действует как посредник между клиентом и другим сервером. Это буквально фрагмент кода, который находится между клиентом и сервером. В этом суть прокси. Если вы не уверены в определениях клиента и сервера, «клиент» - это процесс (код) или машина, которая запрашивает данные у другого процесса или машины («сервер»). Браузер является клиентом, когда запрашивает данные с внутреннего сервера. Сервер обслуживает клиента, но также может быть клиентом - когда он извлекает данные из базы данных. Тогда база данных - это сервер, сервер - это клиент (базы данных), а также сервер для внешнего клиента (б

Основы дизайна систем: кеширование

Изображение
Кеширование - это очень фундаментальный и простой для понимания метод повышения производительности системы. Кеширование помогает уменьшить "задержку" (latency) в системе. В повседневной жизни мы используем кеширование исходя из здравого смысла (большую часть времени...). Если мы живем по соседству с супермаркетом, мы все равно хотим покупать и хранить самое необходимое в холодильнике и кухонном шкафу. Это кеширование. Мы всегда можем выйти, пойти по соседству и покупать эти вещи каждый раз, когда нам понадобится еда, но если она находится в кладовой или в холодильнике, мы сокращаем время, необходимое для приготовления нашей еды. Это кеширование. Общие сценарии кеширования Точно так же с точки зрения программного обеспечения, если мы в конечном итоге будем часто полагаться на определенные фрагменты данных, мы можем захотеть кешировать эти данные, чтобы наше приложение работало быстрее. Часто бывает так, когда данные извлекаются из памяти быстрее, чем с диска, из-за задержк

Основы дизайна систем: доступность системы

Изображение
Инженеры-программисты стремятся создавать надежные системы. Надежная система - это система, которая неизменно удовлетворяет потребности пользователя всякий раз, когда он стремится удовлетворить эту потребность. Ключевым компонентом этой надежности является доступность (Availability). Под доступностью полезно понимать отказоустойчивость системы. Если система достаточно устойчива, чтобы обрабатывать отказы в сети, базе данных, серверах и т. д., то ее обычно можно рассматривать как отказоустойчивую систему (fault-tolerant system), что делает ее доступной. Конечно, система - это сумма своих частей во многих смыслах, и каждая часть должна быть высокодоступной, если доступность имеет отношение к опыту конечного пользователя на сайте или в приложении. Количественная оценка доступности Чтобы количественно оценить доступность системы, мы вычисляем процент времени, в течение которого основные функции и операции системы доступны (время безотказной работы) в заданном временном окне. Наиболее

Основы дизайна систем: пропускная способность

Изображение
Пропускную способность (throughput) можно понимать как максимальную производительность машины или системы. Ее часто используют на заводах, чтобы рассчитать, сколько работы сборочная линия может сделать за час или день, или в другую единицу измерения времени. Например, сборочная линия может собирать 20 автомобилей в час, что составляет ее пропускную способность. При вычислениях это будет объем данных, который может быть передан за единицу времени. Таким образом, интернет-соединение со скоростью 512 Мбит/с - это мера пропускной способности - 512 Мбит (мегабит) в секунду. А теперь представьте себе веб-сервер. Если он получает 1 миллион запросов в секунду и может обслуживать только 800 000 запросов, тогда его пропускная способность составляет 800 000 в секунду. Вы можете в конечном итоге измерить пропускную способность в битах, а не в запросах, так что это будет N бит в секунду. В этом примере есть узкое место, потому что сервер не может обрабатывать более N бит в секунду, но запросов

Основы дизайна систем: задержка

Изображение
«Задержка» и «пропускная способность» - это термины, которые вы часто будете слышать по мере того, как начнете получать больший опыт в проектировании систем для поддержки внешнего интерфейса вашего приложения. Они очень важны для работы и производительности вашего приложения и системы в целом. Часто существует тенденция использовать эти термины в более широком смысле, чем предполагалось, или вне контекста. Задержка (latency) - это просто мера продолжительности. Какая продолжительность? Продолжительность действия, чтобы завершить что-то или дать результат. Например: для перемещения данных из одного места в системе в другое. Вы можете думать об этом как о задержке или просто о времени, затраченном на выполнение операции. Наиболее часто понимаемая задержка - это сетевой запрос «туда и обратно» - сколько времени требуется вашему веб-сайту (клиенту), чтобы отправить запрос на ваш сервер и получить ответ от сервера. Когда вы загружаете сайт, вы хотите, чтобы это было как можно быстрее и п

Основы дизайна систем: хранилище

Изображение
Хранилище - это хранение информации. Любое приложение, система или служба, которые вы программируете, должны будут хранить и извлекать данные, и это две основные цели хранилища. Но дело не только в хранении данных, но и в их получении. Для этого мы используем базу данных. База данных - это программный уровень, который помогает нам хранить и извлекать данные. Эти два основных типа операций, сохранение и извлечение, также по-разному называются «установить, получить» (set, get), «сохранить, получить» (store, fetch), «записать, прочитать» (write, read) и так далее. Чтобы взаимодействовать с хранилищем, вам нужно будет пройти через базу данных, которая действует как посредник для выполнения этих основных операций. Слово «хранилище» иногда может заставить нас задуматься о нем в физических терминах. Если я «храню» свой велосипед в сарае, я могу ожидать, что он будет там, когда я в следующий раз открою сарай. Но в компьютерном мире это не всегда происходит. Хранилище может быть двух типов:

Основы дизайна систем: сети и протоколы

Изображение
«Протоколы» - это красивое слово, значение которого на английском языке полностью не зависит от информатики. Это означает систему правил и положений, которые что-то регулируют. Это своего рода «официальная процедура» или «официальный способ сделать что-то». Чтобы люди могли подключаться к машинам и коду, которые взаимодействуют друг с другом, им нужна сеть, по которой может происходить такое общение. Но для общения также необходимы некоторые правила, структура и согласованные процедуры. Таким образом, сетевые протоколы - это протоколы, которые определяют, как машины и программное обеспечение обмениваются данными в данной сети. Примером сети является наша любимая всемирная паутина. Наиболее распространенные сетевые протоколы эпохи Интернета - это HTTP, TCP/IP и др. IP - Internet Protocol - Интернет-протокол IP можно рассматривать как фундаментальный уровень протоколов. Это базовый протокол, который указывает нам, как должна быть реализована почти вся связь через Интернет-сети. Соо