只需使用jq和bash,就能够自动重新运行Sidekiq脚本!
有关Sidekiq的问题
简单高效的Ruby后台处理。
Sidekiq使用线程在同一个进程中同时处理多个作业。虽然不需要依赖于Rails,但与Rails紧密集成,可以使背景处理变得非常简单。
Sidekiq使用Redis进行管理。
这次的所做之事

然而,由于每次手动确认都是浪费时间,所以我想尽早自动化它,并尝试了一下。
用法 fǎ)
访问数据
虽然我们使用Rails来运行Sidekiq,但也可以使用Redis-cli!这样就可以直接操作数据库了!
$ redis-cli -h 10.XX.XX.XX -p 6379 -n 12 「コマンド」
重要なのは-nパラメータですが、sidekiqは12番のノードで動作しています。それによって、様々なキューのデータを確認することができます。例えば、sidekiqの死亡タスクリストを見たい場合は、簡単に確認することができます。
$ redis-cli -h 10.XX.XX.XX -p 6379 -n 12 zrange sidekiq:dead 0 -1
1) "{\"retry\":3,\"queue\":\"my_queue\",\"class\":\"MyJobs::WorkerJob1\",\"args\":[403006293],\"jid\":\"56ca5a4be4ef23b6f3676f66\",\"enqueued_at\":1665855225.4404187,\"error_message\":\"Endpoint does not exist\",\"error_class\":\" AWS::SNS::Errors::InvalidParameter\",\"failed_at\":1665855225.5153027,\"retry_count\":3,\"retried_at\":1665855459.3232806}"
2) "{\"retry\":3,\"queue\":\"my_queue\",\"class\":\"MyJobs::WorkerJob2\",\"args\":[342105086],\"jid\":\"3413771368fb2b2a027546db\",\"enqueued_at\":1665855398.6243336,\"error_message\":\"Could not connect to MySQL\",\"error_class\":\"AWS::RDS::Errors::NoConnection\",\"failed_at\":1665855398.7288938,\"retry_count\":3,\"retried_at\":1665855640.0306947}"
3) "{\"retry\":3,\"queue\":\"my_queue\",\"class\":\"MyJobs::WorkerJob2\",\"args\":[404318713],\"jid\":\"56104406dc2e252842344dbb\",\"enqueued_at\":1665859144.2329714,\"error_message\":\"Could not connect to MySQL\",\"error_class\":\"AWS::RDS::Errors::NoConnection\",\"failed_at\":1665859144.3381548,\"retry_count\":3,\"retried_at\":1665859416.574747}"
4) "{\"retry\":3,\"queue\":\"my_queue\",\"class\":\"MyJobs::WorkerJob3\",\"args\":[404320461],\"jid\":\"804e1960b48f7cfc904eb22d\",\"enqueued_at\":1665859721.6611075,\"error_message\":\"Could not connect to MySQL\",\"error_class\":\"AWS::RDS::Errors::NoConnection\",\"failed_at\":1665859721.7336028,\"retry_count\":3,\"retried_at\":1665859871.431027}"
5) "{\"retry\":3,\"queue\":\"my_queue\",\"class\":\"MyJobs::WorkerJob3\",\"args\":[400817551],\"jid\":\"3f853435b08b82572b69bacb\",\"enqueued_at\":1665865808.7670307,\"error_message\":\"Could not connect to MySQL\",\"error_class\":\"AWS::RDS::Errors::NoConnection\",\"failed_at\":1665865808.87391,\"retry_count\":3,\"retried_at\":1665866071.994373}"
在Json格式中,您可以看到所有的工作!
修改数据
Redis是相当简单的,只需要能够存储数据、删除数据就行了,更新之类的用得不太多,也没有ID之类的东西。在节点中有各种队列,队列中还有成员。
当需要输入数据时:
$ redis-cli -h 10.XX.XX.XX -p 6379 -n 12 lpush "「キューの名前」" "「メンバー」"`
例如:
$ redis-cli -h 10.XX.XX.XX -p 6379 -n 12 lpush "sidekiq:queue:my_queue" "{\"retry\":3,\"queue\":\"my_queue\",\"class\":\"MyJobs::WorkerJob3\",\"args\":[400817551],\"jid\":\"3f853435b08b82572b69bacb\",\"enqueued_at\":1665865808.7670307,\"error_message\":\"Could not connect to MySQL\",\"error_class\":\"AWS::RDS::Errors::NoConnection\",\"failed_at\":1665865808.87391,\"retry_count\":3,\"retried_at\":1665866071.994373}"
因为逐一完成这件事有点麻烦,所以我们可以使用一个脚本来处理!
所需物品:
-
- 死亡のリストを取る
リストの全部を取るの方がいいので:
$ redis-cli -h 10.XX.XX.XX -p 6379 -n 12 zrange sidekiq:dead 0 -1 > ファイル.log
キューの名前:
さっきJsonだと気づいたらなので jq コマンドを使えます!
echo “{\”retry\”:3,\”queue\”:\”default\”,\”class\”:\”DropTmpTableWorker\”,\”args\”:[\”tmp_julien_test_tmp_table\”],\”jid\”:\”7b1b36e00383906568f3bf2d\”,\”enqueued_at\”:1661332354.1658273,\”error_message\”:\”Invalid parameter: Endpoint Reason: Endpoint does not exist for endpoint arnarn:aws:sns:ap-northeast-1:600552931410:endpoint/GCM/85989/24276665-d2cd-3d3a-90d5-6f6902d860a9\”,\”error_class\”:\”AWS::SNS::Errors::InvalidParameter\”,\”failed_at\”:1661332354.3494694,\”retry_count\”:3,\”retried_at\”:11666466992.0864118}” | jq .
{
“retry”: 3,
“queue”: “default”,
“class”: “DropTmpTableWorker”,
“args”: [
“tmp_julien_test_tmp_table”
],
“jid”: “7b1b36e00383906568f3bf2d”,
“enqueued_at”: 1661332354.1658273,
“error_message”: “Invalid parameter: Endpoint Reason: Endpoint does not exist for endpoint arnarn:aws:sns:ap-northeast-1:600552931410:endpoint/GCM/85989/24276665-d2cd-3d3a-90d5-6f6902d860a9”,
“error_class”: “AWS::SNS::Errors::InvalidParameter”,
“failed_at”: 1661332354.3494694,
“retry_count”: 3,
“retried_at”: 11666466992.086412
}
もっと便利はこちら
echo “{\”retry\”:3,\”queue\”:\”default\”,\”class\”:\”DropTmpTableWorker\”,\”args\”:[\”tmp_julien_test_tmp_table\”],\”jid\”:\”7b1b36e00383906568f3bf2d\”,\”enqueued_at\”:1661332354.1658273,\”error_message\”:\”Invalid parameter: Endpoint Reason: Endpoint does not exist for endpoint arnarn:aws:sns:ap-northeast-1:600552931410:endpoint/GCM/85989/24276665-d2cd-3d3a-90d5-6f6902d860a9\”,\”error_class\”:\”AWS::SNS::Errors::InvalidParameter\”,\”failed_at\”:1661332354.3494694,\”retry_count\”:3,\”retried_at\”:11666466992.0864118}” | jq ‘.queue’
“default”
这样就可以自动将每个任务排入队列中。
-
- retry_countを少なくにする、もう死亡に入ったのでそのパラメータを変更しないと一気に死亡に戻ります
Sidekiqのコードでそれを対応しなきゃ
もう一回パラメータをjqしてからJsonで戻すこと
retry_params=$(echo "$line" | jq '.retry_count = 0 | @json')
- redis-cliを使いながらジョブを入れて、死亡のキューのジョブを削除
redis-cli -h $REDIS -p $PORT -n $SEED lpush "sidekiq:queue:${queue//\"/}" "${retry_params}"
redis-cli -h $REDIS -p $PORT -n $SEED lpush "sidekiq:queue:${queue//\"/}" "${retry_params}"
所以,您可以自動重新執行它,且一切順利!
最后一个文件的样子是这样的:
REDIS=10.XX.XX.XX
PORT=XXXX
SEED=12
redis-cli -h $REDIS -p $PORT -n $SEED zrange sidekiq:dead 0 -1 > ファイル.log
while read line; do
queue=$(echo "$line" | jq '.queue')
retry_params=$(echo "$line" | jq '.retry_count = 0 | @json')
redis-cli -h $REDIS -p $PORT -n $SEED lpush "sidekiq:queue:${queue//\"/}" "${retry_params}"
redis-cli -h $REDIS -p $PORT -n $SEED ZREM "sidekiq:dead" "${line}"
done < ファイル.log
请注意
尝试了很多方法后,我在jq命令中发现了一个奇怪的错误,数字的字符限制存在问题。
echo "{\"retry\":3,\"queue\":\"default\",\"class\":\"DropTmpTableWorker\",\"args\":[\"tmp_julien_test_tmp_table\"],\"jid\":\"7b1b36e00383906568f3bf2d\",\"enqueued_at\":1661332354.1658273,\"error_message\":\"Invalid parameter: Endpoint Reason: Endpoint does not exist for endpoint arnarn:aws:sns:ap-northeast-1:600552931410:endpoint/GCM/85989/24276665-d2cd-3d3a-90d5-6f6902d860a9\",\"error_class\":\"AWS::SNS::Errors::InvalidParameter\",\"failed_at\":1661332354.3494694,\"retry_count\":3,\"retried_at\":11666466992.0864108}" | jq .
{
"retry": 3,
"queue": "default",
"class": "DropTmpTableWorker",
"args": [
"tmp_julien_test_tmp_table"
],
"jid": "7b1b36e00383906568f3bf2d",
"enqueued_at": 1661332354.1658273,
"error_message": "Invalid parameter: Endpoint Reason: Endpoint does not exist for endpoint arnarn:aws:sns:ap-northeast-1:600552931410:endpoint/GCM/85989/24276665-d2cd-3d3a-90d5-6f6902d860a9",
"error_class": "AWS::SNS::Errors::InvalidParameter",
"failed_at": 1661332354.3494694,
"retry_count": 3,
"retried_at": 11666466992.08641
}
只有一件不同之处,就是在json中有”retried_at”: 11666466992.0864108,但是加入jq之后,变成了”retried_at”: 11666466992.08641,由.086408变成了.08641。
请注意,如果想要删除本次活动中的死亡数据,必须使用完全相同的参数才能进行删除。