订阅 AWS AppSync 中的群组/私人聊天列表

Posted

技术标签:

【中文标题】订阅 AWS AppSync 中的群组/私人聊天列表【英文标题】:Subscribe to a List of Group / Private Chats in AWS AppSync 【发布时间】:2019-02-14 20:35:46 【问题描述】:

我目前正在评估 AWS AppSync 作为消息传递应用程序的后端解决方案。

用户将有一个视图来探索新的聊天组,并在另一个视图中看到他们加入的和私人聊天的列表(在列表中应该显示聊天的名称和最后一条消息)。每个聊天当然都会有一个详细视图,其中显示所有消息。

问题是如何设计订阅部分。我发送消息的突变将如下所示:

createMessage( content: String, conversationId: ID!, createdAt: String!, id: ID! ): Message

根据订阅文档,我只有两种可能来设计我的订阅。通过使用对话 ID 作为参数,我订阅所有新消息或来自特定对话的所有新消息。 因此,在我的情况下,我需要获取所有用户对话,然后为每个对话进行订阅调用。不知何故,这感觉像是一个问题,但我没有看到不同的方式(例如,目前无法进行自定义过滤(according to this link))

是否有更好的方法来订阅特定消息子集的新消息(仅在我订阅的对话中)? 客户端上可能有 100 个活动订阅是个问题吗?

提前致谢 卢卡

【问题讨论】:

【参考方案1】:

你是对的。开箱即用的唯一两种方法是:

    使用参数订阅每个对话。 订阅所有对话并在客户端过滤消息。

如果您使用参数(选项 #1)订阅每个对话,您可以在一个 HTTP 请求中批量发送订阅请求。例如。在一个请求中发送多达 50 个具有不同对话参数的订阅。

还有第三种选择,您可以在其中做更多工作以确保客户效率。此选项涉及设置与客户的对话的反向索引。

    创建一个索引,您可以在其中找到给定对话的客户。客户端将使用一个参数(可能是客户端 ID)进行一次订阅。当您发布消息时,您有一个中间步骤(可能是订阅所有消息的后端作业),您可以在其中查看索引以确定哪些客户端对您发布消息的对话感兴趣。然后为每个客户发布。

【讨论】:

非常感谢 Micheal,我将研究第二个和第三个选项。关于选项 3:我不知道如何完成“为每个客户发布”部分。假设我的后端工作是一个消耗所有消息的 lamda 函数,然后过滤正确的客户端(使用客户端 ID 索引)并发布。我将如何编码发布部分? 如果您使用的是 lambda 函数,则 lambda 函数将执行以下操作:1) 订阅所有新消息 2) 对于每条新消息:2.1) 确定该消息用于哪个会话 2.2) 查找哪个客户对该消息感兴趣 2.3) 对于每个感兴趣的客户,发布新消息 要向各个客户实施发布部分,您将为每个客户向 AppSync 发送一个突变。类似于:mutation publishMessage(client: $clientId) yourMessage 好的,知道了。由于写一条消息可能会导致假设 100 个突变(如果对话中有 100 个用户),我将尝试使用选项 1,也许只是对我的列表视图进行轮询,并仅在 Detail 上订阅特定聊天更具成本效益。再次感谢您的帮助迈克尔,非常感谢!

以上是关于订阅 AWS AppSync 中的群组/私人聊天列表的主要内容,如果未能解决你的问题,请参考以下文章

Appsync 客户端对 GraphQL 突变的 Angular 订阅

如何使用订阅和 AWS AppSync 高效同步 Apollo 的缓存

如何订阅 AWS AppSync 客户端中的多个事件?

用于 AWS AppSync 中的异步计算的 Graphql 订阅

AWS AppSync 订阅:基于更新文档中的对象的复杂授权

聊天的数据库模式:私人和群组