我在我的 Sinatra 服务器上使用 Ruby 的队列将任务发送到工作线程,然后处理它们并将它们保存在我选择的数据库中。其中一个数据库恰好是 Redis,它支持一些非常酷的流水线。
我的问题是:有没有办法修改 Queue 类,以便.pop
像正常一样一次弹出多个项目Array#pop
,à la [1,2,3,4,4,5].pop(3)
,以便我可以管道结果?
另外,如果 Queue 变得太大,Heroku 实例会发生什么?警告和重启 - 一些数据丢失,对吗?
怎么样:
def pop_queue(q, n)
ary = []
n.times { ary << q.pop }
ary
end
您不想对核心库进行猴子补丁。如果其他代码调用它并且不知道 arity 或参数类型的变化,您的整个应用程序将会崩溃。
...如果您的数据变得太大?你是程序员。您不应该进行防御性编程以避免这些情况吗?
如果您有可能使用所有可用空间的情况,请编写代码以不占用 RAM 而是使用数据库。至少使用基于磁盘的 SQLite 数据库和类似Sequel的东西与之对话。
数据库的美妙之处在于多个线程可以与之对话,只是不要对同一行进行读写。一些 DBM 支持行锁定,而另一些则支持表锁定。您必须编写代码以利用它并将表格视为队列。
如果您想要获得最佳性能,请使用消息队列,例如 AMQP 或 RabbitMQ 而不是数据库,但这开始涉及更复杂的代码和更大的托管铁。