如何确保在MongoDB中使用Node.js更新用户的追随者计数的可靠性

3bygqnnd  于 2023-05-06  发布在  Go
关注(0)|答案(1)|浏览(146)

我正在设计一个社交API系统,用户可以关注和取消关注对方。目前,我有一个用户模型,看起来像这样:

sourceId: {
    type: Schema.Types.ObjectId,
    ref: "user",
    required: true,
  },
  targetId: {
    type: Schema.Types.ObjectId,
    ref: "user",
    required: true,
  },
  approved: {
    type: Boolean,
    required: true,
    default: true,
  },
};

当有人在系统中关注另一个用户时,我正在做这样的事情:

const query: any = {
      targetId: <some_oid>,
      sourceId: <some_oid>,
      approved: true
    };
await new FollowModel(query).save();
await UserModel.updateOne({ _id: targetId }, { $inc: { followerCount: 1 } });
await UserModel.updateOne({ _id: sourceId }, { $inc: { followingCount: 1 } });
sendSuccess(res, FollowStatus.FOLLOWING);

正如你所看到的,这个过程非常简单。插入以关注模型,增加发送请求的人的关注计数,并增加被关注的人的关注计数。
但是这里有很多事情可能会出错,比如插入到跟随模型成功,追随者计数得到更新,但是源用户的追随者计数更新失败。我知道MongoDB事务可以帮助解决这个问题,但看起来没有副本集和一些复杂的设置过程,它们就无法工作。在这种简单的设置中,是否有可能实现可靠的计数解决方案?如果是,如何进行?大型社会系统如何处理这一问题?
如果解决方案需要代码的详细版本,完整的API文件在这里:https://github.com/shrihari-prakash/liquid/blob/main/src/service/api/user/follow.post.ts

55ooxyrt

55ooxyrt1#

如果没有事务,您所要求的是不可能的,而事务(如您所提到的)需要副本。但没你想的那么复杂。您可以轻松创建单节点副本集。读D. SM的答案here

相关问题