SaaS / Multi-Tenancy подходы для веб-приложений на основе Java (GWT, Spring, Hibernate) - PullRequest
27 голосов
/ 28 марта 2011

В настоящее время я планирую преобразовать однопользовательское веб-приложение на основе Java, которое использует Spring, GWT, Hibernate, Jackrabbit, Hibernate Search / Lucene (среди прочих) в полноценное приложение в стиле SaaS.

Я наткнулся на статью, в которой выделены следующие 7 «вещей» как важные изменения, которые необходимо внести в одно приложение-арендатор, чтобы сделать его SaaS-приложением:

  1. Приложение должно поддерживать многопользовательскую среду.
  2. Приложение должно иметь определенный уровень регистрации самообслуживания.
  3. Должен быть установлен механизм подписки / биллинга.
  4. Приложение должно иметь возможность эффективно масштабироваться.
  5. Должны быть предусмотрены функции для мониторинга, настройки и управления приложением и арендаторами.
  6. Должен существовать механизм для поддержки уникальной идентификации пользователя и аутентификации.
  7. Должен быть механизм для поддержки определенного уровня настройки для каждого арендатора.

Мой вопрос: кто-нибудь реализует?Что-нибудь из перечисленных выше 7 вещей в SaaS / мультитенантном приложении, использующем технологии, аналогичные тем, которые я перечислил?Я стремлюсь получить как можно больше информации о наилучших способах сделать это, прежде чем идти по пути, который я рассматриваю в настоящее время.

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

IТем не менее, у нас есть некоторые проблемы с производительностью, особенно когда число наших арендаторов довольно велико.

Буду весьма признателен за любые предложения о том, как реализовать такое решение (и я извиняюсь, если этот вопрос слишком открыт)-ended).

Ответы [ 5 ]

13 голосов
/ 19 апреля 2011

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

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

  1. настройка уровня арендатора: а) темы и логотипы пользовательского интерфейса; б) формы и сетки; в) расширения модели данных и настраиваемые поля; г) шаблоны уведомлений; д) получение списков и основных данных
  2. создание уровня клиента и управление ролями и привилегиями, разрешениями доступа на уровне поля, политиками области данных
  3. настройки управления доступом уровня арендатора для модулей и функций, чтобы можно было включать / отключать определенные модули и функции в зависимости от пакета подписки.
  4. Измерение и мониторинг задач / событий / транзакций и ограничение контроля доступа после превышения купленной квоты. Способность измерять любую новую сущность в будущем, если и когда ваша бизнес-модель изменится.
  5. Вывод бизнес-правил и рабочих процессов из базы кода и представление их в качестве метаданных, чтобы вы могли настраивать их для каждой группы / арендатора.
  6. Конструктор запросов для создания пользовательских отчетов, который знает об арендаторе, а также о пользовательских полях, добавленных определенными арендаторами.
  7. Инкапсуляция арендатора и управление строкой соединения на уровне структуры, так что разработчикам не нужно беспокоиться об идентификаторах арендаторов при написании запросов.

Все это основано на нашем опыте создания универсальной многопользовательской среды, которая может использоваться для любого домена или приложения. К сожалению, вы не можете использовать наш фреймворк, так как он основан на .NET

Но инженерные потребности любого мультитенантного SaaS-продукта (нового или перенесенного) одинаковы независимо от используемого вами стека технологий.

4 голосов
/ 30 марта 2011

Все перечисленные вами технологии довольно распространены и приемлемы как для одно-, так и для мультитенантных приложений.Я бы сказал, что поддержка 7 «вещей» для SaaS - это скорее функция того, как вы используете технологии, а не то, какие именно.Похоже, у вас уже есть приложение для одного арендатора, которое работает.Так что, вероятно, нет особых причин отклоняться от выбора технологий, если что-то уже не работает очень хорошо.Ваш вопрос, в остальном, довольно открытый, поэтому трудно быть слишком конкретным.

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

Есть несколько причин, по которым это может быть преимуществом.Одним из них является производительность, как вы упомянули.Добавление идентификатора клиента в каждую отдельную таблицу приводит к дополнительным расходам на доступ к диску, времени запроса и увеличивает сложность кода.Каждый индекс в базе данных также должен включать идентификатор клиента.Вы рискуете смешать данные между арендаторами, если не будете осторожны (хотя фильтр Hibernate поможет смягчить это).Имея базу данных на каждого арендатора, вы можете ограничить доступ только к правильной.Портирование вашего текущего приложения, вероятно, будет также намного проще, вам просто нужно перехватить ваш запрос где-то на раннем этапе, чтобы выбрать арендатора на основе URL-адреса и указать нужную базу данных.Резервное копирование также легко сделать для каждого клиента, что особенно полезно, если вы когда-нибудь захотите разрешить ему загрузить резервную копию.

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

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

0 голосов
/ 12 апреля 2018

То, что вы описываете, представляет собой полнофункциональное приложение в стиле Saas, обслуживающее нескольких арендаторов. Есть несколько вещей, которые вы должны решить, например, насколько важна изоляция данных? Если вы строите для медицинской или финансовой области, изоляция данных является критическим фактором.

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

Поскольку вы используете стек Java, Spring, Hibernate, я могу помочь вам с небольшим примером приложения, которое я написал. Это рабочий пример, который вы можете быстро запустить на своем локальном ноутбуке. Я поделился этим здесь . Посмотрите и дайте мне знать, если он отвечает на некоторые ваши вопросы.

0 голосов
/ 16 апреля 2012

Для (1): Hibernate поддерживает многопользовательские конфигурации из коробки из версии 4. На момент написания статьи поддерживаются DB-per-tenant и schema-per-tenant, а все арендаторы хранятся в одной БД с использованием дискриминатора.пока не поддерживается.Мы успешно использовали эту функциональность в нашем приложении (подход DB-per-client).

Для (3): После некоторого расследования мы решили пойти с Брейнтри, чтобы осуществить выставление счетов.Многие люди рекомендуют другие решения: Authorize.net, Stripe, PayPal.

Для (4): мы использовали кластерную конфигурацию с Hibernate / Spring и JBoss Cache для кэширования 2-го уровня.В наши дни это стало «обычным делом», и с помощью PaaS-сервисов, таких как Jelastic, вы даже можете предварительно настроить его из коробки.

0 голосов
/ 29 января 2012

Простого ответа нет.Я могу описать свое собственное решение.Это может послужить источником вдохновения для остальных.

  • арендатор на базу данных (postgres)
  • одна дополнительная база данных, общая для арендаторов
  • Spring + MyBatis
  • Spring Security аутентификация

Подробности здесь: http://blog.trixi.cz/2012/01/multitenancy-using-spring-and-postgresql/

...