Как работает Dropbox: Уроки разработчиков

Рубрика:

Dropbox сохраняет один миллион файлов каждые 15 минут. Такую статистику раскрыл Райан Хантер, инженером Dropbox, в своей презентации How Dropbox Did It and How Python Helped на конференции PyCon 2011 в Атланте.

В первой части презентации раскрываются о основные сведения о Dropbox, истории создания и т.п. В частности мы узнаем о том, что Dropbox - стартап, расположенный в Сан-Франциско, который предоставляет самые распространенные инструменты для синхронизации файлов и совместного использования в мире, оказывает поддержку миллионам пользователей и растет каждый день.

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

1. Используйте Python

  • 99.9 % их кода написан на Python. Он используется на серверном бэкэнде, desktop  клиенте, логике контроллера веб-сайта, бэкэнде API, и аналитике.
  • Python не может использоваться на Android из-за ограничений памяти.
  • Работает на единой базе кода, с использованием Python. Dropbox работает на Windows, Mac, Linux, используя такие инструменты, как PyObjs, WxPython, types, py2exe, py2app, PyWin32.

Плюсы:

  • Python  легко  учить, легко читать, легко писать, ему можно легко обучить новых людей в команде.

Минусы:

  • Он может медленно работать и использовать слишком много памяти. Это не проблема на стороне сервера, достаточно купить более мощные машины. Но на стороне клиента вы не можете заставить пользователя модернизировать свой ПК.
  • Кодирование в смешанной среде Python и C создает проблемы, потому что трудно пересекать границы языка, если вы например захотите исправить проблемы памяти и CPU.
  • Проблемы фрагментации памяти – это причина, по которой  языки скриптов, не самый подходящий выбок для долгих рабочих процессов.

2. Главное, чтобы работало

  • Не должно иметь значения, в какой файловой и операционной системе вы работаете, какую ОС и какие приложения вы используете. Продукт просто должен работать.
  • Python помог им быстро выполнять итерации для исправления ошибок, обнаруженных на различных платформах, которые они поддерживают.

3. Быстрый релиз.

  • Напишите что-то за день и сразу выпускайте. С Python это легко.

4. Используйте C для внутренних циклов - простая оптимизация CPU.

  • Способ решения проблем со скоростью.
  • Оптимизируйте внутренние циклы, чтобы уменьшить процессорное время.
  • На 44% больше нагрузки, если выполнять циклы в Python по сравнению с C (2.88 сек. по сравнению с 1.61)
  • В Python очень медленная отправка байт-коды VM.
  • Есть много инструментов профилирования CPU.
  • Оптимизация CPU обычно ограничивается небольшими сегментами кода.

5. Опрос

  • Была создана структура уведомления HTTP, чтобы избежать опрашивания сервера на клиентском сайте.

6. Пользовательский инструмент выделения памяти

  • Некоторое время это было самой большой проблемой. Могли использоваться огромные объемы памяти, и память никогда не будет освобождаться. Сначала для большой синхронизации могли использоваться файлы до 1.5 Гбайт, теперь объем файла ограничен 100 МБ.
  • Трудности связаны с тем, что:

- Есть не так много инструментов для того, чтобы профилировать память для Python и C.

- Память "съедается" по нескольким причинам: утечки памяти в коде Python и C; фрагментация памяти; неэффективное использование памяти.

  • Исправление очевидной неэффективности памяти не помогала. Разработчики искали утечку памяти, но ее не было.
  • Проблемой, оказалась во  фрагментации памяти. Фрагментация памяти - это то, что происходит, когда блоки памяти разного размера непрерывно удаляются и выделяются. Что при этом происходит – непрерывные блоки памяти не могут больше выделяться. У Python нет сборщика "мусора", таким образом, вся эта память просто не смогла быть выделенной, и "куча" непрерывно росла, чтобы запросы памяти могли быть удовлетворены.
  • Решение состояло в том, чтобы создать пользовательское средство выделения памяти. Объект метаданных файла быстро растет при выполнении передач, таким образом, самый простой выход из ситуации был создать пользовательское средство выделения в C, использующем mmap.

Будущие Направления

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

Автор: 
http://highscalability.com/