Как создать размещенное веб-приложение?

Как бы вы разработали размещенное веб-приложение? Я смотрю на такие приложения, как Basecamp, Campaign Monitor, Freshbooks и т. Д., Где пользователи могут зарегистрироваться онлайн, и приложение размещено для них.

  1. Будете ли вы использовать одну большую базу данных для хранения всех данных вашего клиента или вы будете обрабатывать данные по-другому? Вы бы использовали более 1 базы данных? Вы бы сделали базу данных для каждого клиента?
  2. Будете ли вы дублировать свою кодовую базу для каждого подписчика / клиента или использовать одну кодовую базу для обслуживания всех клиентов?
  3. Есть ли другие элементы дизайна, о которых я должен подумать?
  4. Какие-нибудь веб-сайты или книги, которые говорят об этом?

Изменить: я нашел статью MSDN, в которой обсуждалась многопользовательская архитектура данных: http://msdn.microsoft.com/en-us/library/aa479086.aspx

3 ответа

Решение

Обратитесь к 37 сигналам - они являются экспертами в этой области и имеют много статей, в которых они отвечают на вопросы сообщества (многие из них, как и вы, должны подойти).

Высокая масштабируемость = 37signals Architecture

Спросите 37signals: Как вы обрабатываете кредитные карты?

Что касается количества баз данных, от David Heinemeier Hansson в Что вы хотите знать?

Некоторые технические ответы...

Ланс, все наши плановые операции по выставлению счетов автоматизированы. Все, что от этого зависит, сводит нас с ума. Особенно важно удостовериться, что обработка непредвиденных обстоятельств происходит в случае отказа кредитных карт. Последнее, что я посмотрел, я считаю, что 5% наших сборов отскочил благодаря кредитным картам, срок действия которых истек, превысил лимит или был закрыт. Обязательно справлюсь с этим изящно.

Мы просто используем Authorize.net и отдельное приложение для кредитных карт (крошечное приложение, разработанное в Rails и используемое другими приложениями во внутренней сети через REST), которое обеспечивает безопасность номеров.

Уоррен, мы работаем бесплатно и оплачиваем аккаунты в одной базе данных. Это одна база данных на приложение. Одна база данных на учетную запись обычно очень плохая идея. Обычно данные довольно нормализованы, но мы определенно не религиозны по этому поводу. Я обычно ценю свой исходный код над моей схемой. Так что, если я смогу улучшить / улучшить исходный код, согнув схему, я обычно это делаю. Но начните с нормализации и денормализации, как того требует производительность или структура кода.

Джейсон, мы используем электронную почту для смс. Все американские перевозчики имеют шлюз phone@carrier-gateway.com.

Джейк Хорошо, ааа, вопрос "но разве это масштабно"? Я ответил на это пару лет назад. С тех пор для нас ничего не изменилось. Мы обрабатываем миллионы и миллионы динамических запросов каждый день, даже не прибегая к большому количеству кэширования (большинство экранов в большинстве наших приложений отличаются для каждого пользователя, поэтому традиционные схемы кэширования сложнее применять).

Существует множество других приложений Rails, которые обрабатывают десятки миллионов ежедневных запросов. Все они более или менее придерживаются одного и того же подхода к Shared Nothing. Все методы для масштабирования выше и выше. Это вряд ли решение под ключ, но все, что обещает быть, обычно просто полно.

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

Нормальная настройка хранилища данных на основе реляционной базы данных будет customer_id внешний ключ на большинстве ваших таблиц. Тогда просто не показывайте эти данные никому, кроме этого клиента (или в тех случаях, когда они каким-то образом указали, что кому-то предоставлены явные разрешения).

Не беспокойтесь о проблемах масштабирования СУРБД, пока не появится впечатление, что в одной таблице может появиться несколько миллионов строк. Тогда, возможно, пришло время исследовать распределенное хранилище ключей / значений. Но имейте в виду, что проблема такого рода - хорошая проблема, потому что, вероятно, это означает, что вы зарабатываете кучу денег.

то есть пересеките масштабный мост, когда подойдете к нему. Создавайте вещи в меру своих нынешних способностей, но в противном случае преждевременная оптимизация является корнем всего зла.

Я работаю консультантом по ряду приложений SaaS, поэтому видел разные архитектуры. Я бы порекомендовал:

  1. Одна база данных для всех клиентов. Обязательно спроектируйте базу данных так, чтобы у вас был первичный ключ для пользователя, который является вашим собственным уникальным идентификатором. Я видел некоторые беспорядки, в которых дизайн эффективно (не на самом деле, но вполне мог) сделал что-то вроде электронной почты, номера телефона и т. Д. В качестве первичного ключа). Кроме того, не бросайте все в гигантскую таблицу пользователей.

    1. В какой-то момент вы захотите начать отслеживать поведение пользователей. Для этого вы можете использовать хранилище значений имен NoSQL и просто начать добавлять в него события для последующего анализа. Или используйте что-то вроде MixPanel или KISSmetrics.

    2. Отслеживайте ежедневные KPI, записывая строки в таблицу KPI, которые позволяют легко запрашивать то, что произошло с течением времени. В противном случае вы захотите задать вопросы БД и выяснить, что это гигантский запрос.

Основное преимущество наличия единой базы данных SQL состоит в том, что если ваш специалист по маркетингу знает SQL (рекомендуется!), Он может просто запросить его напрямую. Если вы пойдете по пути NoSQL, то это будет намного сложнее, и тогда маркетинг начнет делать предположения, которые обычно ошибочны, и вы тратите много времени на неверный путь, основанный на этих предположениях.

Другие вопросы по тегам