筛选 AppSync 订阅

Posted

技术标签:

【中文标题】筛选 AppSync 订阅【英文标题】:Filter AppSync Subscription 【发布时间】:2021-06-03 16:31:58 【问题描述】:

我正在使用 AppSync(以避免必须从零开始管理 WebSocket)和 Amplify(特别是在 android 上,使用 Kotlin)构建一个简单的多人游戏。

问题是当玩家连接到游戏时,应该监听其他玩家的更新(考虑我在发电机上有一个表,主键是 UUID 和相应的游戏 ID 和玩家的位置)。

所以我所做的是,在玩家加入他的游戏会话后,将自己注册到PlayeronUpdate...但是现在他收到了所有玩家更新的通知...甚至虽然我可以轻松地过滤这个传入的事件客户端,但我认为这是一个糟糕的主意,因为 AppSync 必须通知所有注册用户,所有更新。

相反,我想在订阅上指定一个过滤器,例如当您执行查询时,例如:

Amplify.API.subscribe(
    ModelSubscription.onUpdate(
       Player::class.java,
       Player.GAMEROOM.eq(currentPlayer.gameroom.id) // only players in the same gameroom
    ),
     Log.i("ApiQuickStart", "Subscription established") ,
     onCreated ->
        ...
    ,
     onFailure -> Log.e("ApiQuickStart", "Subscription failed", onFailure) ,
     Log.i("ApiQuickStart", "Subscription completed") 
)

有没有办法获得这个? 由于这是我将对 Player Update 进行的唯一订阅提示,也许使用自定义解析器可以完成一些事情?

【问题讨论】:

【参考方案1】:

您需要在订阅中再添加一个参数,以及它的订阅突变。我猜你的 GraphQL 架构看起来像

type Subscription 
  onUpdate(gameRoomId: ID!, playerId: ID): UpdateUserResult
    @aws_subscribe(mutations: ["leaveCurrentGameRoom", <other_interested_mutation>])


type Mutation 
  leaveCurrentGameRoom: UpdateUserResult


type UpdateUserResult 
  gameRoomId: ID!
  playerId: ID!
  // other fields

您注意到 Subscription.onUpdate 有一个可选参数 playerId。订阅可以如下使用

onUpdate("room-1") // AppSync gives updates of all players in "room-1"
onUpdate("room-1", "player-A") // AppSync gives updates of "player-A" in "room-1"

为了让 AppSync 过滤掉不相关的更新,订阅的变更(例如 leaveCurrentGameRoom)必须返回一个包含两个字段的类型,即 gameRoomId 和 playerId。请注意,您还可以更新突变的解析器以解析字段的数据

这是订阅参数的另一个示例 https://docs.aws.amazon.com/appsync/latest/devguide/aws-appsync-real-time-data.html#using-subscription-arguments

【讨论】:

以上是关于筛选 AppSync 订阅的主要内容,如果未能解决你的问题,请参考以下文章

AWS Appsync 订阅 - “连接失败:连接握手错误”

AWS AppSync - 订阅握手期间出错

AppSync订阅授权问题

AppSync/Amplify - 如何定义 GraphQL 订阅

放大未捕获的 AppSync 订阅(承诺中)

Appsync 的 graphql 订阅不适用于 PHP5