Architecture 微服务,如果一个服务上的数据依赖于另一个,如何解耦服务?

Architecture 微服务,如果一个服务上的数据依赖于另一个,如何解耦服务?,architecture,microservices,decoupling,Architecture,Microservices,Decoupling,假设我有两个微服务,如下所示: 我有一个存储所有问题及其答案选项的服务。第二个服务创建的模块将使用第一个服务中的问题 因此,我们有问题服务和模块服务 当我们创建模块时: 客户将询问问题 客户将发送带有模块数据的question\u id 当用户尝试完成此模块时: 客户端将查询模块 通过question\u id它将获得问题及其选项以显示为测试 现在有一个主要问题模块服务如何知道用户的答案正确与否? 现在我认为解决这个问题有两种方法: 如果回答正确,客户端将询问问题服务,然后将结果发送到模块服务

假设我有两个微服务,如下所示:

我有一个存储所有问题及其答案选项的服务。第二个服务创建的模块将使用第一个服务中的问题

因此,我们有
问题服务
模块服务

当我们创建模块时:

  • 客户将询问问题
  • 客户将发送带有模块数据的
    question\u id
  • 当用户尝试完成此模块时:

  • 客户端将查询模块
  • 通过
    question\u id
    它将获得问题及其选项以显示为测试
  • 现在有一个主要问题模块服务如何知道用户的答案正确与否?

    现在我认为解决这个问题有两种方法:

  • 如果回答正确,客户端将询问
    问题服务
    ,然后将结果发送到
    模块服务
    。然而,这种方法是不可靠的,因为来自客户端的请求可能是伪造的,
    模块服务
    将存储不正确的结果

  • 客户端将向
    模块服务
    发送答案检查请求,然后通过直接HTTP调用将请求发送到
    问题服务
    。这也是一个糟糕的解决方案,因为这使得
    模块服务
    问题服务
    紧密耦合


  • 是否有任何解决方案可以将
    模块服务
    问题服务
    解耦?

    实现这一点且不耦合这两个服务的最佳方法是使用消息队列,它可以是rabbitmq、kafka或这两个服务的中间工具

    当用户试图回答一个问题时,他会将他的答案发送给问题服务,因为它是知道答案的人。然后,问题服务检查答案是否正确,并通过消息队列向模块服务发送一条消息,指示用户、模块ID、试图回答的问题以及结果。 然后,模块服务将接收消息并正确更新此用户模块