【问题标题】:Should data being used by ActiveJob (resque) be persisted or put into a ruby object and passed by object id?ActiveJob (resque) 使用的数据应该被持久化还是放入 ruby​​ 对象并通过对象 id 传递?
【发布时间】:2015-02-07 22:07:49
【问题描述】:

我正在使用 Twilio 到 send/receive texts in a Rails 4.2 应用程序。我是批量发送,一次大约 1000 个,偶尔接收。

目前,当我收到一条文本时,我将其保存到数据库(to、from、body),然后将该记录传递给 ActiveJob 工作人员以供稍后处理。为了发送消息,我目前将 Twilio 参数保存到另一个数据库并将该记录传递给另一个 ActiveJob 工作人员。因为我经常分批做,所以我有两个工人。第一个传出消息工作者发送一条消息。第二个查询数据库并找到应该接收消息的所有用户,为每个应该发送的消息创建一个数据库记录,然后将该记录传递给第一个传出消息工作者。所以第二个基本上只是为第一个处理创建了一堆工作。

现在我让工作人员在完成处理(传入和传出)后销毁记录。我担心在服务器、redis 或 resque 出现故障时不会持久保存东西,但我不知道这是否真的是一个好的设计模式。有人建议我只使用香草红宝石对象并将其 id 传递给工作人员,但我不确定这如何影响数据可靠性。那么创建所有这些数据库是不是太过分了,我应该只创建香草红宝石对象并将这些对象的 ID 传递给工作人员吗?

感谢所有见解,

画了

【问题讨论】:

    标签: ruby-on-rails backgroundworker twilio resque rails-activejob


    【解决方案1】:

    在我看来,向您的工作发送最少量数据的方法是最好的方法。查看 sidekiq wiki 上的“最佳实践”部分:https://github.com/mperham/sidekiq/wiki/Best-Practices

    如果您的队列备份并且报价对象同时发生变化怎么办?不要将状态保存到 Sidekiq,保存简单的标识符。在您的 perform 方法中真正需要它们时查找这些对象。

    在可靠性方面也是如此 - 您应该担心您的工作队列会下降。它发生了。您要么将系统设计为对故障具有容错能力,要么找到具有更高可靠性保证的作业队列系统(但即使如此,也没有队列系统可以保证 100% 的消息传递性)。 Sidekiq pro 比 sidekiq (non-pro) 具有更好的可靠性保证,但是如果您在设计作业时稍加考虑,您可以创建可以在崩溃后扫描数据库并重新排队任何可能丢失的作业的作业.

    您在设计容错解决方案上花费了多少工作,这实际上取决于您的信息从 A 点到 B 点的重要性:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-06
      • 1970-01-01
      • 1970-01-01
      • 2017-10-22
      • 2020-03-06
      • 1970-01-01
      • 2018-06-20
      • 1970-01-01
      相关资源
      最近更新 更多