【问题标题】:Like (voting) system using Queue and MongoDB使用 Queue 和 MongoDB 点赞(投票)系统
【发布时间】:2021-11-04 21:42:27
【问题描述】:

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

关注:我原本打算只构建一个 RESTful API,每当帖子被点赞时就会被点击。此 API 仅使用帖子的递增/递减计数更新数据库。但是,如果同一个帖子面临多个点赞活动,那么数据库条目将开始变得不一致,并且计数值将开始变得不一致。

问题:

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

其他详情

预计会有什么样的不一致? --> 如果 2 个用户同时点赞一个帖子,node.js 实例将并行接受这两个请求,他们都将获取数据库条目(几乎同时)并增加点赞数。当更新发生时,两个实例都用不同的值更新相同的数据值,造成不一致。

【问题讨论】:

标签: node.js mongodb amazon-web-services queue amazon-sqs


【解决方案1】:

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

  • DB 完全控制 - 通常称为atomic increment,DB 接管将确保应用每个更新。
  • 版本/LastUpdated 标志 - 验证另一个具有唯一时间戳/版本的字段,以确保将更新应用于最后一个已知的良好状态。没有就报错,然后处理
  • AWS SQS 使用带有 postId 的 FIFO 队列,这将保证消息的串行处理,您必须确保还在 lambda/处理单元中串行处理它们,但这很简单。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-16
      • 1970-01-01
      • 2014-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多