【发布时间】:2019-11-01 09:22:35
【问题描述】:
这是我在here 概述的问题的后续问题。
网关充当应用程序的入口点,客户端的每个请求都向该应用程序发出。然后网关将请求分配给负责的微服务并处理身份验证。
在这种情况下,网关监听HTTP POST /bok 并通知Microservice A 创建一本书。因此Microservice A ist 负责管理和存储有关图书实体的所有内容。
以下伪代码是该架构的简化实现:
网关
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);
})
但我对此不太确定,原因如下:
- 每次用户请求创建新书时,都会重新创建在
Gateway中使用BookCreated的侦听器 - 如果 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 请求是不是效率很低?
【问题讨论】:
-
我有点搞不懂网关在这里是什么意思。通常网关是 api 网关或任何可以用作网关的应用程序。你能解释一下你到底想达到什么目的吗?实际上是您要解决的业务案例?你认为每个微服务会做什么?
-
对不起,我在顶部添加了几行:)
-
我认为这里的问题是网关的作用。在您的案例中,“网关”似乎是一个处理编排和通信逻辑的自定义应用程序(即发布和消费到/从适当的主题)。也许您应该尝试将图表中的“网关”替换为“微服务”,这可能有助于您确定哪种方法更好。
-
如果我这样做,我会采用哪种方法(1 或 2)?
-
我也忘了,网关应该处理身份验证
标签: node.js architecture microservices cqrs event-sourcing