Ruby on rails 4 RubyonRailsQueing

Ruby on rails 4 RubyonRailsQueing,ruby-on-rails-4,Ruby On Rails 4,为客户和商户公开了2个API。。商户和客户都将使用相同的交易id访问各自的api。。无论谁先来,我都应在db中创建带有交易id和商户详细信息的记录(如果商户先来),如果客户先来,我应使用商户创建记录的交易id的客户详细信息更新记录 我如何通过一次接受10000次请求点击来处理它。它应该回复没有任何问题吗?请让我知道我们如何在rails中实现,以及是否可能 先谢谢你 我想回答这个问题,但听起来你只需要一把锁。修改表,使其包含一个名为“owned_by”(或类似内容)的列 每当您的实例需要修改记录时

为客户和商户公开了2个API。。商户和客户都将使用相同的交易id访问各自的api。。无论谁先来,我都应在db中创建带有交易id和商户详细信息的记录(如果商户先来),如果客户先来,我应使用商户创建记录的交易id的客户详细信息更新记录

我如何通过一次接受10000次请求点击来处理它。它应该回复没有任何问题吗?请让我知道我们如何在
rails
中实现,以及是否可能


先谢谢你

我想回答这个问题,但听起来你只需要一把锁。修改表,使其包含一个名为“owned_by”(或类似内容)的列

每当您的实例需要修改记录时,请让它发出如下更新:

UPDATE table_name SET owned_by = IF(owned_by IS NULL, 'uniq_id', owned_by) WHERE id = 1;
def find_or_create
  # pseudocode here
  transaction = Transaction.find_by_condition(...)
  return transaction if transaction

  Transaction.create!(...)
rescue ActiveRecord::RecordNotUnique, ActiveRecord::RecordInvalid => e
  log_error
  retry
end
IF语句防止它在检查之间被锁定时窃取锁

然后对该行重新查询,如果uniq_id设置为当前线程uniq_id,那么您就知道可以安全地写入,否则让它以增量休眠并重新查询,直到记录锁释放为止。如果没有锁可以完成某件事,只需让它忽略该字段即可。工作流程可以如下所示(sudo代码):


我将提供另一种处理方法

正如Camway在回答中提到的,锁定是一种方法。以下是一些额外的资源:

另一种处理方法是使用数据库级约束。虽然Rails级别的竞争条件可能会导致数据完整性失败,但在数据库级别上,记录仍然会一个接一个地插入(这是写入速度比读取速度慢的原因之一)

因此,您可以简单地在其中一个字段上添加唯一的索引约束。由于您没有描述客户和商户如何匹配交易id,因此我无法确定要在哪个字段上添加约束。但你可以有这样的东西:

UPDATE table_name SET owned_by = IF(owned_by IS NULL, 'uniq_id', owned_by) WHERE id = 1;
def find_or_create
  # pseudocode here
  transaction = Transaction.find_by_condition(...)
  return transaction if transaction

  Transaction.create!(...)
rescue ActiveRecord::RecordNotUnique, ActiveRecord::RecordInvalid => e
  log_error
  retry
end
我在生产中使用它,我们可以毫无问题地为数百万个db事务提供服务。救援程序通常只执行几次,因为大多数时候你会找到记录并立即返回