5

Apollo フェデレーションでは、この問題に直面しています。サービス リスト内のフェデレーション サービスのスキーマを変更するたびに、ゲートウェイを再起動する必要があります。ゲートウェイが起動するたびに、すべてのスキーマが収集され、データ グラフが集計されることを理解しています。しかし、影響を受けていない他のすべてのGraphQL Federatedサービスもダウンするため、ゲートウェイを再起動せずにこれを自動的に処理できる方法はありますか?

Apollo GraphQL 、@apollo/gateway

4

3 に答える 3

2

使用できる実験的なポーリング間隔があります。

const gateway = new ApolloGateway({
  serviceList: [
    { name: "products", url: "http://localhost:4002" },
    { name: "inventory", url: "http://localhost:4001" },
    { name: "accounts", url: "http://localhost:4000" }
  ],
    debug: true,
    experimental_pollInterval:3000
})

上記のコードは 3 秒ごとにプルします

于 2019-10-24T13:13:23.010 に答える
2

Express を使用して、ゲートウェイのスキーマを更新できます。ApolloGateway には、load()実装サービスからスキーマをフェッチする機能があります。自動化が必要な場合、この HTTP 呼び出しは展開プロセスの一部になる可能性があります。私はポーリングやあまりにも自動化されたものには行きません。実装サービスがデプロイされると、更新されて再度デプロイされるまで、スキーマは変更されません。

import { ApolloGateway } from '@apollo/gateway';
import { ApolloServer } from 'apollo-server-express';
import express from 'express';

const gateway = new ApolloGateway({ ...config });
const server = new ApolloServer({ gateway, subscriptions: false });
const app = express();

app.post('/refreshGateway', (request, response) => {
  gateway.load();
  response.sendStatus(200);
});

server.applyMiddleware({ app, path: '/' });

app.listen();

更新:関数は、スキーマをリロードする前にload()をチェックするようになりました。phase === 'initialized'回避策は、を使用するgateway.loadDynamic(false)か、場合によっては変更することgateway.state.phase = 'initialized';です。loadDyamic()状態を変更すると、後で問題が発生する可能性があるため、お勧めします。この更新の時点で Apollo Federation を使用していないため、これらのソリューションのいずれもテストしていません。

于 2020-10-13T03:46:28.173 に答える