我们的设置是 Rails 3,在负载均衡器后面有 6 个应用服务器和一个 PostgreSQL 数据库。
在我们的应用程序中,用户可以在表演期间“提示”和艺术家。
流程如下所示:
- 用户点击“提示”按钮
- 提示对象已创建
- after_create 回调确保用户帐户有足够的钱,如果是这样,金融交易就会转移资金。否则,会引发回滚异常。
可能发生的情况是,如果用户向提示按钮“发送垃圾邮件”,则可能会同时处理多个提示。当这种情况发生时,“这个用户有足够的钱吗?” 由于金融交易尚未发生,因此检查对于许多提示返回相同的值。
我需要的是确保每个“提示”按顺序进行处理。这样,提示 #2 的余额检查确实发生在提示 #1 更新余额之前。
我们已经将 Resque 用于其他东西,所以这可能是一种解决方案。虽然我不知道如何确保多个作品不会开始并行处理作业并导致相同的问题。让一名工人做小费工作不是可行的解决方案,因为我们的应用程序在任何给定时刻都会处理大量小费。