Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Celeryの紹介と本番運用のTips

Avatar for Hank Ehly Hank Ehly
August 24, 2023

 Celeryの紹介と本番運用のTips

Avatar for Hank Ehly

Hank Ehly

August 24, 2023
Tweet

More Decks by Hank Ehly

Other Decks in Programming

Transcript

  1. よろしくお願いします • Hank Ehly(ハンク・イーリー) • Slalom株式会社(スラロム) • Data & Analytics

    シニアコンサルタント • https://hankehly.com • https://qiita.com/hankehly • https://github.com/hankehly • https://medium.com/@hankehly • https://www.twitter.com/hankehly • https://www.linkedin.com/in/hankehly
  2. How to use Celery 1. Install from celery import Celery

    app = Celery('tasks', broker='redis://...') @app.task def add(x, y): return x + y pip install celery 2. アプリケーション定義 Celeryクライアント Celeryブローカー Celeryワーカー(複数可能) 例えば…
  3. How to use Celery 3. ワーカーを立ち上げる celery -A tasks worker

    from tasks import add >>> result = add.delay(4, 4) # 呼び出す >>> result.get() # 終わるまで待つ 4. タスクを呼び出す Celeryクライアント Celeryブローカー Celeryワーカー(複数可能) 例えば… ※複数のワーカーを使う場合は環境ごとに実行
  4. 1. ヘルスチェックは「ping」コマンドを使おう celery -A myapp inspect ping --destination celery@${HOSTNAME} 設定項目

    設定値 interval 30 timeout 15 startPeriod 10 retries 5 ヘルスチェックの実行間隔 (ゆるめな設定がおすすめ)
  5. 3. ブローカーの選定 評価ポイント Redis RabbitMQ SQS リモートコマンド (pingなど) ◯ ◯

    X Taskの結果保存ができ る ◯ △ X メッセージを送れなかっ たら、どうなる? △ 再配信されない ◯ 再配信される ◯ 再配信される ヘルスチェックどうする?? データロスが(より) 起きやすい
  6. 5. Spotインスタンスの中断対策 @app.task def not_atomic_not_idempotent_task(): delete_rows() insert_rows() now = int(time.time())

    create_file(name="backup-{now}.csv") @app.task def atomic_and_idempotent_task(filename): with transaction.atomic(): delete_rows() insert_rows() create_file(name=filename) コケたらシステムは変な状態のまま (リトライできない) コケても何度でもリトライできる! 1. タスクを安全にリトライできるように実装する(アトミック・冪等である)
  7. 5. Spotインスタンスの中断対策 @app.task def not_atomic_not_idempotent_task(): delete_rows() insert_rows() now = int(time.time())

    create_file(name="backup-{now}.csv") @app.task def atomic_and_idempotent_task(filename): with transaction.atomic(): delete_rows() insert_rows() create_file(name=filename) コケたらシステムは変な状態のまま (リトライできない) コケても何度でもリトライできる! 1. タスクを安全にリトライできるように実装する(アトミック・冪等である) 2. 自動再スケジューリングの必須設定 task_acks_late True task_reject_on_worker_lost True タスク終了後にAckする Celeryワーカーが異常終了し たら、タスク再実行してね
  8. ご清聴ありがとうございます • Hank Ehly(ハンク・イーリー) • Slalom株式会社(スラロム) • Data & Analytics

    シニアコンサルタント • https://hankehly.com • https://qiita.com/hankehly • https://github.com/hankehly • https://medium.com/@hankehly • https://www.twitter.com/hankehly • https://www.linkedin.com/in/hankehly 他のTipsはここ