Рубрики
Uncategorized

Создание мультирентной модели данных SaaS

Это работает на базовой модели данных SaaS Multiantal SaaS. Пользователи, учетные записи, планы, этот тип вещей. При строительстве этого я нашел его удивительно трудно найти какую-либо твердую информацию в газилии разрабатывателя и блогах Startup; Большинство были просто расплывчатыми деталями реализации. Теги от SaaS, DevOps, Postgres, API.

Это работает на базовой модели данных SaaS Multiantal SaaS. Пользователи, учетные записи, планы, этот тип вещей. При строительстве этого я нашел его удивительно трудно найти какую-либо твердую информацию в газилии разрабатывателя и блогах Startup; Большинство были просто расплывчатыми деталями реализации.

Краткая версия: Postgres. Это абсолютно фантастический инжиниринг. Запустите его на Heroku, это просто работает ™, и это заставляет меня чувствовать себя как некоторые гризели, элитный спецназ Commando у меня есть спина.

Длинная версия: в альтернативной вселенной я бы проверил полностью на AWS Dynamodb. Способ ума полностью управляемый — веб-масштаб … — База данных приносит вам просто удивительно, когда вы хотите сосредоточиться на клиентах вместо управления базами данных.

Поэтому я фактически пытался получить модель SaaS в Dynamodb. Это упражнение было настолько совершенно неудачно, это на самом деле заставляет меня смеяться сейчас. Ограничения на первичному ключу и одному клавишам диапазона делают его просто очень плохо подходящим для этого случая использования. AWS есть запись на том, как что-то подобное может быть достигнуто. Я никогда не видел лучшего примера «Shoehorning».

Монгодб тогда?

Это действительно могло работать. Все еще нет реальных отношений, но у Монго есть способы сделать эту работу. К сожалению, мой мозг просто не может привыкнуть к языку запроса MongoDB: я обнаружил, что драйвер Defacto Node.js Mongoose запутанный беспорядок, особенно документация. Кроме того, я знал, что собираюсь сделать тонну агрегации на метриках (средних, процентилей и т. Д.) И особенности агрегации Монго были очень минимальными.

Dynamodb, а также MongoDB — это совершенно действительные продукты. Просто не используйте его для чего-то реляционного (ISH). Ум взорвался.

Кроме того, Postgres довольно ловкий, даже с терабайтами данных и высоким трафиком чтения/записи.

Агрегация Postgres и использование памяти являются лучшими в классе. Это также последовательно в топ-3 в этом эталоном на других рабочих нагрузках https://www.arangodb.com/wp-content/uploads/2018/02/update-benchmark-2018.001.jpeg Таким образом, Postgres это было. Далее!

Короткое взаимосвязь до того, как мы погрузимся в фактическую модель данных. Как мы обращаемся к разбиению клиентов на самом высоком уровне реализации теперь, когда мы выбрали Postgres?

Есть пара вариантов там:

Один арендатор, одна база данных: каждый арендатор своя собственная экземпляра базы данных. 100% разделение. Если вы ожидаете либо очень высокие требования к безопасности от клиентов или ожидаете необходимости масштабировать части вашей платформы для конкретных клиентов, подумайте о продавщике, как размер. Одна база данных, схема на одного клиента: единая база данных, с отдельной схемой для каждого клиента. Дублирующие столы для каждой схемы. Это может сделать мигрирование особенно тяжелым пользователям на более высокие спектрические машины. Он также еще более безопасен, поскольку вы используете встроенную модель безопасности ваших СУБД. Одна база данных, одна схема: только одна схема, которая содержит все таблицы и «идентификатор учетной записи» для каждого арендатора. Это модель, которую мы выбрали для проверки, так как все вышеперечисленные проблемы являются/были не применимы к проверке. Ожидаемые моделей использования и потребности в хранении также не такие массивные

Проверка и многие другие типичные фокусированные B2B SAAS структурированы следующим образом:

Пользователи принадлежат к учетной записи, а также иногда называют организацией. Учетная запись может иметь несколько пользователей, и пользователи могут переключаться между несколькими учетными записями. Это специально интересно, если предлагая продукт, направленный на агентства или более крупные организации, в которых один клиент может фактически «владеть» несколько учетных записей. Учетные записи имеют настройки, предпочтения и ресурсы, связанные с ним. Они применяются к каждому пользователю, связанным с этой учетной записью. Пользователи могут устанавливать личные предпочтения на ссылку. Пользователи могут иметь конкретные права доступа в счет. Для достижения этого мы используем следующую схему данных:

Давайте перейдем на каждый стол и укажите, что интересно:

1. Пользователи

Таблица пользователей довольно просты. Он содержит основные детали, которые мы составляем из социального логина (Google & Github в нашем случае) или от регистрации электронной почты. Обратите внимание, что нет поля пароля. Мы используем для этого AUTH0.

2. Членство

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

Контроль доступа: поле доступа — это Enum, который содержит одну из возможных пользовательских ролей в виде константы строки, I.E: read_only, read_write, admin или владелец. Фактическое исполнение этих ролей осуществляется в API, но это история в другой раз. Пользовательские предпочтения в соответствии с учетными записями: поле Comment_Weekly_Summary является примером определенного настройки, которые пользователь может захотеть переключиться за учетную запись.

3. Счета

Это где мясо. Первичный ключ таблицы счетов ссылается как внешний ключ во многих, многих других таблицах. Счета, призлы, команда, приглашенные и т. Д. Все ссылаются на таблицу аккаунтов.

Помимо того, чтобы быть корнем для почти всех ресурсов во всем приложении, таблица счетов имеет три основных функция:

Циклы подписки и биллинга

Нам нужно отслеживать, если платежи изготавливаются каким-либо образом. В примере вы можете увидеть STRIPE_CUSTOMER_ID, STRIPE_SUBSCRICE_ID и поля rece_Period_ends. Когда пользователь подписывает платный план, мы используем STRIPE WebHooks для заполнения этих полей. На каждом последующем цикле выставления счетов наш API получает еще один звонок веб -ook, и мы поднимаемся в поле The Date_Period_ends.

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

Пределы плана

Каждый план клиентов может подписаться на ограничения объема, связанные с ними. В нашем случае это такие вещи, как количество чеков, сумма командных товарищ, SMS-сообщений, отправленных в месяц. Верхние пределы для этого записываются в поле, такое как Max_api_checks из примера. Эти пределы устанавливаются при подписке и примените на более высокий/нижний план. Больше на этом ниже.

План функции переключается

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

Для моделирования этого мы используем поле функций, которое имеет тип строкового массива, довольно хорошая функция в Postgres. Он содержит набор строковых постоянных, таких как SMS_ALERTS, SETUP_TEARDOND и PROMETHEUS. Каждая констанция связана с функцией, и мы используем их для обеспечения применения пределов в API на бэкэнде и показать приятный подсказку пользователям, что функция доступна только после обновления.

Покажите кнопку обновления, когда функция не находится в массиве объектов Фунок совет 👉. Мы на самом деле поднимаем дату quice_period_ends + некоторые дополнительные льготы. Будет сосать, если мониторинг снизится из-за раздражения, но доброкачественная проблема карты.

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

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

Хотите на заказ план, который имеет чуть больше чеков API? Мы можем это сделать. Просто обновите конкретную строку аккаунта и настройте ежемесячную цену на полосою. Хотите дать доступ к новой функции для небольшого набора пользователей? Просто обновите массив функций для простой учетной записи. Позже переверните его всем клиентам. Кому нужна сложная система переключения функций?

Так что на самом деле это подписка в этом контексте? Хороший вопрос, так как он не имеет прямого представления в этой модели. В самых буквальном смысле это входит в список SCOICEMENT_SUCECEDEDEDEDEDEDECEDEDEDED, и говорит нам ID клиента X с подпиской ID Y только что заплатили.

Все остальное отделено: фактическая цена в месяц/в год, интервал выставления счета, какие функции вы получаете и какие ограничения громкости применяются. Этот развязка затем позволяет вам экспериментировать больше с ценой и точным составом ваших планов. На самом деле, все проверяемое приложение не имеет «знания» ценообразования, за исключением некоторой разметки на https://checklyhq.com/pricing страница.

Эта статья была ранее опубликована на Контролировать блог

Оригинал: «https://dev.to/checkly/building-a-multi-tenant-saas-data-model-ac0»