会导致“多个workers" (单个 worker 下工作正常)的状态下,导入 CSV 文件之后,不能正常的根据导入的 device进行 query remote, update emails . 这两个操作。
根据Randy的要求, 导入CSV之后,可以自动的查询远程,然后更新本地的device信息。 所以后来的代码是这样做的:
1. 建立优先级是 0 的JOB (最高), 来导入CSV
2. 建立优先级是 10 的JOB, (中级) , 来查询远程远程DEVICE数据。
3. 建立优先级是 20 的JOB (最低), 来更新本地DEVICE数据。
可是实际上发现,在多个WORKER下,上述情况不成里。 会有不少 优先级 = 20 的JOB,会在 优先级 = 10 的JOB执行完成之前被执行。
经过研究,发现了 delayed_job 的执行机制: 某个JOB在被执行时,会被设置 lock = true ,然后等它执行完毕了,worker再删掉这个job. 所以,在下面这个情况下, 低优先级的JOB会在高优先级的JOB未完成之前被执行:
job1, p = 10, 耗时 10s
job2, p = 10, 耗时 10s
job3, p = 10, 耗时 10s
job4, p = 20, 耗时 5s
job5, p = 20, 耗时 5s
在 worker = 5 (总之只要满足 > 3 这个条件) 时, 就会出现:
job1, job2, job3 被执行
job4, job5 也被执行
结果 job4, job5 被执行完之后, job 1, 2,3 都没执行完。
所以为了解决这个问题,我加入了"wait job" , 专门用于等待。
4 loop do
5 unless preconditional_jobs_exist?(priority_of_this_job)
6 break
7 end
8 Rails.logger.info "=== preconditional_jobs_exist:(priority < #{priority_of_this_job}), sleep 10 seconds"
9 sleep 10
10 end
最新(正在测试中)的代码是这样的:
1. 建立优先级是 0 的JOB (最高), 来导入CSV
2. 建立优先级是 10 的JOB, (中级) , 来查询远程远程DEVICE数据。
2.5 建立优先级是 15 的 WAIT JOB , 用来专门等待,确定 所有的 高优先级JOB 完成。
3. 建立优先级是 20 的JOB (最低), 来更新本地DEVICE数据。
目前从LOG来看, 这些JOB不是严格按照优先级执行的。 而是有极少数(3~ 5%) 会忽略优先级被执行。
所以这个问题还需要进一步的排查。
分享到:
相关推荐
安装一个插件即可:https://www.rabbitmq.com/community-plugins.html ,下载rabbitmq_delayed_message_exchange插件,然后解压放置到RabbitMQ的插件目录。 接下来,进入RabbitMQ的安装目录下的sbin目录,执行下面...
延迟的工作Mongoid后端 要求 Mongoid 5或更高版本。... script/rails runner 'Delayed::Backend::Mongoid::Job.create_indexes' 生成script/delayed_job : rails generate delayed_job 就是这样。 正常使用 。
rails g delayed_job:active_recordrake db:migrate锁定作业时出现问题您可以尝试使用旧版锁定代码。 通常速度较慢,但对某些人来说效果更好。 Delayed::Backend::ActiveRecord.configuration.reserve_sql_...
rabbitmq_delayed_message_exchange插件3.6.x版本,用于实现延迟队列; rabbitmq_delayed_message_exchange-20171215-3.6.x.zip; 官网找不到了,提供下~
安装一个插件即可:https://www.rabbitmq.com/community-plugins.html ,下载rabbitmq_delayed_message_exchange插件,然后解压放置到RabbitMQ的插件目录。 接下来,进入RabbitMQ的安装目录下的sbin目录,执行下面...
rabbitmq_delayed_message_exchange-3.9.0.ez
rabbitmq_delayed_message_exchange3.7
delay_job 支持多个后端来存储作业队列。 。 如果你打算使用的delayed_job与活动记录,添加delayed_job_active_record到你Gemfile 。 gem 'delayed_job_active_record' 如果你打算使用的delayed_job与Mongoid,...
rabbitmq_delayed_message_exchange-20171215-3.6.x.ez.zip
rabbitmq_delayed_message_exchange-20171201-3.7.x.ez
必须定义一个且只有一个 worker 的队列: Delayed :: Worker . queues = [ :some_queue ] # or with URL to avoid SQS requests Delayed :: Backend :: Sqs . queue_url = '...
【RabbitMQ】延时队列插件(delayed_message_exchange) 查找Docker容器中的RabbitMQ镜像 ...3.拷贝插件文件到rabbitMQ的Docker容器中的/usr/lib/rabbitmq/lib/rabbitmq_server-3.7.7/plugins 目录下
rabbitmq_delayed_message_exchange-20171201-3.7.x.ez 插件
【RabbitMQ】延时队列插件(delayed_message_exchange) 查找Docker容器中的RabbitMQ镜像 2.上传rabbitmq_delayed_message_exchange-20171201-3.7.x.ez插件到Linux文件夹中 3.拷贝插件文件到rabbitMQ的Docker容器中
默认情况下,delayed_job 工作人员为每个工作人员启动一个新的单线程进程。 通过在单个多线程进程中运行工作线程,delayed_job_celluloid 在内存使用和速度方面更加高效。安装将 delay_job_celluloid 添加到您的 ...
rabbitmq_delayed_message_exchange-3.9.0 是Rabbitmq的插件,具体使用会上传的我的博客:Windows给Rabbitmq安装rabbitmq_delayed_meaage_exchange
rabbitmq 延迟队列插件 rabbitmq_delayed_message_exchange_3.8.17 解压即用 输入命令进行安装 .\rabbitmq-plugins enable rabbitmq_delayed_message_exchange
rabbitmq_delayed_message_exchange (适用于RabbitMQ 3.7.x) 并且包含详细操作说明