gpt4 book ai didi

node.js - 微服务创建实体实现

转载 作者:太空宇宙 更新时间:2023-11-03 22:04:59 24 4
gpt4 key购买 nike

这是我概述的问题 here 的后续问题.

网关充当应用程序的入口点,客户端的每个请求都会发送到该应用程序。然后,网关将请求分配给负责的微服务并处理身份验证。

在本例中,网关监听 HTTP POST/bok 并通知微服务 A 创建一本书。因此,微服务 A 负责管理和存储有关图书实体的所有内容。

<小时/>

以下伪代码是此架构的简化实现:

队列通信 queue communication

网关

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);
})

但我对此不太确定,因为以下原因:

  1. 每次用户请求创建新书时,都会重新创建 Gateway 中用于消费 BookCreated 的监听器
  2. 如果 2 个用户同时创建一本书并且返回了错误的书怎么办?
  3. 我不知道如何获取其他数据(例如 getUserFromOtherMicroService)
<小时/>

这就是我考虑实现此架构的原因:

直接和队列通信 direct communication

网关

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);
})

但我也不太确定这个实现,因为:

  1. 创建后归还图书是否违反了 CQRS? (因为我应该只返回 OKERROR)
  2. 在微服务系统中再次发出 HTTP 请求不是效率很低吗?

最佳答案

基于上面的评论。

方法 1

在这种情况下,您的 api 网关将用于删除队列中的消息。如果您的流程需要很长时间并且您有队列工作人员坐在后面来获取消息并进行处理,则此方法更合适。但是您的客户端必须进行轮询才能获得结果。假设您正在寻找机票。你把消息丢掉。您将获得一个 ID 进行投票。您的客户将继续投票,直到获得结果。

但在这种情况下,您将面临一个挑战,当您删除消息时,您将如何生成客户端将轮询的 ID?您是否将 ID 分配给网关上的消息并放入队列中并返回相同的 ID 供客户端轮询以获取结果?同样,这种方法适用于网络/ worker 类型的场景。

方法 2

因为您的 API 网关是自定义应用程序,它将处理身份验证并将请求重定向到相应的服务。您的微服务 A 将创建书籍并发布事件,您的微服务 B 和 C 将使用它。您的网关将等待微服务 A 返回已创建书籍的 ID(或新创建对象的事件元数据)的响应,这样您以后就不会轮询它,并且客户端拥有它。如果您愿意,您可以从其他微服务获取其他信息,您可以在此时获取并发送聚合响应。

对于微服务 A、B、C 中可用的任何数据,您将通过网关获取。确保您的网关具有高可用性。

希望有帮助。如果您有任何疑问,请告诉我!

关于node.js - 微服务创建实体实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56654068/

24 4 0
文章推荐: c# - 提高 TextFile 的读取效率(更大的文件类型)
文章推荐: css -
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com