微服务,如果一项服务的数据依赖于另一项服务,如何解耦服务?
Microservices, How to decouple services if data on one service depends on other?
假设我有两个微服务,如下所示:
我有一项服务可以存储所有问题及其答案选项。第二个服务创建模块,将使用第一个服务的问题。
所以我们有 Question Service
和 Module Service
。
当我们创建模块时:
- 客户会提问
- 客户端将发送
question_id
和模块数据
用户何时会尝试完成此模块:
- 客户端将查询模块
- 到
question_id
它将获得问题及其选项以显示为测试。
现在有一个主要问题。 模块服务如何知道用户的答案是否正确?
现在我认为解决这个问题的两种方式:
客户端会询问Question Service
这个答案是否正确,然后将结果发送给Module Service
。但是,这种方法是不可靠的,因为来自 Client 的请求可以被伪造并且 Module Service
将存储不正确的结果
客户端将向 Module Service
发送答案检查请求,然后通过直接 HTTP 调用向 Question Service
发送请求。这也是一个糟糕的解决方案,因为这使得 Module Service
与 Question Service
.
紧密耦合
是否有任何解决方案可以将 Module Service
与 Question Service
分离?
做到这一点并且不耦合这两个服务的最佳方法是使用消息队列,它可以是 rabbitmq、kafka 或任何其他可以作为这两个服务的中间工具。
当用户试图回答问题时,他将他的答案发送给问题服务,因为它是知道答案的人。然后问题服务检查答案是否正确,并通过消息队列向模块服务发送一条消息,指示用户、模块 ID、试图回答的问题和结果。
然后,模块服务将收到消息并正确更新此用户模块
假设我有两个微服务,如下所示:
我有一项服务可以存储所有问题及其答案选项。第二个服务创建模块,将使用第一个服务的问题。
所以我们有 Question Service
和 Module Service
。
当我们创建模块时:
- 客户会提问
- 客户端将发送
question_id
和模块数据
用户何时会尝试完成此模块:
- 客户端将查询模块
- 到
question_id
它将获得问题及其选项以显示为测试。
现在有一个主要问题。 模块服务如何知道用户的答案是否正确?
现在我认为解决这个问题的两种方式:
客户端会询问
Question Service
这个答案是否正确,然后将结果发送给Module Service
。但是,这种方法是不可靠的,因为来自 Client 的请求可以被伪造并且Module Service
将存储不正确的结果客户端将向
Module Service
发送答案检查请求,然后通过直接 HTTP 调用向Question Service
发送请求。这也是一个糟糕的解决方案,因为这使得Module Service
与Question Service
. 紧密耦合
是否有任何解决方案可以将 Module Service
与 Question Service
分离?
做到这一点并且不耦合这两个服务的最佳方法是使用消息队列,它可以是 rabbitmq、kafka 或任何其他可以作为这两个服务的中间工具。
当用户试图回答问题时,他将他的答案发送给问题服务,因为它是知道答案的人。然后问题服务检查答案是否正确,并通过消息队列向模块服务发送一条消息,指示用户、模块 ID、试图回答的问题和结果。 然后,模块服务将收到消息并正确更新此用户模块