- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在编写一个应用程序,它需要发送许多电子邮件并因为这些电子邮件而创建许多用户通知。此任务在 Heroku 中产生超时。为了解决这个问题,我决定使用 Resque 和 RedistToGo。
我所做的是发送电子邮件(它实际上只是一封电子邮件,因为我们使用 Sendgrid 来处理它)并使用 Resque worker 创建通知。电子邮件已创建,因此我将其 ID 连同所有收件人发送给工作人员。
这在本地运行良好。在生产环境中,除非我们在 Heroku 中重启我们的应用程序,否则它只会运行一次。我将发布一些我的代码和错误消息:
#lib/tasks/resque.rake
require 'resque/tasks'
task "resque:setup" => :environment do
ENV['QUEUE'] = '*'
end
desc "Alias for resque:work (To run workers on Heroku)"
task "jobs:work" => "resque:work"
#config/initalizers/resque.rb
ENV["REDISTOGO_URL"] ||= "redis://redistogo:some_hash@some_url:some_number/"
uri = URI.parse(ENV["REDISTOGO_URL"])
Resque.redis = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)
Dir["#{Rails.root}/app/workers/*.rb"].each { |file| require file }
#app/workers/massive_email_sender.rb
class MassiveEmailSender
@queue = :massive_email_queue
def self.perform(email_id, recipients)
email = Email.find(email_id.to_i)
email.recipients = recipients
email.send_email
end
end
我有一个 Email 模型,它有一个 after_create 可以让工作人员排队:
class Email < ActiveRecord::Base
...
after_create :enqueue_email
def enqueue_email
Resque.enqueue(MassiveEmailSender, self.id, self.recipients)
end
...
end
这个 Email 模型还有 send_email
方法,它完成我之前所说的
我收到以下错误消息。我要发布 Resque 给我的所有信息:
Worker
9dddd06a-2158-464a-b3d9-b2d16380afcf:1 on massive_email_queue at just now
Retry or Remove
Class
MassiveEmailSender
Arguments
21
["some_email_1@gmail.com", "some_email_2@gmail.com"]
Exception
ActiveRecord::StatementInvalid
Error
PG::Error: SSL error: decryption failed or bad record mac : SELECT a.attname, format_type(a.atttypid, a.atttypmod), d.adsrc, a.attnotnull FROM pg_attribute a LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum WHERE a.attrelid = '"emails"'::regclass AND a.attnum > 0 AND NOT a.attisdropped ORDER BY a.attnum
/app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/postgresql_adapter.rb:1139:in `async_exec'
/app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/postgresql_adapter.rb:1139:in `exec_no_cache'
/app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/postgresql_adapter.rb:663:in `block in exec_query'
/app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/abstract_adapter.rb:280:in `block in log'
/app/vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.2/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/abstract_adapter.rb:275:in `log'
/app/vendor/bundle/ruby/1.9.1/gems/newrelic_rpm-3.3.2/lib/new_relic/agent/instrumentation/active_record.rb:31:in `block in log_with_newrelic_instrumentation'
/app/vendor/bundle/ruby/1.9.1/gems/newrelic_rpm-3.3.2/lib/new_relic/agent/method_tracer.rb:242:in `trace_execution_scoped'
/app/vendor/bundle/ruby/1.9.1/gems/newrelic_rpm-3.3.2/lib/new_relic/agent/instrumentation/active_record.rb:28:in `log_with_newrelic_instrumentation'
/app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/postgresql_adapter.rb:662:in `exec_query'
/app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/postgresql_adapter.rb:1264:in `column_definitions'
/app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/postgresql_adapter.rb:858:in `columns'
/app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/schema_cache.rb:12:in `block in initialize'
/app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/model_schema.rb:228:in `yield'
/app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/model_schema.rb:228:in `default'
/app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/model_schema.rb:228:in `columns'
/app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/model_schema.rb:237:in `columns_hash'
/app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/relation/delegation.rb:7:in `columns_hash'
/app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/relation/finder_methods.rb:330:in `find_one'
/app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/relation/finder_methods.rb:311:in `find_with_ids'
/app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/relation/finder_methods.rb:107:in `find'
/app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/querying.rb:5:in `find'
/app/app/workers/massive_email_sender.rb:5:in `perform'
据此,第一个参数是电子邮件 ID,第二个参数是所有收件人的列表……完全正确。
谁能帮帮我?谢谢!
最佳答案
我遇到了同样的问题。假设您正在使用 Active Record,您必须为每个 fork 的 Resque worker 调用 ActiveRecord::Base.establish_connection
以确保它没有陈旧的数据库连接。尝试将其放入您的 lib/tasks/resque.rake
task "resque:setup" => :environment do
ENV['QUEUE'] = '*'
Resque.after_fork = Proc.new { ActiveRecord::Base.establish_connection }
end
关于ruby-on-rails-3 - Resque with Rails 3 + Heroku + RedisToGo 给出 Postgresql 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9915146/
尝试通过以下 redistogo 凭据连接到 redis 会出错。 var redisClient = require('redis').createClient({ host: 'birde
通读https://redistogo.com/documentation/introduction_to_redis?language=en但无法让它工作。 redis-cli -h my-host
我们使用 redis 来存储我们需要快速调用的“事件”信息。使用像 redis 这样的东西,你会失去 redis 速度的优势吗? 这样的服务有什么优缺点? 谢谢! 最佳答案 您的数据包从应用程序到数据
同一个 heroku 帐户上的两个应用程序是否可以访问同一个 RedisToGo 服务器?我们有两个应用程序,它们都需要网络访问,但结构却截然不同。所以它们不能是同一个应用程序中的 dyno 类型 -
我在 Heroku 上有一个 Rails 应用程序,使用 RedisToGo 和 gem redis。我该怎么做类似于: $ redis-cli monitor 但是在 RedisToGo 上呢? 最
我在 Heroku 上使用 celerybeat 和 RedisToGo Nano 插件 有一个 web dyno 和一个 worker dyno celerybeat worker 设置为每分钟执行
我的 clojure noir 应用程序在本地 100% 正常运行,并且连接到 RedisToGo 没问题。 问题是当我部署到 Heroku (git push heroku master) 时,出现
我们可以在不使用 RedisToGo 附加组件的情况下使用 heroku 上的 redis 通过 python 进行后台作业吗?请任何指针。 我在关注这个 https://devcenter.hero
我有/config/initializers/redis.rb: if Rails.env == "development" $redis = Redis.new(:host => 'localh
我打算使用 Redis 进行 session 存储。 根据这个问题:What is a good session store for a single-host Node.js production
我已经在 Heroku 上添加了 Redistogo 附加组件,但我无法在控制台模式下对其进行测试。我已经按照 documentation 做了这件事. $ heroku run python --a
我有一个 node.js 应用程序,使用 RedisToGo 并在 Heroku 中运行。我想将 Redis To Go 数据库复制到本地进行测试。 在开发 Ruby on Rails 应用程序时,我
在更新我的 gem 并将所有内容投入生产后,我在 Heroku 上启动 sidekiq 时遇到了很大的问题。问题是 Sidekiq 试图通过本地连接和端口连接到 Redis,而不是使用 REDISTO
我将 Redis To Go 与 https://github.com/mranney/node_redis 结合使用图书馆。 Redis 给了我一个看起来像 redis://me:978287c0b
我有一个 Rails 实例和另一个 Node.js 实例。计划是使用 Redis 的 pubsub 从 Rails 项目发布信息,并通过 Node.js 程序订阅。 node.js 程序会通过网络套接
我在 Heroku 上创建了一个 Redis To Go Nano 计划,我在不同的环境中使用连接 URLHeroku 应用程序共享一个速率限制计数器。按照所有常规步骤,这就是我所做的。 我已经添加了
我一直试图让 Resque(使用 Resque 服务器)和 RedisToGo 在 heroku(cedar)上工作一段时间,但我一直遇到这个错误: Redis::CannotConnectError
我从 Heroku 上的 Redis 收到错误“ERR max number of clients reached”,我不确定这是为什么。我正在为后台工作人员使用 Sidekiq,并将其并发设置为 5
我正在编写一个应用程序,它需要发送许多电子邮件并因为这些电子邮件而创建许多用户通知。此任务在 Heroku 中产生超时。为了解决这个问题,我决定使用 Resque 和 RedistToGo。 我所做的
我正在尝试使用 socket.io-redis 将我在 Heroku 上的应用程序扩展到 2 个测功机(或更多)。这是我的代码(其中 config.redis 只是一个包含 RedisToGo 端口、
我是一名优秀的程序员,十分优秀!