ruby-on-rails – 在sidekiq进程中的Rails.cache.read

ruby-on-rails – 在sidekiq进程中的Rails.cache.read,第1张

概述在我的 Ruby on Rails应用程序中,我的模型看起来像这样: class Schema < ActiveRecord::Base has_many :schema_items def self.from_cache(schema_id) schema = Rails.cache.read("schema_#{schema_id}") unless schema 在我的 Ruby on Rails应用程序中,我的模型看起来像这样:

class Schema < ActiveRecord::Base  has_many :schema_items  def self.from_cache(schema_ID)    schema = Rails.cache.read("schema_#{schema_ID}")    unless schema      schema = Schema.where(ID: schema_ID).includes(:schema_items).first      Rails.cache.write("schema_#{schema_ID}",schema) if schema    end    schema  endend

我在SIDekiq worker调用的其他类中使用此类方法.有时会返回以下错误:

NotImplementedError

使用谷歌我在redis_store gem:https://github.com/redis-store/redis-store/issues/74中发现了这个问题

但他们解决了这个问题.我的应用程序托管在Heroku上,我正在使用RedisCloud.任何想法如何解决这个问题?

编辑:

这是完整的回溯:

NotImplementedError: NotImplementedError  from celluloID/tasks/task_fiber.rb:15:in `block in create'  from celluloID/tasks.rb:57:in `block in initialize'  from celluloID/actor.rb:357:in `block in task'  from celluloID/cell.rb:71:in `block in task'  from celluloID/cell.rb:60:in `block in invoke'  from celluloID/calls.rb:122:in `dispatch'  from celluloID/calls.rb:26:in `dispatch'  from celluloID/calls.rb:26:in `public_send'  from sIDekiq/processor.rb:50:in `process'  from sIDekiq/processor.rb:98:in `stats'  from sIDekiq/processor.rb:51:in `block in process'  from sIDekiq/mIDdleware/chain.rb:132:in `invoke'  from sIDekiq/mIDdleware/chain.rb:132:in `call'  from sIDekiq/mIDdleware/chain.rb:129:in `block in invoke'  from sIDekiq/mIDdleware/server/logging.rb:11:in `call'  from sIDekiq/logging.rb:30:in `with_context'  from sIDekiq/mIDdleware/server/logging.rb:15:in `block in call'  from sIDekiq/mIDdleware/chain.rb:129:in `block in invoke'  from sIDekiq/failures/mIDdleware.rb:9:in `call'  from sIDekiq/mIDdleware/chain.rb:129:in `block in invoke'  from sIDekiq/mIDdleware/server/retry_jobs.rb:74:in `call'  from sIDekiq/mIDdleware/chain.rb:129:in `block in invoke'  from sIDekiq/mIDdleware/server/active_record.rb:6:in `call'  from sIDekiq/mIDdleware/chain.rb:129:in `block in invoke'  from sIDekiq/batch/mIDdleware.rb:25:in `call'  from sIDekiq/mIDdleware/chain.rb:129:in `block in invoke'  from sIDekiq_unique_jobs/mIDdleware/server/unique_jobs.rb:16:in `call'  from sIDekiq/mIDdleware/chain.rb:129:in `block in invoke'  from sIDetiq/mIDdleware/history.rb:8:in `call'  from sIDekiq/mIDdleware/chain.rb:129:in `block in invoke'  from new_relic/agent/instrumentation/sIDekiq.rb:29:in `call'  from new_relic/agent/instrumentation/controller_instrumentation.rb:352:in `perform_action_with_newrelic_trace'  from new_relic/agent/instrumentation/sIDekiq.rb:33:in `block in call'  from sIDekiq/mIDdleware/chain.rb:127:in `block in invoke'  from sIDekiq/processor.rb:52:in `block (2 levels) in process'  from sIDekiq/processor.rb:75:in `execute_job'  from app/workers/response_processor_worker.rb:8:in `perform'  from app/services/import/response_processor.rb:28:in `process'  from app/models/import/importer/raw_response_valIDator.rb:17:in `valIDate'  from app/models/survey_schema.rb:51:in `from_cache'  from active_record/relation/finder_methods.rb:127:in `first'  from active_record/relation/finder_methods.rb:484:in `find_nth'  from active_record/relation/finder_methods.rb:500:in `find_nth_with_limit'  from active_record/relation.rb:243:in `to_a'  from active_record/relation.rb:514:in `load'  from active_record/relation.rb:643:in `exec_querIEs'  from active_record/relation.rb:643:in `each'  from active_record/relation.rb:644:in `block in exec_querIEs'  from active_record/associations/preloader.rb:102:in `preload'  from active_record/associations/preloader.rb:102:in `flat_map'  from active_record/associations/preloader.rb:102:in `each'  from active_record/associations/preloader.rb:103:in `block in preload'  from active_record/associations/preloader.rb:115:in `preloaders_on'  from active_record/associations/preloader.rb:143:in `preloaders_for_one'  from active_record/associations/preloader.rb:143:in `flat_map'  from active_record/associations/preloader.rb:143:in `each'  from active_record/associations/preloader.rb:144:in `block in preloaders_for_one'  from active_record/associations/preloader.rb:144:in `map'  from active_record/associations/preloader.rb:144:in `each'  from active_record/associations/preloader.rb:146:in `block (2 levels) in preloaders_for_one'  from active_record/associations/preloader/association.rb:20:in `run'  from active_record/associations/preloader/collection_association.rb:13:in `preload'  from active_record/associations/preloader/association.rb:78:in `associated_records_by_owner'  from active_record/associations/preloader/association.rb:60:in `owners_by_key'  from active_record/associations/preloader/association.rb:103:in `key_conversion_required?'  from active_record/associations/preloader/association.rb:107:in `association_key_type'  from active_record/associations/preloader/association.rb:45:in `association_key_name'

我的工人看起来像这样:

class ResponseCreatorWorker  include SIDekiq::Worker  sIDekiq_options queue: :response_processing  def perform(schema_ID)    # some not important code    schema = Schema.from_cache(schema_ID) # this line throws the error    Response.create(schema: schema)  endend
解决方法 一些选项无法进入Pro代码:

您找到的错误与redis-store相关,请尝试memcached

尝试将缓存移动到memcached,它应该是一个简单且无中断的 *** 作,在简单的计划上没有成本,并且看看问题是否消失,或者更改是否有助于查找核心错误

对于简单的键值内容,memcache无论如何都是一个更好的缓存服务,

您链接的工作程序不是堆栈跟踪的一部分

您展示了ResponseCreatorWorker,但它没有出现在堆栈跟踪中.出现的是ResponseProcessorWorker,可能链接该工作人员?

您确定要运行正在运行的代码吗?

Mike Perham说SIDekiq回溯与你给他的版本不符,错误的工人在堆栈跟踪中?你真的确定服务器正在更新吗?查看部署日志并使用heroku run bash登录到worker,并检查几个关键文件,确保平台没有任何关闭.

你能救它吗? :d

放入捕获NotImplementedError的救援应该是非常安全的,再次尝试,并将其记录记录到日志中.在适当的时候更新宝石,当警告消失时,打开威士忌并庆祝.

在你的模型中加入这样的东西:

def wrap_me_scotty  yIEldrescue NotImplementedError => e  warn "#{e} :-("  yIEld # try once more,let it explode if no joyend

然后包装Rails.cache调用

def self.from_cache(schema_ID)  schema = wrap_me_scotty{ Rails.cache.read("schema_#{schema_ID}") }  unless schema    schema = Schema.where(ID: schema_ID).includes(:schema_items).first    wrap_me_scotty{ Rails.cache.write("schema_#{schema_ID}",schema) } if schema  end  schemaend
总结

以上是内存溢出为你收集整理的ruby-on-rails – 在sidekiq进程中的Rails.cache.read全部内容,希望文章能够帮你解决ruby-on-rails – 在sidekiq进程中的Rails.cache.read所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1271171.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-08
下一篇2022-06-08

发表评论

登录后才能评论

评论列表(0条)

    保存