概要
GraphQL Apollo マネージド フェデレーションでは、1 つのサービスが 2 つの個別のサービスのエンティティの配列を返す集計フィールドを持つことが可能かどうかを調べようとしています。のように、私はこのユースケースをサポートしようとしています:
query FromTwoServices {
aggregateField {
id
...on Service1Entity {
field1
}
...on Service2Entity {
field2
}
}
}
両方どこ
type Service1Entity implements Aggregation
と
type Service2Entity implements Aggregation
内部では、(サービス 2 に存在する) のリゾルバーaggregateField
がサービス 1 をService1Entity
s に呼び出します。したがって、このフィールドは 2 つのデータ セットを集約しています。
例題
現在の GraphQL セットアップでは、これらすべてを 1 つのサービスで定義しています。
interface Animal {
id: ID!
name: String!
}
type Cat implements Animal {
id: ID!
name: String!
meows: Boolean
}
type Dog implements Animal {
id: ID!
name: String!
barks: Boolean
}
サービスにクエリを実行すると、リゾルバーにヒットし、animals
次のようになります。
query Animals {
animals {
id
...on Cat {
meows
}
...on Dog {
barks
}
}
}
今、私はDogs
サービスを作成しています。私はDogs
Dogサービスから、CatsはCatsサービスから来たいです。さらに、集計フィールドを引き続きサポートしanimals
たいと考えており、それをサービスに移動したいと考えていDogs
ます。
これをサポートするためにCat
、エンティティを作成し、両方のサービスでインターフェイスを複製しました。Cat
Dog サービスが型を解決できるようにするために、 「参照」を使用して、Dog サービスが別の場所にあることを伝えましCat
た。
Cat サービス (Cat をエンティティとして でマーク@key
):
interface Animal {
id: ID!
name: String!
}
type Cat implements Animal @key(fields: "id") {
id: ID!
name: String!
meows: Boolean
}
ドッグサービス:
interface Animal {
id: ID!
name: String!
}
type Cat implements Animal @key(fields: "id") {
id: ID! @external
}
type Dog implements Animal {
id: ID!
name: String!
barks: Boolean
}
このセットアップの問題は、次の GraphQL エラーが原因で、Dog サービスの開始に失敗することです。
エラー: インターフェース フィールド Animal.name が必要ですが、Cat はそれを提供しません。
私の Dog サービスで、外部name
フィールドを追加すると、次のようになります。
type Cat implements Animal @key(fields: "id") {
id: ID! @external
name: String! @external
}
次に、マネージド フェデレーションで 2 つのサービスを構成できません。
このデータ グラフには有効な構成がありません。[dog] Cat.name -> は @external としてマークされていますが、@requires、@key、または @provides ディレクティブでは使用されていません。
ここで間違った道を進んでいるような気がします。あるサービスが別のサービスのエンティティと組み合わせて独自のエンティティを返すことができる、このような集約フィールドを持つことは可能ですか?
すでに多くのクライアントがanimals
フィールドを照会しているため、クライアントの変更を必要とせずに、つまりインターフェイスの使用を再構築せずに、この変更をサポートしようとしています。