Меня заинтересовал фреймворк молекулер как управляемый событиями подход к микросервисам Node. Несмотря на то, что это очень гибкая структура с точки зрения db и транспортных адаптеров, а также множества способов ее реализации, в модели как услуге есть кое-что, что мне не подходит, исходя из доменно-управляемого дизайна (DDD) перспектива.
Скажем, у меня есть пользователи и адресные объекты. Теперь, если я знаю, что только пользователи могут иметь адрес, я не понимаю, почему адрес должен быть его собственной службой. Конечно, если позже я добавлю сущность Компании, у которой также может быть Адрес, это может иметь смысл - но скажу, что знаю точно, что этого не произойдет.
Когда я намеревался построить это, я боролся с этой концепцией. Ни в коем случае я не ожидаю доступа к Address вне контекста пользователей. Я верю в DDD, адрес упоминается как объект значения. Например, мне не нужно Address.get(id)
.
Итак, я подумал, что собираюсь создать служебную папку, в которой будут содержаться модели ORM, относящиеся к Пользователям, и будет предоставлена внутренняя служба для записей Пользователей и отдельный сервер graphql, для которого может быть сшита служба шлюза graphql.
users
|--usersService.js // write actions only
|--usersGQL.js // resolves queries to models, mutations to service
|--models
|--address.js // sequelize model
|--users.js // sequelize model
|--index.js // db connection
Независимо от graphql, есть ли способ реализовать указанную выше структуру папок или люди, использующие молекулярный механизм, считают это неправильным использованием фреймворка?
Из всех примеров молекул, которые я видел, сервис - это отдельный файл, который (в случае сиквелиза) также определяет модель. Он содержит как геттеры, так и сеттеры.
Я бы подумал о том, чтобы предоставлять данные запроса шлюзу отдельно от основного сервиса. Реализация шаблона CQRS с использованием сшивания graphql или federation , вероятно, будет лучшим решением для объединений между службами - возможным решением этой проблемы .
Служба получает (читает действия) от других служб, также не должна регистрироваться как событие домена и не должна происходить часто. Что приводит к другому вопросу - как внедрить сагу (транзакции с состоянием, обратимые, кросс-сервисные транзакции) в молекулу?