我正在设计一个社交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
1条答案
按热度按时间55ooxyrt1#
如果没有事务,您所要求的是不可能的,而事务(如您所提到的)需要副本。但没你想的那么复杂。您可以轻松创建单节点副本集。读D. SM的答案here。