【问题标题】:How to detect AWS Amplify client disconnect from server-side?如何检测 AWS Amplify 客户端与服务器端的断开连接?
【发布时间】:2021-04-06 15:34:06
【问题描述】:

我正在使用 AWS Amplify 开发游戏。游戏状态将存储在 DynamoDB 表中,并使用 GraphQL 进行查询和修改。对实时或低延迟通信的需求并不迫切;但是,我需要检测玩家何时加入或断开游戏。实现这一点的最佳机制是什么?

我想到的是一个在 WebSocket 连接建立或断开时触发的事件。我可以从 Amplify 文档中收集到的最好的信息是使用 PubSub with AWS IoT,但我不知道这是否可行。如果可能,我希望避免产生额外的 API 费用。

我已经实现了一个这样的版本,其中客户端每 30 秒左右更新一次数据库中的 lastSeen 字段,但感觉很笨拙。

【问题讨论】:

    标签: amazon-web-services aws-lambda aws-amplify aws-appsync aws-iot


    【解决方案1】:

    我认为您需要区分断开连接和不活动。有些人可能只是处于不活动状态,在这种情况下,您可以在他们在 x 时间内无所事事后自行断开他们的连接。

    另一方面,断开连接应该通知您的服务器,这确实是用户打算做的事情。

    【讨论】:

    • 出于我的目的,我认为断开连接和不活动之间不会有任何有意义的区别,但感谢您提出这一点。我会记住这一点。检测不活动是真正的问题,因为我总是可以让客户端在断开连接之前更新数据库。
    • 我对 websockets 不是很熟悉,但我相信大多数时候服务器/框架确实支持参数来处理这个问题并配置超时。
    • 这是一个无服务器架构,这使得它更具挑战性。默认情况下,连接是无状态的。
    【解决方案2】:

    我认为DataStore Events 会做你想做的事。它们有一个特定的network status 事件,您可以使用它来触发状态更改。

    【讨论】:

    • 我最初使用 DataStore,但后来改用 GraphQL。添加 DataStore 是否意味着我必须完全重写应用程序处理 API 调用的方式?
    • 也许,我不确定您是否真的需要切换其他呼叫。包含 DataStore 并订阅其 Hub 事件可能就足够了,或者除了您的其他 graphql 调用之外,您还可以通过 DataStore 加载某种虚拟的尽可能小的对象,作为信标。粗略的 hack,但它可能会让你畅通无阻,并且每 30 秒比lastSeen 稍微好一点。
    • YKW 我刚刚意识到你想要服务器端,我的错。我认为中心事件是严格的客户端事件。
    • 这是有道理的。我相信服务器会向 AppSync 客户端发送心跳消息,因此 DataStore 可能正在使用它。但是,是的,我正在寻找服务器端的东西。
    猜你喜欢
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多