37signals больше всего известны благодаря выпуску в свет Ruby on Rails грамотному его использованию для запуска их очень популярных продуктов: Basecamp, Highrise, Backpack и Campfire. RoR как обычно пытаются винить во всех проблемах с производительностью, но 37signals казалось бы справляется с большой нагрузкой, используя вполне разумное количество вычислительных ресурсов.

Источники информации

Этот текст является переводом статьи, автор - Todd Hoff. Извиняюсь за не сильно оригинальный контент (да и, как выяснилось, практически не технической направленности), но на написание своих полноценных текстов у меня последнее время все никак не хватает то креатива, то времени :( .

Платформа

Статистика

  • 30 серверов: от простых однопроцессорных файловых серверов до восьмипроцессорных серверов приложений, в сумме около 100 процессоров и 200 GB оперативной памяти.
  • В планах диагональное масштабирование: уменьшение количества серверов до 16, но более производительных - в сумме 92 процессоров и 230 GB RAM.
  • Виртуализация средствами Xen для более гибкого управления системой.
  • Basecamp (управление проектами):
    • 2000000 пользователей с учетными записями
    • 13200000 задач
    • 9200000 сообщений
    • 12200000 комментариев
    • 5500000 записей о распределении времени
  • Backpack (управление информацией для личного использования и малого бизнеса):
    • Около миллиона страниц
    • 6800000 задач
    • 1500000 записей
    • 829000 фотографий
    • 370000 файлов
  • Общая статистика проектов (на ноябрь 2007 г.):
    • 5.9 TB загруженных пользователями данных
    • 888 GB загружено (upload)
    • 2 TB скачано (download)

Архитектура

  • Кэширование средствами memcached уже используется, но они ищут способы более активно его применять. Позволяет достичь впечатляющих результатов в плане производительности.
  • Методы для составления URL используются вместо ручного их составления.
  • Используются стандартные ActiveRecord запросы, но при необходимости они используют и ручную настройку.
  • Иногда они дорабатывают Rails, если сталкиваются с проблемами с производительностью.
  • Amazon S3 используется для хранения данных, загруженных пользователями. Разработчики очень довольны результатами.

Работа с кредитными картами

  • Ежемесячное выписывание счетов. Это позволяет компаниям, занимающимся кредитными картами, чувствовать себя более комфортно, так как им не придется столкнуться с огромным количеством работы, если ваша фирма вдруг выйдет из бизнеса. Пользователям такой подход также по душе, так как издержки в итоге оказываются относительно невелики, а также не требуется подписание контракта, имеется возможность пользоваться сервисами необходимый промежуток времени и оплачивать именно ту сумму, которую потратили.
  • Получение учетной записи продавца услуг. Кто-то определенно должен обрабатывать операции с кредитными картами. Они используют Chase Bank. Воспользуйтесь услугами кого-нибудь, кому вы доверяете, а когда масштаб ваших сделок станет существенным - будет возможность получить более выгодные условия контракта.
  • Они используют authorize.net в роли шлюза для процессинга операций с кредитными картами.
  • Ежемесячным выписыванием счетов занимается специально написанная для этого проекта система. Она запускается каждую ночь, отправляет счета нужным людям и записывает результаты выполненных операций.
  • В случае успеха счет-фактура высылается по электронной почте.
  • В случае каких-либо сбоев - пользователю отправляется объяснение причин.
  • Если три раза с помощью кредитной карты не удается оплатить счет - учетная запись замораживается до тех пор, пока не будет предоставлен платежеспособный номер кредитной карты.
  • Обработка ошибок является критичным моментом, так как проблемы с оплатой возникают достаточно часто.
  • Все продукты конвертируются для использования централизованным биллинговым сервисом.
  • Необходимо быть совместимыми с PCI DSS (Payment Card Industry Data Security Standard).
  • Пользуйтесь услугами шлюзов, это позволит не хранить номера кредитных карт на своем сайте, что сильно упрощает жизнь в плане безопасности. Некоторые из них предоставляют и биллинговые услуги, что позволяет также не заниматься этим самостоятельно.

Поддержка пользователей

  • Campfire используется для работы с клиентами. По сути эта система представляет собой групповой веб-чат с расширенными возможностями в виде опциональной защиты паролем, личных сообщений, обмена файлами, предпросмотра изображений, а также коллективного принятия решений.
  • Поднимаемые вопросы используются для поиска ошибок в коде, а обновление данных в SVN отображается прямо в процессе общения. Bugtracking система обходится стороной, что казалось бы должно лишь усложнять исправление неполадок, например из-за отсутствия возможности проследить связь между конкретным изменением в коде и вызвавшей его неполадкой.
  • Зато служба поддержки может решать проблемы клиентов с помощью общения в чате в реальном времени, с возможностью обмена изображениями и снимками экранов, демонстрирующими неисправность.
  • Разработчики также всегда доступны с помощью Campfire для помощи в решении проблем клиентов.

Подводим итоги

  • Возьмите пример с Amazon и постройте все внутренние функции в виде сервисов с самого начала. Это позволит более легко использовать их в разных продуктах и прозрачно обновлять предоставляемые возможности.
  • Не храните номера кредитных карт внутри своей базы данных - это существенно снижает риски, связанные с безопасностью.
  • Разработчики и пользователи должны иметь возможность легко общаться друг с другом публично. Пользователи получают сервис намного более высокого качества, если общаются напрямую с разработчиками, которые решают все проблемы прямо в рамках нормального хода процесса разработки. Это позволяет избежать нескольких излишних промежуточных этапов при обработке заявок о неисправности. Помимо этого разработчикам предоставляется возможность узнать пользовательское мнение об их продукте, что делает дальнейшее развитие проекта более эффективным. Потенциальные клиенты могут убедиться в отзывчивости компании, просто посмотрев на такое общение, что подталкивает их к более охотной регистрации.
  • Развивайте свой продукт добавлением новых функций, которые нужны конкретным клиентам, а не тех, которые когда-нибудь может быть кому-нибудь понадобятся.