Это дополнительный вопрос к моей проблеме, обрисованный в общих чертах здесь .
Шлюз служит точкой входа в приложение, к которому выполняется каждый запрос от клиента.Затем шлюз назначает запрос ответственным микросервисам и также обрабатывает аутентификацию.
В этом случае шлюз прослушивает HTTP POST /bok
и уведомляет Microservice A
о создании книги.Таким образом, Microservice A
несет ответственность за управление и хранение всего сущности книги.
Следующий псевдокод представляет собой упрощенную реализацию этой архитектуры:
Связь через очередь
Шлюз
router.post('/book', (req, res) => {
queue.publish('CreateBook', req.body);
queue.consume('BookCreated', (book) => {
const user = getUserFromOtherMicroService(book.userId);
res.json({ book, user });
});
});
Microservcie A
queue.consume('CreateBook', (payload) => {
const book = createBook(payload);
eventStore.insert('BookCreated', book);
const createdBook = updateProjectionDatabase(book);
queue.publish('BookCreated', createdBook);
})
Но я не совсем уверен в этом из-за следующих причин:
- Слушатель для использования
BookCreated
в Gateway
будет воссоздан каждый раз, когда пользователь запрашивает создание новой книги - Что, если 2 пользователя одновременно создадут книгу и будет возвращена не та книга?
- Я не знаю, как получить дополнительные данные (например,
getUserFromOtherMicroService
)
Вот почему я думаю о реализации этой архитектуры:
Прямая и очередь связи
Шлюз
router.post('/book', async (req, res) => {
const book = await makeHttpRequest('microservice-a/create-book', req.body);
const user = await makeHttpRequest('microservice-b/getUser', book.userId);
res.json({ book, user });
});
Микросервис A
router.post('/create-book', (req, res) => {
const book = createBook(req.body);
eventStore.insert('BookCreated', book);
const createdBook = updateProjectionDatabase(book);
queue.publish('BookCreated', createdBook);
res.json(createdBook);
})
Но я также не совсем уверен в этомэто реализация, потому что:
- Разве я не нарушаю CQRS, когда возвращаю книгу после создания?(потому что я должен только возвратить
OK
или ERROR
) - Разве неэффективно сделать еще один HTTP-запрос в системе микросервисов?