Slide 1

Slide 1 text

Celeryの紹介と 本番運用のTips 2023/08/23 (水)

Slide 2

Slide 2 text

よろしくお願いします ● 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

Slide 3

Slide 3 text

アジェンダ 1. Celeryの What・Why・Where・How 2. 本番運用の Tips

Slide 4

Slide 4 text

CeleryのWhat・Why・Where・How

Slide 5

Slide 5 text

● PythonのタスクキューのOSSフレームワーク ● オープンソース(★22k、1,000以上のコントリビュータ、人気) What is Celery Celeryクライアント Celeryブローカー Celeryワーカー(複数可能) 他もある…

Slide 6

Slide 6 text

What is Celery (contd.) 非同期的に行われる

Slide 7

Slide 7 text

Why use Celery 計算・レポート出力

Slide 8

Slide 8 text

Why use Celery 計算・レポート出力

Slide 9

Slide 9 text

Why use Celery 計算・レポート出力

Slide 10

Slide 10 text

Why use Celery (contd.) ウェブサーバーの状況 ウェブサーバー に仕事させる時 Celeryに仕事 を委託する時 レスポンス時間

Slide 11

Slide 11 text

● ウェブサーバーにたくさん仕事さ せると、他のリクエストへの応答 が遅くなり、CPU/メモリー使用 率が高くなる Why use Celery (contd.) ウェブサーバーの状況 ウェブサーバー に仕事させる時 Celeryに仕事 を委託する時 レスポンス時間

Slide 12

Slide 12 text

● ウェブサーバーにたくさん仕事さ せると、他のリクエストへの応答 が遅くなり、CPU/メモリー使用 率が高くなる ● Celeryワーカーに仕事を渡すと、 ウェブサーバーのリソースを節約 できて、応答を早くすることができ る Why use Celery (contd.) ウェブサーバーの状況 ウェブサーバー に仕事させる時 Celeryに仕事 を委託する時 レスポンス時間

Slide 13

Slide 13 text

Where use Celery Eメール送信 MLモデル 予測処理 計算処理 →レポート出力 ポーリング処理 (定期的な状況確認) Celeryが使えるワークロード MLモデル学習 →S3保存

Slide 14

Slide 14 text

Where use Celery Eメール送信 MLモデル 予測処理 計算処理 →レポート出力 ポーリング処理 (定期的な状況確認) Celeryが使えるワークロード MLモデル学習 →S3保存

Slide 15

Slide 15 text

Where use Celery Eメール送信 MLモデル 予測処理 計算処理 →レポート出力 ポーリング処理 (定期的な状況確認) Celeryが使えるワークロード MLモデル学習 →S3保存

Slide 16

Slide 16 text

Where use Celery Eメール送信 MLモデル 予測処理 計算処理 →レポート出力 ポーリング処理 (定期的な状況確認) Celeryが使えるワークロード MLモデル学習 →S3保存

Slide 17

Slide 17 text

Where use Celery Eメール送信 MLモデル 予測処理 計算処理 →レポート出力 ポーリング処理 (定期的な状況確認) Celeryが使えるワークロード MLモデル学習 →S3保存

Slide 18

Slide 18 text

Where use Celery Eメール送信 MLモデル 予測処理 計算処理 →レポート出力 ポーリング処理 (定期的な状況確認) Celeryが使えるワークロード MLモデル学習 →S3保存

Slide 19

Slide 19 text

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ワーカー(複数可能) 例えば…

Slide 20

Slide 20 text

How to use Celery 3. ワーカーを立ち上げる celery -A tasks worker from tasks import add >>> result = add.delay(4, 4) # 呼び出す >>> result.get() # 終わるまで待つ 4. タスクを呼び出す Celeryクライアント Celeryブローカー Celeryワーカー(複数可能) 例えば… ※複数のワーカーを使う場合は環境ごとに実行

Slide 21

Slide 21 text

本番運用のTips

Slide 22

Slide 22 text

1. ヘルスチェックは「ping」コマンドを使おう celery -A myapp inspect ping --destination celery@${HOSTNAME} 設定項目 設定値 interval 30 timeout 15 startPeriod 10 retries 5 ヘルスチェックの実行間隔 (ゆるめな設定がおすすめ)

Slide 23

Slide 23 text

2. 回復可能なエラーが起きたら再実行しよう

Slide 24

Slide 24 text

2. 回復可能なエラーが起きたら再実行しよう

Slide 25

Slide 25 text

3. ブローカーの選定 評価ポイント Redis RabbitMQ SQS リモートコマンド (pingなど) ◯ ◯ X Taskの結果保存ができ る ◯ △ X メッセージを送れなかっ たら、どうなる? △ 再配信されない ◯ 再配信される ◯ 再配信される ヘルスチェックどうする?? データロスが(より) 起きやすい

Slide 26

Slide 26 text

4. モニタリングツールを入れよう flowerはCeleryワーカーの健 康状態を監視するツール Celeryワーカー・実行中のタス クの状況を可視化 デバッグ・パフォーマンスチュー ニングに役立つ コンテナイメージ・バイナリのデ プロイ方法はブログ記事まで …→ (flowerの管理画面)

Slide 27

Slide 27 text

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. タスクを安全にリトライできるように実装する(アトミック・冪等である)

Slide 28

Slide 28 text

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ワーカーが異常終了し たら、タスク再実行してね

Slide 29

Slide 29 text

5. Spotインスタンスの中断対策 3. 目指すべきタスクの実行時間は …(ブログ記事までお願いします!)

Slide 30

Slide 30 text

ご清聴ありがとうございます ● 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はここ