2

我有一个 Elixir Umbrella 应用程序,带有 Phoenix、Absinthe (graphQL)。在AppWeb,我的AppWeb.Router路线请求,处理/graphqlAbsinthe.Plug使用MyApp.Schema

在其中AppWeb.Schema,我使用import_types. 我将Users用作示例。

Users.Schema有对象和字段,最终将在哪里resolve &Resolvers.resolve_x/2

我知道 Phoenix 正在对每个请求启动一个新进程,hexdocsAbsinthe.Schema状态在 Absinthe 1.5 模式中是使用执行查询的相同进程构建的。这是否意味着由 phoenix 请求创建的每个新进程都与单个模式( AppWeb.Schema) 进程通信?如果是这样,那不会造成瓶颈吗?如果不是,那不是有很多代码(所有 OTP 应用程序中的所有解析器和相关函数)都要转移到每次产生的新模式进程中吗?

4

1 回答 1

0

在 Absinthe 1.5 中,模式是使用执行查询的相同过程构建的。

这不是指 BEAM 过程,而是在 Absinthe 1.5 中使用与如何解析查询类似的方法构建模式。

在 Absinthe 中有两种构建模式的方法。

  1. 使用基于宏的 DSL,这是 Absinthe 1.4 中已经提供的
  2. 使用 Graphql 模式定义语言 (SDL),在这种情况下,Absinthe 解析 SDL 并从中构建模式,可以使用水合构造附加解析器等。

在这些方法中的任何一种构建模式之后,它的蓝图(模式的 AST)会经历一系列阶段,例如在这些阶段中进行验证。这就是所谓的“相同过程”,因为 Absinthe 中的 graphql 文档也遵循graphl 文档 -> 解析到 AST 蓝图 -> 验证 -> 其他阶段的路线。

默认情况下,模式的编译仍然发生在编译时,因此不会为请求产生额外的进程。

于 2021-03-03T10:11:59.800 回答