Архитектурный выбор для CRM - PullRequest
0 голосов
/ 20 января 2019

Я ищу некоторый свет в сложности архитектурного выбора, прежде чем начать разработку CMS, CRM или ERP.

Мне удалось найти подобный вопрос: Архитектура CRM (приложение с открытым исходным кодом) Но оно кажется достаточно старым.

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

Что мне не нравится во всех примерах микросервисов и распределенных систем, которые можно легко найти в сети, так это то, что они всегдаВозьмем электронную торговлю в качестве примера (клиенты, заказы, продукты ...).И для такого рода примера существует несколько баз данных (как правило, NoSQL DB от microservice).Я вижу преимущество (более или менее) ==> в минималистском представлении необходимых данных для каждого контекста.

Но как перейти к уникальной и реляционной базе данных?Я действительно думаю, что мне нужна единая реляционная база данных, работая в компании, производящей CRM (без доступа к исходному коду машины, но со структурой базы данных), я мог видеть важность реляционной базы данных: необходимо для списков, отчетови просмотрите ссылки между сущностями в CRM (у контакта может быть несколько компаний и, наоборот, у каждого пользователя есть несколько действий, задач, но каждая из его задач также может быть назначена другим пользователям или даже связана с другими элементами, такими как: "contact", "company", "публикация", "calendarDate" и т. д. И в каждой таблице может быть много записей (+ 100 000 строк), поэтому выбор индексов будет весьма важным, а транзакции - всевозможными.- присутствует, потому что будет много одновременного доступа к записям данных.)

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

Чтобы попытаться быть точным и не идти во всех направлениях, у меня есть 2 вопросаспросить:

  1. Можем ли мы легко смешать философию DDD с монолитной системой, развязав при этом очень небольшое количество (для возможных услуг, которые должны быть абсолютно разнесены по разным причинам)?Если да, могу ли я попросить ресурсы, где я мог бы узнать больше об этом?
  2. Обязательно ли нам нужно работать со множеством баз данных, и это обязательно должно быть mongoDb, nosql?Я могу себе представить, что ответ - нет, но могу я попросить рассказать немного подробнее?Или перенаправить меня на статьи, которые дадут мне достаточно четких ответов?

Заранее спасибо!

(Это будет .NET Core, черновик здесь: https://github.com/Jin-K/simple-cms)

1 Ответ

0 голосов
/ 21 января 2019

DDD отлично подходит в качестве подхода при разработке вашего CRM.Я использовал его в своем последнем проекте (веб-CRM), и это было именно то, что мне нужно.На самом деле, если бы я не использовал DDD, было бы невозможно управлять.CRM, который я создал (единственный архитектор и разработчик), был очень сложным и очень индивидуальным.Он интегрируется со многими внешними системами (т. Е. С сервером электронной почты и системой телефонных звонков).

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

Для каждого БК я создал модуль.Мне не нужны были микросервисы, модульный монолит был просто идеален.Я использовал Закон Конвея , чтобы обнаружить БК.Я заметил, что у каждого отдела были общие, но и разные потребности от CRM.

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

Базы, относящиеся к конкретным отделам, имели очень разное поведение для сходных понятий.Например, отдел продаж и отдел обработки данных предъявляли разные требования к контракту, поэтому я создал два агрегата с именем Contract, которые имели один и тот же идентификатор, но у них было другое поведение «данные +».Чтобы держать их "синхронизированными", я использовал Saga / Process Manager.Например, когда контракт был активирован (вручную или после первого платежа), тогда был создан DataProcessingDocument, содержащий данные, основанные на содержании контракта.

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

Источником правды для черновиков электронных писем является CRM с модулем Email composer.Если черновик больше не отображается, то это означает, что он был удален пользователем CRM.

Когда CRM не является источником правды, тогда код должен иметь небольшое поведение или вообще не иметь его, а данные должны быть в основномнеизменный.Здесь у вас может быть CRUD, если только у вас нет проблем с производительностью (т.е. миллионов записей), и в этом случае вы можете использовать CQRS.

И в каждой таблице может быть много записей (+ 100 000 строк), поэтому выбор индексов будет весьма важен, а транзакции присутствуют повсеместно, потому что будет много одновременного доступа к записям данных.

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

Я также использовал CQRS, где у меня было много разных представлений / проекций/ интерпретации одних и тех же событий.

Обязательно ли нам нужно работать с множеством баз данных, и должно ли это быть обязательно mongoDb, nosql?Я могу себе представить, что ответ - нет, но могу я попросить рассказать немного подробнее?Или перенаправьте меня на статьи, которые дадут мне достаточно четкий ответ

Конечно, нет.Используйте все, что работает.Я использовал MongoDB в 95% случаев, а Mysql только для модуля поиска.Управлять только системой баз данных было проще, а производительность / масштабируемость / доступность были достаточно хорошими.

Надеюсь, эти мысли помогут вам.Удачи!

...