2

概要

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 をService1Entitys に呼び出します。したがって、このフィールドは 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サービスを作成しています。私はDogsDogサービスから、CatsはCatsサービスから来たいです。さらに、集計フィールドを引き続きサポートしanimalsたいと考えており、それをサービスに移動したいと考えていDogsます。

これをサポートするためにCat、エンティティを作成し、両方のサービスでインターフェイスを複製しました。CatDog サービスが型を解決できるようにするために、 「参照」を使用して、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フィールドを照会しているため、クライアントの変更を必要とせずに、つまりインターフェイスの使用を再構築せずに、この変更をサポートしようとしています。

4

0 に答える 0