如何向 AWS AppSync 訂閱用戶通知用戶端突變無法執行的外部資料庫更新?

3 分的閱讀內容
0

在進行無法透過客戶端突變執行的外部資料庫變更時,我需要應用程式的客戶端即時更新。如何使用 AWS AppSync 向訂閱用戶通知這些變更?

簡短描述

使用本機解析器即時向訂閱用戶通知外部資料庫變更,而無需進行資料來源呼叫。例如,本機解析器對於定期更新資訊的應用程式(例如航空公司應用程式)非常有用。

完成解決方法一節中的步驟,以建立範例 GraphQL API。當資料寫入 Amazon DynamoDB 表格資料來源時,GraphQL API 會即時更新訂閱用戶。

解決方法

使用精靈建立 GraphQL API

使用 AWS AppSync 引導式架構精靈來建立新的 GraphQL API。如需詳細資訊,請參閱設計 GraphQL API

1.    開啟 AWS AppSync 主控台

2.    選擇建立 API

3.    在開始使用頁面的自訂您的 API 或從 Amazon DynamoDB 匯入下,選擇使用精靈建立,然後選擇開始

4.    在建立模型頁面上:
命名模型下,輸入模型的名稱。在這個例子中,Book 是名稱。
設定模型欄位下,定義應用程式的資料類型。對於此範例設定,請保留預設欄位名稱 (idtitle) 和類型。
(選擇性) 展開設定模型表格 (選用) ** 以新增索引。
選擇
建立**。

5.    在建立資源頁面上,輸入 API 的名稱。然後,選擇建立。AWS AppSync 會建立您的 API,並開啟 API 的查詢頁面。

建立測試訂閱

1.    開啟 AWS AppSync 主控台

2.    導覽至 API 的查詢頁面,然後開啟重複的瀏覽器標籤或視窗。

3.    在重複的瀏覽器標籤或視窗中,清除查詢編輯器的內容,並放入下列查詢中:

subscription onCreateBook {
  onCreateBook {
    id
    title
  }
}

前面的查詢建立了一個對 createBook 突變的訂閱

4.    選擇播放按鈕 (執行查詢)。重複的瀏覽器標籤或視窗訂閱了 createBook 突變。

5.    在原始瀏覽器標籤或視窗中,選擇播放按鈕 (執行查詢),然後選擇 createBook 執行突變。結果會顯示在原始和重複 (訂閱) 瀏覽器標籤或視窗中。

6.    看到訂閱後,關閉重複的瀏覽器標籤或視窗。

建立「無」類型資料來源

資料來源類型會將請求對應範本直接傳遞至回應對應範本

1.    在原始瀏覽器標籤或視窗中,開啟 AWS AppSync 主控台

2.    在左側導覽窗格中,選擇資料來源

3.    選擇建立資料來源

4.    在新資料來源頁面的建立新的資料來源下,完成下列步驟:
對於資料來源名稱,輸入名稱。例如,real_time_data
對於資料來源類型,選擇

5.    選擇建立

如需詳細資訊,請參閱連接資料來源

將突變新增到架構

建立第二個突變以供管理員使用,或在您更新架構時啟動。

使用可將資料庫更新傳遞至類型資料來源的突變異更新架構。

1.    開啟 AWS AppSync 主控台

2.    在左側導覽窗格中,選擇架構

3.    在架構編輯器中的類型 Mutation { 下,新增下列命令,為外部更新建立新的突變類型:

createBookExt(input: CreateBookInput!): Book

4.    在架構編輯器的類型 Subscription { 下,找到下列行:

onCreateBook(id: ID, title: String): Book
        @aws_subscribe(mutations: ["createBook"])

5.    將 "createBookExt" 新增至突變清單:

onCreateBook(id: ID, title: String): Book
        @aws_subscribe(mutations: ["createBook", "createBookExt"])

6.    選擇儲存架構

如需詳細資訊,請參閱設計架構

將解析器附加到突變

1.    開啟 AWS AppSync 主控台

2.    在 API 的架構 頁面的解析器下,向下捲動到突變。或者,對篩選類型,輸入突變

3.    在 createBookExt(...): Book 旁邊的解析器下,選擇附加

4.    在建立新解析器頁面上,對於資料來源名稱,選擇您建立的類型資料來源的名稱。例如 real_time_data

5.    在設定請求對應範本下,找到請求函數:

export function request(ctx) {
    return {};
}

6.    修改函數以傳回 ctx.args

export function request(ctx) {
    return ctx.args;
}

7.    選擇建立

如需詳細資訊,請參閱設定解析器 (VTL)

建立新的測試訂閱

1.    開啟 AWS AppSync 主控台

2.    在左側導覽窗格中,選擇查詢

3.    在 API 的查詢 頁面上,開啟重複的瀏覽器標籤或視窗。

4.    在重複的瀏覽器標籤或視窗中,清除查詢編輯器的內容,然後輸入下列查詢:

subscription onCreateBook {
  onCreateBook {
    id
    title
  }
}

5.    選擇播放按鈕 (執行查詢)。重複的瀏覽器標籤或視窗現在已訂閱 createBookcreateBookExt 突變。

建立新的測試突變

1.    在原始瀏覽器標籤或視窗中,在 API 的查詢 頁面上,清除查詢編輯器的內容。然後,輸入下列查詢:

mutation createBook($createbookinput: CreateBookInput!) {
  createBook(input: $createbookinput) {
    id
    title
  }
}

在編輯器底部的查詢變數區段中,清除內容並輸入下列查詢:

{
  "createbookinput": {
    "title": "My New Book"
  }
}

前面的查詢使用 createBook 突變建立了新的 Book

2.    選擇播放按鈕 (執行查詢)。

3.    在重複的 (訂閱) 瀏覽器標籤或視窗中,請注意,訂閱用戶會即時收到更新。

(選擇性) 請參閱範例使用案例

構建用戶端應用程式並套用這些概念時,您可以使用下列範例來構建提供價格和航班時間的航空公司應用程式。

以下步驟示範如何在 DynamoDB 表格中的航班詳細資料變更時通知訂閱的用戶端:

1.    建立使用 DynamoDB 串流作為觸發器的 AWS Lambda 函數。當 DynamoDB 表格更新時,它會調用 Lambda 函數。如需詳細資訊,請參閱將 AWS Lambda 與 Amazon DynamoDB 搭配使用

2.    在 Lambda 函數程式碼中,包含邏輯以篩選適當的更新,並對 AWS AppSync 執行突變呼叫。這會導致 AWS AppSync 透過訂閱通知訂閱用戶。如需詳細資訊,請參閱教學課程: AWS Lambda 解析器

3.    在 AWS AppSync 中,使用本機解析器新增突變欄位 (例如,名為 publishPrice 的欄位)。

4.    在訂閱欄位中訂閱該突變 (例如,名為 onPriceUpdate 的欄位)。

範例架構

type flightDetails {
  id: ID!
  src: String!
  destn: String!
  price : Int
}

type Mutation {
   # A local resolver targeting a None data source that publishes the message to subscribed clients.
  publishPrice(price: Int): flightDetails
}

type Subscription {
  # Notified whenever *publishPrice* is called.
  onPriceUpdate: Message
    @aws_subscribe(mutations: ["publishPrice"])
}

type Query { ... }

如需詳細資訊,請參閱設計架構

5.    建立另一個使用 DynamoDB 串流作為啟動的 AWS Lambda 函數。在此函數中,呼叫 publishPrice 突變。由於 publishPrice 突變具有本機解析器,因此資料不會再次寫入 DynamoDB。利用此方法,您可以使用 AWS AppSync 作為 PubSub 代理程式。

如需詳細資訊和其他範例使用案例,請參閱教學課程: 本機解析器


相關資訊

解析器教學課程 (VTL)

執行查詢和突變

解析器對應範本參考 (VTL)