喜欢使用 Queue 和 MongoDB 的(投票)系统

Like (voting) system using Queue and MongoDB

场景: 我们正在使用 post 构建一个应用程序。这些 post 可以被用户点赞(就像社交媒体平台一样)。特定的 post 可能会有连续的点赞。我们在我们的服务器上使用 Node.JS 并使用 MongoDB 作为我们的数据库。

关注点: 我打算只构建一个 RESTful API,每次 post 被点赞时都会被点击。 API 只是用 post 的 incremented/decremented 计数更新数据库。但是,如果同一个 post 面临多个点赞活动,那么数据库条目将开始变得不一致,并且计数值将开始变得不一致。

问题:

  1. 为了避免这种不一致,我打算使用队列 (AWS SQS)。使用队列可以解决我的问题吗? (根据我的分析,它会)
  2. 但是,如果明天队列的订阅者(轮询队列的系统)扩展,我不会面临同样的计数不一致问题吗?
  3. 如果不排队,有没有更好的方法解决这个问题?
  4. 其他社交媒体平台如何解决点赞不一致的问题?

其他详细信息

预计会有什么样的不一致? --> 如果 2 个用户同时喜欢一个 post,node.js 实例将同时接受两个请求,它们将同时获取数据库条目(几乎同时)并增加计数的喜欢。发生更新时,两个实例都会使用不同的值更新相同的数据值,从而造成不一致。

我认为 Mongodb 有一个原子增量可以解决您的“不一致问题” https://docs.mongodb.com/manual/reference/operator/update/inc/

对于这些数据库不一致的问题,一般有三种答案:

  • 数据库完全控制 - 通常称为 atomic increment 数据库接管将处理确保应用每个更新。
  • Version/LastUpdated 标志 - 验证另一个具有唯一 timestamp/version 的字段,以确保更新应用于最后已知的良好状态。不行就报错,再处理
  • AWS SQS 使用带有 postId 的 FIFO 队列,这将保证消息的串行处理,您必须确保您也在 lambda/processing 单元中串行处理它们,但那是微不足道。