ActiveJob (resque) 使用的数据应该持久化还是放入 ruby 对象并通过对象 ID 传递?

Should data being used by ActiveJob (resque) be persisted or put into a ruby object and passed by object id?

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

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

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

感谢任何和所有见解,

德鲁

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

What if your queue backs up and that quote object changes in the meantime? Don't save state to Sidekiq, save simple identifiers. Look up the objects once you actually need them in your perform method.

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

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