只需使用jq和bash,就能够自动重新运行Sidekiq脚本!

有关Sidekiq的问题

简单高效的Ruby后台处理。

Sidekiq使用线程在同一个进程中同时处理多个作业。虽然不需要依赖于Rails,但与Rails紧密集成,可以使背景处理变得非常简单。

Sidekiq使用Redis进行管理。

这次的所做之事

Screen Shot 2022-11-04 at 15.05.26.png

然而,由于每次手动确认都是浪费时间,所以我想尽早自动化它,并尝试了一下。

用法 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。

请注意,如果想要删除本次活动中的死亡数据,必须使用完全相同的参数才能进行删除。

bannerAds