🦶

PythonからRailsのSidekiqを実行する方法

2022/12/03に公開

はじめに

※この記事は IVRy Advent Calendar 2022 の3日目の記事として記載しています。

こんにちは。電話自動応答サービスIVRyでエンジニアをやっている小瀬です。

IVRyのアドベントカレンダー3日目を担当させていただきます!
https://qiita.com/advent-calendar/2022/ivry

IVRyではRailsを中心にバックエンドのコードを書いています。
https://ivry.jp/

開発中に溜まった知見などをzennブログの方に書いていこうと思っていますので、よろしくお願いします。今日はSidekiqに関する簡単な記事です。

Sidekiqとは

SidekiqはJobの並列実行を簡単に実現してくれるgemです。
https://github.com/mperham/sidekiq

Workerの並列実行数を超えたJobをキューに積んでも、優先度(重み)をつけて順番に実行してくれる優れものです。そのこともブログに書きました。
https://zenn.dev/kose_atsuya/articles/637f6f0f0c7db7

Sidekiqを他のサービスから実行したい

具体的には、IVRyの電話自動応答を処理しているPythonで実装されたサービスの中の「SMS送信」の処理をSidekiqに移行したいというものでした。

もちろんPython側でキューイングする手もありますが、実行データをRails側で保存したり、インフラを新規に構築しなくても既存を使いまわせるため、僕らにとって非常に良い次の一手でした。
この実装により、SMS送信結果を待つことなく自動応答を完了することができますし、送信に失敗しても自動で再トライできるため、IVRyの顧客体験も向上できます。

今一度Sidekiqの仕様を確認

SidekiqはRailsだと

HogeJob.perform_async('arg1', 'arg2')

というコマンドを実行することでJobをキューイングして実行することができます。
具体的にこの処理が何をしているかというと、Sidekiqが監視しているredisに決まったフォーマットでデータを書き込んでいるだけです。

書き込んでいる内容については下記のブログが詳細に書かれていて本当助かりました。本ブログでは割愛します。
https://qiita.com/hosopy/items/d2c87b6489991091ddab

試しに、redisに直接下記のjsonを書き込むと上記のRailsのコマンドと同じように動作することを確認しました

redis.lpush 'sidekiq:queue:default' "{\"class\":\"HogeJob\",\"args\":[\"arg1\",\"arg2\"],\"retry\":true,\"queue\":\"default\",\"jid\":\"0b34564dbb2dcd63ec644b16\",\"created_at\":1501906533.288397,\"enqueued_at\":1501906533.288397}"

あとはPythonでredisに書き込むだけ

あとはPythonで、redisに書き込むだけです。具体的なcodeは下記のように実装することでSidekiqにキューイングすることができました!

redis.lpush('sidekiq:queue:event', sidekiq_json())

def sidekiq_json():
    return json.dumps({
        'class': "HogeJob",
        'args': ['arg1', 'arg2'],
        'retry': True,
        'queue': 'event',
        'jid': uuid.uuid4().hex,
        'created_at': time.time(),
        'enqueued_at': time.time()
    })

こんなに簡単に連携できるとは思ってなかったので感動しました。笑
あまりにも簡単であっさりした記事になってしまいましたが、実装詰まってる人の助けになったり、こんなことできるんだ!という発見になれば幸いです!

これで、色んなサービスの色んな処理をSidekiqに集約したり、設計の幅が広がりますね!

Python, Rails エンジニア募集してます!

IVRyには壁もありますし
https://note.com/u16m/n/n3b31ede1065e
めちゃくちゃいいスピーカーもあります。
https://note.com/kose_atsuya/n/n6889336dd3d7

そしてなにより事業もすごいスピードで伸びています!
2022年は特に、IVRyが成長する年となりました
https://note.com/ryogaskywalker/n/ncf882f7d0b68

今、切実に人が足りません!笑
IVRyで働くことに興味ある方、是非ご連絡ください!

https://ivry-jp.notion.site/IVRy-e1d47e4a79ba4f9d8a891fc938e02271

IVRyテックブログ

Discussion