我们正在使用 Sangria Graphql 来处理中继查询。从 UI 获取查询的 Graphql 代码生成一条 kafka 消息,适当的微服务使用并处理它,然后将消息发布到 Graphql 代码使用的 kafka。问题是我们的graphql消费者如何将结果映射到原始请求并将其发送回客户端?
val StoreType = ObjectType("Store", List[Field[UserRepo, Unit]](
Field("cart", Cart,
arguments = cart_id :: user_id :: sku_id :: quantity :: price :: operation :: Nil,
resolve = c ⇒ c.ctx.callCartService(c arg cart_id, c arg user_id, c arg sku_id, c arg quantity,c arg price, c arg operation))
))
callCartService 将向 kafka 生成消息以发送到购物车微服务,该微服务会将购物车消息发送回 kafka 以供 Graphql 使用。
QueryParser.parse(query) match {
// query parsed successfully, time to execute it!
case Success(queryAst) =>
complete(Executor.execute(SchemaDefinition.schema, queryAst, new UserRepo,
variables = vars,
operationName = operation
))
// can't parse GraphQL query, return error
case Failure(error) =>
complete(BadRequest, JsObject("error" -> JsString(error.getMessage)))
}
}
有没有办法等待消费者阅读购物车消息并返回给客户端?