PythonからRailsのSidekiqを実行する方法
はじめに
※この記事は IVRy Advent Calendar 2022 の3日目の記事として記載しています。
こんにちは。電話自動応答サービスIVRyでエンジニアをやっている小瀬です。
IVRyのアドベントカレンダー3日目を担当させていただきます!
IVRyではRailsを中心にバックエンドのコードを書いています。
開発中に溜まった知見などをzennブログの方に書いていこうと思っていますので、よろしくお願いします。今日はSidekiqに関する簡単な記事です。
Sidekiqとは
SidekiqはJobの並列実行を簡単に実現してくれるgemです。
Workerの並列実行数を超えたJobをキューに積んでも、優先度(重み)をつけて順番に実行してくれる優れものです。そのこともブログに書きました。
Sidekiqを他のサービスから実行したい
具体的には、IVRyの電話自動応答を処理しているPythonで実装されたサービスの中の「SMS送信」の処理をSidekiqに移行したいというものでした。
もちろんPython側でキューイングする手もありますが、実行データをRails側で保存したり、インフラを新規に構築しなくても既存を使いまわせるため、僕らにとって非常に良い次の一手でした。
この実装により、SMS送信結果を待つことなく自動応答を完了することができますし、送信に失敗しても自動で再トライできるため、IVRyの顧客体験も向上できます。
今一度Sidekiqの仕様を確認
SidekiqはRailsだと
HogeJob.perform_async('arg1', 'arg2')
というコマンドを実行することでJobをキューイングして実行することができます。
具体的にこの処理が何をしているかというと、Sidekiqが監視しているredisに決まったフォーマットでデータを書き込んでいるだけです。
書き込んでいる内容については下記のブログが詳細に書かれていて本当助かりました。本ブログでは割愛します。
試しに、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には壁もありますし
めちゃくちゃいいスピーカーもあります。そしてなにより事業もすごいスピードで伸びています!
2022年は特に、IVRyが成長する年となりました
今、切実に人が足りません!笑
IVRyで働くことに興味ある方、是非ご連絡ください!
Discussion