我該如何通知 AWS AppSync 訂閱用戶,用戶端突變操作未執行的外部資料庫更新?
我需要讓我應用程式的用戶端在外部資料庫發生變更時即時更新,且這些變更不透過用戶端的突變操作執行。我該如何使用 AWS AppSync 來通知訂閱用戶這些變更?
簡短說明
使用本機解析器,在不進行資料來源呼叫的情況下,即時通知訂閱用戶外部資料庫變更。例如,本機解析器適用於會定期更新資訊的應用程式,例如航空公司應用程式。
完成 Resolution (解決方法) 區段中的步驟,以建立範例 GraphQL API。當資料寫入 Amazon DynamoDB 資料表資料來源時,該 GraphQL API 會即時更新訂閱用戶。
解決方法
使用精靈建立 GraphQL API
使用 AWS AppSync 引導式結構描述精靈來建立新的 GraphQL API。如需詳細資訊,請參閱設計 GraphQL API。
1. 開啟 AWS AppSync console (AWS AppSync 主控台)。
2. 選擇 Create API (建立 API)。
3. 在 Getting Started (開始使用) 頁面中,於 Customize your API or import from Amazon DynamoDB (自訂您的 API 或從 Amazon DynamoDB 匯入) 底下,選擇 Create with wizard (使用精靈建立),然後選擇 Start (開始)。
4. 在 Create a model (建立模型) 頁面中:
在 Name the model (命名模型) 底下,輸入您的模型名稱。在此範例中,名稱為 Book。
在 Configure model fields (設定模型欄位) 底下,為您的應用程式定義資料類型。在此範例設定中,保留預設欄位名稱 (id 和 title) 與類型。
(選用) 展開 Configure model table (optional) (設定模型資料表 (選用)) 以新增索引。
選擇 Create (建立)。
5. 在 Create resources (建立資源) 頁面中,輸入您的 API 名稱。然後,選擇 Create (建立)。AWS AppSync 會建立您的 API,並開啟該 API 的 Queries (查詢) 頁面。
建立測試訂閱
1. 開啟 AWS AppSync console (AWS AppSync 主控台)。
2. 瀏覽至您 API 的 Queries (查詢) 頁面,然後開啟重複的瀏覽器索引標籤或視窗。
3. 在重複的瀏覽器索引標籤或視窗中,清除查詢編輯器的內容,然後放入下列查詢:
subscription onCreateBook { onCreateBook { id title } }
前述查詢會建立訂閱,用於訂閱 createBook 突變操作。
4. 選擇播放按鈕 (執行查詢)。重複的瀏覽器索引標籤或視窗會訂閱 createBook 突變操作。
5. 在原始的瀏覽器索引標籤或視窗中,選擇播放按鈕 (執行查詢),然後選擇 createBook 以執行突變操作。結果會顯示在原始與重複 (訂閱) 的瀏覽器索引標籤或視窗中。
6. 看到訂閱後,關閉重複的瀏覽器索引標籤或視窗。
建立「無」類型資料來源
1. 在原始的瀏覽器索引標籤或視窗中,開啟 AWS AppSync 主控台。
2. 在左側導覽窗格中,選擇 Data Sources (資料來源)。
3. 選擇 Create Data Source (建立資料來源)。
4. 在 New Data Source (新的資料來源) 頁面中,於 Create new Data Source (建立新的資料來源) 底下,完成下列步驟:
在 Data source name (資料來源名稱) 中,輸入名稱。例如,real_time_data。
在 Data source type (資料來源類型) 中,選擇 None (無)。
5. 選擇 Create (建立)。
如需詳細資訊,請參閱連接資料來源。
將突變操作新增至結構描述
建立第二個突變操作,供系統管理員使用,或在您更新結構描述時觸發。
使用會將資料庫更新傳遞至無類型資料來源的突變操作,更新結構描述。
1. 開啟 AWS AppSync console (AWS AppSync 主控台)。
2. 在左側導覽窗格中,選擇 Schema (結構描述)。
3. 在結構描述編輯器中,於 type Mutation { 底下,新增下列命令,以建立用於外部更新的新突變操作類型:
createBookExt(input: CreateBookInput!): Book
4. 在結構描述編輯器中,於 type 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. 選擇 Save Schema (儲存結構描述)。
如需詳細資訊,請參閱設計您的結構描述。
將解析器連接至突變操作
1. 開啟 AWS AppSync console (AWS AppSync 主控台)。
2. 在您 API 的 Schema (結構描述) 頁面中,於 Resolvers (解析器) 底下,向下捲動至 Mutation (突變操作)。或在 Filter types (篩選類型) 中輸入 Mutation (突變操作)。
3. 在 createBookExt(...): Book 旁,於 Resolver (解析器) 底下,選擇 Attach (連接)。
4. 在 Create new Resolver (建立新的解析器) 頁面中,於 Data source name (資料來源名稱) 選擇您建立的無類型資料來源名稱。例如,real_time_data。
5. 在 Configure the request mapping template (設定請求對應範本) 底下,找到 request 函式:
export function request(ctx) { return {}; }
6. 修改函式,使其傳回 ctx.args:
export function request(ctx) { return ctx.args; }
7. 選擇 Create (建立)。
如需詳細資訊,請參閱設定解析器 (VTL)。
建立新的測試訂閱
1. 開啟 AWS AppSync console (AWS AppSync 主控台)。
2. 在左側導覽窗格中,選擇 Queries (查詢)。
3. 在您 API 的 Queries (查詢) 頁面中,開啟重複的瀏覽器索引標籤或視窗。
4. 在重複的瀏覽器索引標籤或視窗中,清除查詢編輯器的內容,然後放入下列查詢:
subscription onCreateBook { onCreateBook { id title } }
5. 選擇播放按鈕 (執行查詢)。重複的瀏覽器索引標籤或視窗現在同時訂閱 createBook 和 createBookExt 突變操作。
建立新的測試突變操作
1. 在原始的瀏覽器索引標籤或視窗中,於您 API 的 Queries (查詢) 頁面,清除查詢編輯器的內容。然後放入下列查詢:
mutation createBook($createbookinput: CreateBookInput!) { createBook(input: $createbookinput) { id title } }
在編輯器底部的 Query Variables (查詢變數) 區段中,清除內容並放入下列查詢:
{ "createbookinput": { "title": "My New Book" } }
前述查詢會使用 createBook 突變操作建立新的 Book。
2. 選擇播放按鈕 (執行查詢)。
3. 在重複 (訂閱) 的瀏覽器索引標籤或視窗中,注意訂閱用戶會即時收到更新。
(選用) 參考範例使用案例
在建置用戶端應用程式並套用這些概念時,您可以參考下列範例:建置提供票價與航班時間的航空公司應用程式。
下列步驟示範當 DynamoDB 資料表中的航班詳細資訊變更時,如何通知已訂閱的用戶端:
1. 建立以 DynamoDB 串流作為觸發程序的 AWS Lambda 函式。當 DynamoDB 資料表更新時,它會調用 Lambda 函式。如需詳細資訊,請參閱將 Amazon DynamoDB 與 AWS Lambda 搭配使用。
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 代理程式。
如需詳細資訊與另一個範例使用案例,請參閱教學課程: 本機解析器。
相關資訊
- 語言
- 中文 (繁體)

相關內容
AWS 官方已更新 4 年前