Надёжность Go в инфраструктуре Dropbox

в 15:41, , рубрики: bazel, DropBox, Go, Rust, высокая производительность, Разработка веб-сайтов, состояние гонки

Об авторе: Тэмми Бутов — технический руководитель инфраструктуры для разработчиков в Dropbox. Это управление потоками кода — полный цикл использования Go в Dropbox, от программирования до выпуска. Она выступала на конференции GopherCon 2017 на тему того, как разработчики Dropbox создают и поддерживают работу крупномасштабных сервисов на Go.

Как Dropbox пришёл к использованию Go

Тэмми цитирует статью Роба Пайка «Go в компании Google: языковой дизайн в службе разработки ПО» от 2012 года, поскольку она в целом хорошо передаёт, почему Go хорошо работает и в Dropbox:

«Go — эффективный, масштабируемый и производительный язык. Некоторые программисты получают удовольствие от работы с ним; другие находят его прозаическим, даже скучным. В этой статье мы расскажем, почему все эти позиции не противоречат друг другу. Go спроектирован для решения проблем, возникающих в софтверной разработке в Google, что привело к созданию языка, который не является прорывным с исследовательской точки зрения, тем не менее это прекрасный инструмент для разработки крупных софтверных проектов». — Роб Пайк, 2012

Масштаб Dropbox впечатляет:

  • Более 500 млн пользователей
  • 200 000 бизнес-пользователей
  • 500 петабайт пользовательских данных
  • Многоэкзабайтная система хранения Go


В результате, Dropbox многое требует от своих систем, языков и разработчиков. Ведущие принципы и требования следующие:

  • Создавать надёжные системы
  • Создавать безопасные системы
  • Объединять надёжность и безопасность в изначальной архитектуре
  • Надёжность 99,9999999999% (двенадцать девяток)
  • Доступность 99,99%

Состояние Go в Dropbox

Сегодня бóльшая часть инфраструктуры Dropbox написана на Go. В частности:

  • У сервера репозиториев Go — 150 уникальных контрибуторов (из 500 разработчиков в компании)
  • Более 15 групп создают и поддерживают работу сервисов Go в Dropbox
  • По всей компании в Dropbox написано 1,3 млн строк на Go

некоторые из ключевых систем, написанных на Go:

  • RAT: ограничение скорости и дросселирование (приглушение) трафика
  • HAT: замена memcached
  • AFS: файловая система для замены глобального Zookeeper
  • Edgestore: распределённая база данных
  • Bolt: для сообщений
  • DBmanager: для автоматизации и мониторинга более 6000 баз данных Dropbox
  • Jetstream, Telescope, маршрутизация блоков и многое другое

Многие из них представляют собой преемников предыдущих систем не на Go.

Как Dropbox начал использовать Go?

Тэмми поделилась несколькими историями, как Dropbox естественным путём перешёл на Go.

Прототип ограничителя скорости на Go с хакерской недели
До хакерской недели, которая случилась однажды, разработчики Dropbox внедряли ограничение скорости и дросселирование отдельно для каждого сервиса, где требовалось. Но для этой хакерской недели один инженер Dropbox решил создать единую реализацию этих функций. Так родился RAT (Rate limiting And Throttling).

Первый прототип RAT был создан за четыре дня и показан на пятый. В течение нескольких недель после создания RAT информация о нём распространилась по фирме. Другой инженер Dropbox написал в группу Тэмми предложение посмотреть, как они могут использовать RAT из проекта Python. Интеграция прошла плавно, сервис был принят естественным путём — и вскоре RAT начал приносить пользу. Теперь несколько команд в Dropbox используют RAT.

Dbmanager
В Dropbox более 6000 баз данных, и такая большая система требует автоматизации и мониторинга. В любой данный момент времени проходит репликация баз данных, сбои, перенос из обычной реплики в основную и т. д.

Для управления этим процессом инженер Dropbox разработал Dbmanager — UI в вебе для быстрого просмотра состояния всех более чем 6000 баз данных. Информация о статусе также передаётся в другие системы.

Обновление версий Go в Dropbox
Имея сотни разработчиков, Dropbox аккуратно координирует обновление основных версий Go. Тэмми не упомянула о каких-то определённых проблемах, что указывает на плавный процесс!

Некоторые интересные факты:

  • Dropbox недавно закончил миграцию сервисов продакшна с Go 1.5 на 1.6.
  • Для отслеживания процесса обновления они создали простой документ Dropbox Paper, где владелец каждого сервиса отчитывается о прогрессе и запрашивает помощь при необходимости.
  • Dropbox пропускает версию Go 1.7 и сразу перейдёт на Go 1.8, когда миграция на Go 1.6 полностью завершится (включая сервисы не в продакшне).

Как инженеры Dropbox осваивают Go

Каждый инженер Dropbox проходит через один и тот же строгий процесс освоения Go, который состоит из следующих этапов:

  • Чтение инфраструктурной топологии, руководства по стилю Go и руководства по стилю Protobuf
  • Строгие, но дружелюбные анализы кода
  • Создание маленького приложения (в App Store) на Go
  • Изучение Bazel для сборки и тестирования кода Go

Для опытного программиста процесс занимает около недели.

Что прошло гладко с внедрением Go в компании Dropbox? А что нет?

В целом, использование Go в Dropbox’s было очень удачным.

  • На Go легко показать высокую производительность труда.
  • На Go легко писать и использовать сервисы. (И людям нравится и то, и другое!)
  • Стандартная библиотека очень хороша.
  • Инструменты отладки (в основном!) работают хорошо.

Здесь один из важных фактов состоит в том, что в Dropbox нет попыток переписать сервисы Go на других языках. Это знак, что люди в целом довольны. (Тэмми выдала интригующую деталь: в Dropbox немного используют Rust. Но его не считают заменой для Go).

Что сложного Dropbox нашёл в Go?

Наибольшей сложностью Тэмми назвала работу с состоянием гонки.

  • Состояние гонки данных — самый трудный баг для отладки, для обнаружения, исправления и т. д.
  • Несколько инженеров Dropbox особенно хороши в обнаружении таких багов, а остальные опираются на их опыт.
  • Детектор состояния гонки в Go не всегда помогает. Нужно понимать, когда он беспомощен.
  • Важно аккуратно проектировать программы Go, если требуется одновременный доступ к данным.

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

Автор: m1rko

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js