リアルタイムデータ - AWS AppSync

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

リアルタイムデータ

GraphQL スキーマサブスクリプションディレクティブ

AWS AppSync のサブスクリプションはミューテーションに対する応答として呼び出されます。つまり、GraphQL スキーマディレクティブをミューテーションで指定することで、AWS AppSync で任意のデータソースをリアルタイム対応にすることができます。

AWS Amplify クライアントライブラリは、サブスクリプション接続管理を自動的に処理します。ライブラリはピュアを使っている WebSockets クライアントとサービス間のネットワークプロトコルとして指定します。

注意: サブスクリプションへの接続時に認証を制御するには、AWS Identity and Access Management(IAM)、AWS Lambda、フィールドレベルの認証用の Amazon Cognito Identity Pools、または Amazon Cognito User Pools サブスクリプションできめ細かなアクセスコントロールを実行する場合、サブスクリプションフィールドにリゾルバーをアタッチし、AWS AppSync データソースと呼び出し元の ID を使用してロジックを実行できます。詳細については、「」を参照してください認証と認可

サブスクリプションはミューテーションからトリガーされ、ミューテーション選択セットが受信者に送信されます。

次の例では、GraphQL サブスクリプションの操作方法を示します。データソースを指定しません。これは、データソースが Lambda、Amazon DynamoDB、または Amazon のいずれかであるからです。 OpenSearch サービス。

サブスクリプションを開始するには、次のようにスキーマにサブスクリプションのエントリポイントを追加します。

schema { query: Query mutation: Mutation subscription: Subscription }

ブログ投稿サイトを持っており、新しいブログにサブスクライブし、既存のブログに変わるものとします。これを行うには、スキーマに次の Subscription 定義を追加します。

type Subscription { addedPost: Post updatedPost: Post deletedPost: Post }

さらに、次のミューテーションがあるとします。

type Mutation { addPost(id: ID! author: String! title: String content: String url: String): Post! updatePost(id: ID! author: String! title: String content: String url: String ups: Int! downs: Int! expectedVersion: Int!): Post! deletePost(id: ID!): Post! }

通知を受け取る各サブスクリプションに @aws_subscribe(mutations: ["mutation_field_1", "mutation_field_2"]) ディレクティブを追加することで、これらのフィールドをリアルタイム対応にできます。手順は以下のとおりです。

type Subscription { addedPost: Post @aws_subscribe(mutations: ["addPost"]) updatedPost: Post @aws_subscribe(mutations: ["updatePost"]) deletedPost: Post @aws_subscribe(mutations: ["deletePost"]) }

なぜなら@aws_subscribe(mutations: ["",..,""])ミューテーション入力の配列を受け取り、サブスクリプションを開始する複数のミューテーションを指定できます。クライアントからサブスクライブする場合、GraphQL クエリは次のようになります。

subscription NewPostSub { addedPost { __typename version title content author url } }

このサブスクリプションクエリは、クライアント接続とツールに必要です。

ピュアで WebSockets クライアント、各クライアントが独自の選択セットを定義できるため、選択セットのフィルタリングはクライアントごとに行われます。この場合、サブスクリプション選択セットは、ミューテーション選択セットのサブセットである必要があります。たとえば、サブスクリプションが addedPost{author title} ミューテーションにリンクされていると、addPost(...){id author title url version} 投稿の作成者とタイトルのみを受け取ります。他のフィールドは受け取りません。ただし、ミューテーションの選択セットに作成者が欠けていた場合、サブスクライバーは作成者フィールドに対して null 値を取得します (または、スキーマ内で作成者フィールドが required/not-null と定義されている場合はエラー)。

サブスクリプション選択セットは、純粋な WebSockets を使用するときに不可欠です。項目がサブスクリプションで明示的に定義されていない場合、AWS AppSyncはフィールドを返しません。

前の例では、サブスクリプションに引数はありませんでした。スキーマは次のようになります。

type Subscription { updatedPost(id:ID! author:String): Post @aws_subscribe(mutations: ["updatePost"]) }

この場合、クライアントでサブスクリプションが次のように定義されます。

subscription UpdatedPostSub { updatedPost(id:"XYZ", author:"ABC") { title content } }

スキーマの subscription フィールドの戻り値の型は、対応する mutation フィールドの戻り値の型に一致する必要があります。前の例では、これが addPostaddedPost の両方が Post タイプとして返され、表示されます。

クライアントでサブスクリプションを設定するには、「」を参照してください。クライアントアプリの作成

サブスクリプション引数の使用

GraphQL サブスクリプションを使用するときに重要なのは、引数をいつ、どのように使用するかについて理解することです。微妙な変更を加えて、発生した突然変異についてクライアントに通知する方法とタイミングを変更できます。これを行うには、のサンプルスキーマを参照してください。サンプルスキーマの起動。これにより「Events」および「Comments」が作成されます。このサンプルスキーマでは、以下のミューテーションが発生します。

type Mutation { createEvent( name: String!, when: String!, where: String!, description: String! ): Event deleteEvent(id: ID!): Event commentOnEvent(eventId: ID!, content: String!, createdAt: String!): Comment }

デフォルトサンプルでは、特定の eventId 引数が渡されるとき、クライアントがコメントにサブスクライブできます。

type Subscription { subscribeToEventComments(eventId: String!): Comment @aws_subscribe(mutations: ["commentOnEvent"]) }

ただし、クライアントで、単一のイベントまたはすべてのイベントのサブスクライブを許可する場合、感嘆符 (!) をサブスクリプションプロトタイプから削除することにより、この引数を省略可能にできます。

subscribeToEventComments(eventId: String): Comment

この変更により、この引数が省略されたクライアントですべてのイベントのコメントを取得します。さらに、クライアントで、すべてのイベントに対するすべてのコメントに明示的にサブスクライブする場合は、次のように引数を削除します。

subscribeToEventComments: Comment

1 つ以上のイベントのコメントに対してこれらを使用します。作成されたすべてのイベントについて知りたい場合は、次のように記述します。

type Subscription { subscribeToNewEvents: Event @aws_subscribe(mutations: ["createEvent"]) }

複数の引数を渡すこともできます。たとえば、特定の場所と時間で、新しいイベントの通知を受け取る場合、次のようにします。

type Subscription { subscribePlaceDate(where: String! when: String!): Event @aws_subscribe(mutations: ["createEvent"]) }

その結果、クライアントアプリケーションは、以下の操作を実行できます。

subscription myplaces { subscribePlaceDate(where: "Seattle" when: "Saturday"){ id name description } }

引数値 null には意味があります。

AWS AppSync でサブスクリプションクエリを作成するとき、引数値 null を使用する場合と、引数を完全に省略する場合とでは、フィルター処理の結果は異なります。

イベントアプリサンプルに戻って、イベントを作成し、イベントに関するコメントを投稿してみましょう。のサンプルスキーマを参照してください。サンプルスキーマの起動

新しいものを含めるようにスキーマを変更しましょうlocationフィールド,でCommentフィールドで、コメントの送信元を説明しています。値は座標のセットまたは場所です。「」を参照してください。その以下スキーマ、剥ぎ取られたのダウン簡潔さ:

type Comment { # The id of the comment's parent event. eventId: ID! # A unique identifier for the comment. commentId: String! # The comment's content. content: String # Location where the comment was made location: String } type Event { id: ID! name: String where: String when: String description: String } type Mutation { commentOnEvent(eventId: ID!, location: String, content: String): Comment } type Subscription { subscribeToEventComments(eventId: String!, location: String, content: String): Comment @aws_subscribe(mutations: ["commentOnEvent"]) }

新しいオプションフィールド Comment.location に注目してください。

NOW,私たちが望むと言う通知 にとって特定のイベントに投稿されたすべてのコメント。その場合はでは、以下のサブスクリプションを書きます。

subscribeToEventComments(eventId: "1") { eventId commentId location content }

インスタンスもし我々代わりに field 引数を追加します。location: nullに先行するサブスクリプション:

subscribeToEventComments(eventId: "1" location: null) { eventId commentId location content }

Wこれで、質問は変わりました。このサブスクリプションは、特定のイベントについて場所を指定していないすべてのコメントが通知されるように、クライアントを登録します。

注記

2022年1月1日現在、MQTT オーバー WebSockets の GraphQL サブスクリプションのプロトコルとしては利用できなくなりましたAWS AppSyncAPI。ピュア WebSockets でサポートされる唯一のプロトコルですかAWS AppSync。

クライアントを元にAWS AppSync2019年11月以降にリリースされたSDKまたはAmplifyライブラリ自動的に私たちe純粋な WebSockets デフォルトはです。最新バージョンにクライアントをアップグレードする許すsそれらつかいます AWS AppSync純粋です WebSockets エンジン。

ピュア WebSockets より大きなペイロードサイズが付属 (240) KB)、より幅広いクライアントオプション、および改善された CloudWatch メトリクス。pure の使用方法の詳細については WebSocket クライアント、「」を参照してください。リアルタイム構築 WebSocket クライアント