【发布时间】:2014-03-13 19:44:57
【问题描述】:
我在 Heroku 上遇到了一个奇怪的错误,我认为这可能是一种竞争条件,我正在寻找任何解决它的建议。
我的应用程序有一个模型,它在创建后调用外部 API(如果您好奇的话,是 Twilio)。在这个调用中,它传递了一个 url,一旦第三方完成他们的工作就会被回调。像这样:
class TextMessage < ActiveRecord::Base
after_create :send_sms
def send_sms
call.external.third.party.api(
:callback => sent_text_message_path(self)
)
end
end
然后我有一个控制器来处理回调:
class TextMessagesController < ActiveController::Base
def sent
@textmessage = TextMessage.find(params[:id])
@textmessage.sent = true
@textmessage.save
end
end
问题在于第三方报告他们在回调中收到 404 错误,因为尚未创建模型。我们自己的日志证实了这一点:
2014-03-13T18:12:10.291730+00:00 app[web.1]: ActiveRecord::RecordNotFound (Couldn't find TextMessage with id=32)
我们检查了,ID 是正确的。更疯狂的是,我们在创建模型时输入了 puts 来记录,这就是我们得到的:
2014-03-13T18:15:22.192733+00:00 app[web.1]: TextMessage created with ID 35.
2014-03-13T18:15:22.192791+00:00 app[web.1]: ActiveRecord::RecordNotFound (Couldn't find TextMessage with id=35)
注意时间戳。这些事情似乎相隔 58 毫秒发生,所以我认为这是一个竞争条件。我们正在使用 Heroku(至少用于暂存),所以我认为问题可能出在他们的虚拟 Postgres 数据库上。
以前有人遇到过这种问题吗?如果是这样,你是如何解决的?有什么建议吗?
【问题讨论】:
标签: ruby-on-rails ruby postgresql heroku race-condition