О, мой друг, вы просто усложняете весь сценарий, но это не ваша вина, компании, такие как MSFT, Oracle и другие крупные производители программного обеспечения корпоративного класса, хотели бы сделать большую картину того, что проще, и они делают это по какой-то причине: масштабирование сервисов по вертикали означает больше лицензий.
Вы можете принять другой подход и забыть на мгновение обо всех этих больших словах, EJB, JPA ... и, как кто-то умный, однажды сказал, разделил большую проблему на более мелкие части, чтобы вместо того, чтобы иметь большую проблему, вы есть пара небольших проблем, которые в теории должны быть легче иметь дело.
Итак, у вас есть несколько услуг в вашей системе: люди, платежная система, заказы, продукты, ERP ... на мгновение позволяют подумать, что эти границы правильные с точки зрения субъектов бизнеса. Представьте, что эти услуги - это разные физические отделы вашей компании, а это значит, что они заботятся только о данных, которые принадлежат им, и ничего больше.
Вы могли бы затем сказать, что отдел платежей имеет свою собственную базу данных, то же самое относится и к Приказам, конечно, им все еще нужно общаться друг с другом, как и все отделы, и это можно сделать легко с помощью сгенерированного системой открытого суррогатного ключа , Все это означает, что каждая служба поддерживает ссылочную целостность всех своих внутренних объектов, используя внутренние ключи, но если записи необходимо сделать доступными для других служб, вы можете, например, использовать ключ Guid, например.:
Служба платежей необходимо идентификатор заказа и идентификатор клиента, но эти лица принадлежат их собственным услугам, так что вместо обмена секретного ключа (первичный ключ) каждую запись, каждая запись будет иметь вместо этого первичный ключ и суррогатный внешний ключ, который сервисы будут использовать для совместного использования. Дело в том, что вы должны стремиться к созданию спаренных услуг, каждый со своей собственной «небольшой» базой данных. Каждая служба также должна иметь каждый собственный API, который должен использоваться не только передним концом, но и другими службами. Еще одна вещь, которую вам следует избегать, заключается в использовании DTC или другого поставщика управления транзакциями в качестве гаранта транзакций для всей службы, это то, что может быть легко архивировано с использованием другого архитектурного подхода.
В любом случае, прочитайте, если у вас еще нет DDD, он даст вам другой обзор о том, как создать программное обеспечение корпоративного класса и btw EJB, убежать от них.
UPDATE:
Вы можете использовать что-то вроде событий SOA, но позволяет держать вещи простыми здесь. Зарегистрированный клиент приходит на ваш сайт для размещения заказа. Служба, ответственная за это, - это Заказы. Список внешних идентификаторов для продуктов отправляется службе Ордеров, которые затем регистрируют заказ, на данный момент заказ находится в состоянии «ожидающего платежа», и эта служба возвращает общедоступный идентификатор заказа Guid. Для того чтобы заказ был завершен, клиенту необходимо оплатить товар. Детали оплаты передаются в службу оплаты, которая пытается обработать платеж, но для этого ему нужны детали заказа, поскольку единственное, что отправил frontend, - это идентификатор заказа, и для этого он использует GetOrderDetails (Guid orderId) из API заказа. Как только платеж будет завершен, услуга «Платежи» вызывает еще один метод API-заказа OrderWasCompletedForOrder (Guid orderID). Дай мне знать, если что-то не получишь.
«этот [только] работает хорошо для операционной стороны приложения, так как вам нужно всего несколько элементов от каждой службы». действительно, в этом проблема: обычно нам нужно много данных из разных сервисов, сложных поисков и поиска в режиме реального времени в пользовательском интерфейсе. Что касается агрегированной отчетности, я вижу очень мало случаев, когда эти данные можно считать неизменяемыми (так что обычно денормализация вводит проблемы синхронизации). – gpilotino
Ну сказал Армон. Я думаю, что лучшее для @gpilotino - немного прочитать о DDD; это очень хорошая книга: http://www.infoq.com/minibooks/domain-driven-design-quickly, и перейдите оттуда. – Marco
Отсутствие денормализации @gpilotino не вызывает проблем с синхронизацией, не знаю, откуда вы это взяли. Использование разных моделей записи и чтения действительно может привести к проблемам синхронизации, но это не имеет ничего общего с денормализованными данными. – Marco