Архитектура для приложения RoR SaaS - PullRequest
10 голосов
/ 03 марта 2011

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

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

Это легко сделать с помощью поддоменов?Могу ли я загрузить разные конфигурации на основе этого?Кто-нибудь знает, как 37 сигнальных приложений управляют различными конфигурациями на основе учетной записи?

Ответы [ 2 ]

6 голосов
/ 16 марта 2011

Когда мы принимали одно и то же решение для нашего приложения, мы рассмотрели несколько вещей ...

Прежде всего, мы рассмотрели сложность. Когда вы начинаете добавлять несколько клиентов в одну базу данных, вам нужно подумать о том, как вы собираетесь сегментировать их данные. Если вы написали приложение для одного клиента, вам, скорее всего, не пришлось об этом слишком беспокоиться. Во многих случаях эти проблемы коренятся в базовой модели данных, что приведет к рефакторингу lot (если не к полной перезаписи).

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

Во-вторых, мы рассмотрели стоимость. Если учесть, что мы можем запустить нескольких клиентов в их собственных экземплярах Rails в одном и том же экземпляре Amazon EC2 со своими собственными базами данных Amazon RDS в одном и том же экземпляре RDS, затраты стали очень привлекательными. Поскольку у нас есть приложение для бизнеса, и в ближайшее время у нас не будет более 200 клиентов, мы, вероятно, говорим о нескольких тысячах дополнительных расходов на хостинг в течение 3-5 лет.

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

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

3 голосов
/ 03 марта 2011

Отказ от ответственности

Убедитесь, что вы действительно можете продать приложение, которое пишете, другим клиентам.Вы подписали контракт с вашим клиентом?Если это так, вполне вероятно, что они владеют правами на код, который вы пишете, и в этом случае вы будете нарушать ваш контракт.


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

Приложения 37s не допускают никакой настройки, кроме цветовой схемы, котораявероятно, сделано с помощью настройки, которая изменяет таблицу стилей.Например:

<%= stylesheet_link_tag(@tenant.style.name) %>

Вы должны загрузить арендатора на основе субдомена:

before_filter :load_tenant, :if => :tenant_request?
def tenant_request?
  request.subdomain.present? && !request.subdomain == 'www'
end    

def load_tenant
  @tenant = Tenant.find_by_name(request.subdomain)
end

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

<% if tenant.has_feature?(:messaging) %>
  <li><%= link_to 'Messages', messages_url %></li>
<% end %>

Убедитесь, что при любом выборе вы делаете простейшую вещь, которая работает.

...