微服务创建实体实现

2023-12-27

这是我概述的问题的后续问题here https://stackoverflow.com/q/56622485/8586803.

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

在这种情况下,网关监听HTTP POST /bok并通知Microservice A创作一本书。因此Microservice A负责管理和存储有关图书实体的所有内容。


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

Queue Communication queue communication

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

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

  1. 消费的监听者BookCreated in the Gateway每次用户请求创建新书时都会重新创建
  2. 如果 2 个用户同时创建一本书并且返回错误的书怎么办?
  3. 我不知道如何获取额外的数据(例如getUserFromOtherMicroService)

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

Direct and Queue Communication direct communication

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

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

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

根据以上评论。

方法一

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

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

方法2

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

微服务创建实体实现 的相关文章

随机推荐