Мы продолжаем изучать интересную книгу о культуре и практиках Google:
В главе 2 рассматривается:
Работа в изоляции против работы в команде. Количество времени, которое вы и ваша команда тратите на общение и межличностные конфликты. Как небольшие инвестиции в понимание личностей и стилей работы ваших коллег могут в значительной степени повысить производительность. Если вы хотите эффективно работать в команде или крупной организации, знайте свой предпочитаемый стиль работы и стили других. Вот книга, которую мы изучаем:
Наш клуб книг по IT начал чтение новой книги - об Инженерии Программного Обеспечения в Google - процессах, культуре и инструментах, которые помогают Google создавать и поддерживать высококачественное программное обеспечение. Первая глава посвящена Инженерии Программного Обеспечения в общем:
Что такое Инженерия Программного Обеспечения по сравнению с Разработкой программного обеспечения? Три принципа, которые учитывает Google: Время и изменение Масштаб и рост Компромиссы и затраты Как эти три принципа применяются к Инженерии Программного Обеспечения и в чем она отличается от Разработки программного обеспечения.
Ранее описанные технологии, такие как согласованное хеширование, генератор ID позволяют разработать сокращатель URL, который способен генерировать 100 миллионов URL в день.
Проектирование включает в себя следующие элементы:
конечные точки API перенаправление URL сокращение URL модель данных хеш-функции: хеширование + разрешение коллизий VS преобразования в base-62 а также такие вопросы, как: ограничитель частоты масштабирование веб-сервера масштабирование базы данных аналитика доступность, согласованность и надежность Эти пункты раскрыты в очень интересной главе 8 книги:
Генерация уникального идентификатора кажется простой задачей, но не в высоконагруженных распределенных системах!
Эта тема состоит из:
Понимание требований и почему это сложная задача Возможные решения: Репликация с несколькими мастерами Универсальный уникальный идентификатор (UUID) Сервер билетов Подход Twitter SNOWFLAKE (похоже, что он наилучший!) Подробности: Штамп времени Номер последовательности Другие вопросы Синхронизация часов Настройка длины секции Высокая доступность Эти пункты раскрыты в очень интересной главе 7 книги:
Дизайн хранилища типа Ключ-Значене состоит из понимания следующих тем:
Что мы хотим от хранилища Ключ-Значение? Односерверное хранилище Ключ-Значение РАСПРЕДЕЛЕННОЕ хранилище Ключ-Значение: Теорема CAP Реальные компромиссы для распределенных систем Системные компоненты: Партиционирование данных Репликация данных Консистентность Разрешение неконсистентности: Версии Обработка всех типов сбоев: Обнаружение сбоев, Обработка ВРЕМЕННЫХ сбоев, Обработка ПОСТОЯННЫХ сбоев, Устранение сбоев в работе центра обработки данных Схема архитектуры системы Путь записи Путь чтения Эти пункты раскрыты в очень интересной главе 6 книги:
Консистентное хеширование является краеугольной технологией для распределенных систем. Многие разработчики программного обеспечения этого не осознают, но консистентное хеширование необходимо во многих местах: балансировщики нагрузки, кэши, CDN, генераторы id, базы данных, чаты/социальные сети и многие другие системы.
Эта тема состоит из:
Проблема с перехешированием и почему нам нужно, чтобы хеширование было ПОСЛЕДОВАТЕЛЬНЫМ Хэш-пространство и хэш-кольцо БАЗОВЫЙ подход (введенный Каргером и др. в MIT) Расширенный подход с ВИРТУАЛЬНЫМИ УЗЛАМИ Эти моменты раскрыты в очень интересной главе 5 книги:
Каждое популярное программное обеспечение должно иметь ограничитель трафика. Это предотвращает DDOS-атаку, снижает затраты и предотвращает перегрузку серверов.
Есть несколько каверзных вопросов, которые необходимо учитывать при внедрении ограничителя трафика:
Где поставить ограничитель трафика: на стороне клиента, на стороне сервера, на шлюзе? Алгоритмы ограничения скорости. Есть много алгоритмов со своими плюсами и минусами: Token Bucket, Leaking Bucket, Fixed window counter, Sliding window log, Sliding window counter. Особенности вашего бизнеса определят правильный алгоритм.
Четыре стандартных этапа собеседования по проектированию ИТ-систем. Однако я бы думал о них шире: как о четырех начальных шагах проектирования любого ПО.
Шаг 1. Понимание проблемы и определение скоупа проектирования Шаг 2. Предложите дизайн высокого уровня и получите одобрение Шаг 3. Спроектируйте глубокое погружение Шаг 4. Завершение Глава 3 книги раскрывает подробности о каждом шаге, хорошие вопросы, которые нужно задать (над которыми следует подумать), а также то, что НУЖНО и НЕЛЬЗЯ делать.
Очень короткая глава 2 посвящена тому, как делать приблизительные оценки, чтобы начать с самых важных моментов при разработке программного обеспечения.
Концепции, которые должен знать КАЖДЫЙ разработчик программного обеспечения:
“Сила двух” Стандартные цифры задержки! Насколько быстрой является память, насколько медленным является диск и т.д. Показатели доступности Про какие ключевые метрики стоит думать Эти понятия и числа раскрыты во второй главе книги:
“System Design. Подготовка к сложному интервью” Алекса Сюй.
Отличный общий план для масштабирования любого приложения с нуля до миллионов пользователей.
Настройка одного сервера Выбор и использование базы данных Вертикальное масштабирование против горизонтального масштабирования подходов. И почему вы должны предпочесть горизонтальный Добавлен балансировщик нагрузки для горизонтального масштабирования Добавление репликации базы данных для горизонтального масштабирования Добавление кеша Добавление CDN Архитектура без сохранения состояния и с сохранением состояния и использование внешнего хранилища состояния Добавление дополнительных центров обработки данных Добавление очереди сообщений Добавление ведения журнала, метрик и автоматизации Масштабирование базы данных и дальнейшие шаги… Все это тщательно, но кратко раскрыто в Главе 1 книги: