Concurrency 什么';“这是实施的最佳实践”;阅读收据“;AWS AppSync和Amplify中的群聊?

Concurrency 什么';“这是实施的最佳实践”;阅读收据“;AWS AppSync和Amplify中的群聊?,concurrency,chat,aws-amplify,aws-appsync,real-time-updates,Concurrency,Chat,Aws Amplify,Aws Appsync,Real Time Updates,我正在为后端使用AppSync构建一个Angular 11 web应用程序 我提到了群聊,但基本上我的应用程序中有一个功能,我有一个公告功能,其中有一个人向特定受众(可以是个人成员或成员组)创建公告,每当接收用户打开公告,它必须在用户界面中将该公告标记为该用户已读,并让发件人知道该特定成员已打开该公告 我有一个实现这一点的想法:- 每个公告都需要有一个“seenBy”,它聚集了打开它的人的用户ID 每个成员的用户对象中都有一个名为“announcementsRead”的属性,该属性是他们打开的公

我正在为后端使用AppSync构建一个Angular 11 web应用程序

我提到了群聊,但基本上我的应用程序中有一个功能,我有一个公告功能,其中有一个人向特定受众(可以是个人成员或成员组)创建公告,每当接收用户打开公告,它必须在用户界面中将该公告标记为该用户已读,并让发件人知道该特定成员已打开该公告

我有一个实现这一点的想法:-

  • 每个公告都需要有一个“seenBy”,它聚集了打开它的人的用户ID
  • 每个成员的用户对象中都有一个名为“announcementsRead”的属性,该属性是他们打开的公告的ID数组
  • 在我为用户收集公告列表的UI中,ID不属于成员自己的公告读取数组的公告将被标记为未读
  • 当他们点击它并打开它时,我对公告对象进行了2次更新-a)我只需将成员的用户ID推到“seenBy”属性并推到db。b) 对于成员的用户对象,我将公告的id添加到“announcementRead”属性,并将其推送到DB
  • 这正是我想到的

    如果这种方法有任何缺陷,请告诉我。或者如果有更简单的方法来实现此功能

    我也有一些顾虑:-

  • 假设两个用户同时打开一个公告,客户端尝试使用包含用户ID的更新seenBy更新公告,当来自两个不同客户端的两个请求同时发生时会发生什么情况?有可能第一个用户获取对象,然后第二个用户立即获取对象,当第二个用户更新属性并将其发送回数据库时,第一个用户已经写入了更新的数据。在这种情况下,第二个用户对数据库的写入将覆盖第一个用户的更改。我不确定放大数据存储的内部机制,但我可以想象这种情况会发生。这可能吗?如果是这样,我们如何确保预防这种情况
  • 我真的需要在用户中维护“announcementsRead”属性吗?我的意思是,我可以想象每次我通过检查公告的“seenBy”中是否存在当前用户的ID并在UI中维护该列表来获取公告列表时,在UI中生成该列表,这样,我们可以消除数据库中的信息冗余,而且不积累可能已被删除的非常旧的公告ID也是有意义的。但我想知道,在会员身上使用这个功能是否真的能起到不可或缺的作用
  • 希望我的问题清楚