我已经构建了一个离子应用程序,现在我想向其中添加聊天功能。 我正在研究可用于实现聊天的不同技术。 我考虑过使用应用程序同步,到目前为止,我唯一关心的是,如果可以在消息发送事件发生时看到哪些用户不在线,则可以发送推送通知。
或者,如果应用程序同步处理是开箱即用并发送通知的?
感谢您的帮助
答案 0 :(得分:1)
嘿,这是一个很好的问题。简短的答案是,AppSync SDK不会开箱即用地处理状态跟踪,但是您可以自己实现此功能而不必太麻烦。
最简单的一种方法是创建DynamoDB表“ ActiveUsers”。在表上启用DynamoDB TTL(https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/TTL.html)(使用一些“时间戳”属性),并使用一些唯一的用户属性(例如username或userId)作为表的分区键。
然后从AppSync中创建一个 Mutation.ping 突变,使其进行如下的 PutItem 调用:
{
"version" : "2017-02-28",
"operation" : "PutItem",
"key" : {
"userId": $util.dynamodb.toDynamoDBJson($ctx.identity.username)
},
"attributeValues" : $util.dynamodb.toMapValuesJson({
timestamp: $util.time.nowEpochSeconds() + 300 # some amount of time
})
}
然后,在启动时间或基于其他条件,您将每隔N秒从客户处调用一次该突变。在用户连接良好的情况下,让应用程序调用另一个变异 Mutation.goOffline ,该变异将在关闭应用程序时从DynamoDB中删除记录。如果用户连接不好,因此客户端无法发送 Mutation.goOffline 突变,则DynamoDB TTL可以为我们进行清理。
要在有人在线或离线时向连接的客户端推送更新,您可以使用此指令 @aws_subscribe进行订阅 Subscription.onActiveChange (变异:[“ publishActiveChange”]) 。然后还定义 Mutation.publishActiveChange 突变,并使其返回用户ID和用户的活动状态。为了完成图片,您将创建一个DynamoDB流,该流调用一个lambda函数,该函数将调用 Mutation.publishActiveChange 突变,无论该对象被删除还是(新)在DynamoDB中创建,然后发布消息。>
您也可以订阅 ping 和 goOffline 突变,而不必担心DynamoDB流和lambda函数,但是这种方法不会在客户端设备上发布订阅在致电 goOffline 之前先离线。 TTL仍然可以使用,但是必须通过后续查询来通知设备。根据您的要求,此方法效果很好,并且具有简化的好处。
要考虑的另一件事是DynamoDB TTL不能保证立即发生,但实际上表现不错(在几分钟之内)。但是,真正的大桌子可能会有些滞后。