这是我概述的问题的后续问题here https://stackoverflow.com/q/56622485/8586803.
网关充当应用程序的入口点,来自客户端的每个请求都会发送到该应用程序。然后,网关将请求分配给负责的微服务,并处理身份验证。
在这种情况下,网关监听HTTP POST /bok
并通知Microservice A
创作一本书。因此Microservice A
负责管理和存储有关图书实体的所有内容。
以下伪代码是该架构的简化实现:
Queue Communication
![queue communication](https://i.stack.imgur.com/MX3JR.jpg)
Gateway
router.post('/book', (req, res) => {
queue.publish('CreateBook', req.body);
queue.consume('BookCreated', (book) => {
const user = getUserFromOtherMicroService(book.userId);
res.json({ book, user });
});
});
微服务A
queue.consume('CreateBook', (payload) => {
const book = createBook(payload);
eventStore.insert('BookCreated', book);
const createdBook = updateProjectionDatabase(book);
queue.publish('BookCreated', createdBook);
})
但我对此不太确定,原因如下:
- 消费的监听者
BookCreated
in the Gateway
每次用户请求创建新书时都会重新创建
- 如果 2 个用户同时创建一本书并且返回错误的书怎么办?
- 我不知道如何获取额外的数据(例如
getUserFromOtherMicroService
)
这就是我考虑实现这种架构的原因:
Direct and Queue Communication
![direct communication](https://i.stack.imgur.com/tkZUW.jpg)
Gateway
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
or ERROR
)
- 在微服务系统中再次发出HTTP请求不是效率很低吗?