簡體   English   中英

將 GraphQL 請求路由到不同區域的 API,服務不同的內容但使用相同的模式

[英]Route GraphQL requests to APIs in different regions serving different content but using same schema

我們在多個 AWS 區域用 GraphQL API 部署后端服務。 GraphQL 架構對於每個區域都是相同的,但服務提供區域特定數據。 Apollo federation 似乎沒有解決這個話題,因為我們不想合並不同的模式。 我們的問題也不在於選擇最近的區域。 客戶端選擇特定區域以訪問該區域提供的數據。

使用 REST,反向代理可以根據路徑參數將請求轉發到目標區域。 然而,在 GraphQL 中,所有請求都針對同一個端點。

將 GraphQL 請求路由到使用相同架構但提供不同內容的不同區域的最佳做法是什么?

編輯:也許同樣重要的是要注意我們也在使用 GraphQL 訂閱。 如果可能的話,最好避免連接到客戶端中的多個端點。

我們去了Apollo Links 每個后端都部署在不同的區域,提供自己的 GraphQL API 端點。

前端保留所有可用區域端點的列表並設置定向鏈接 我們可以通過設置上下文變量 select 各自的鏈接。

import { ApolloLink, HttpLink } from '@apollo/client';
import { RetryLink } from '@apollo/client/link/retry';

const directionalLink = new RetryLink().split(
  (operation) => operation.getContext().region === "us",
  new HttpLink({ uri: "http://us-endpoint/v1/graphql" }),
  new RetryLink().split(
    (operation) => operation.getContext().region === "eu",
    new HttpLink({ uri: "http://eu-endpoint/v1/graphql" }),
    new HttpLink({ uri: "http://au-endpoint/v2/graphql" })
  )
);

優點

  • 目前,該方法與受地球限制的區域數量成比例。
  • 我們可以在沒有反向代理路由的情況下創建和保持對已知端點的訂閱。
  • 我們可以選擇遍歷用戶訪問令牌中的所有區域...
  • ...,或者我們可以選擇 select 用戶選擇的單個區域。
  • 設置鏈接后,區域端點對 UI 是完全透明的。
  • 如示例所示,這甚至有助於不同的版本。

缺點

  • 請求必須通過安靜的鏈接鏈。 (與網絡通信相比,可能可以忽略不計。)

無論 REST 還是 GraphQL,我認為必須在請求到達區域服務之一之前完成全局路由。

So for example, with Route 53, you can create different subdomains us.example.com and europe.example.com where each directs to the corresponding regional GraphQL API.

如果你想在同一區域內跨 AZ 路由,那么你可以使用 ELB。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM