[Python]Taskiq + Redis

TIPS
TIPSツール

RedisはC言語で書かれた極めて軽量なインスワップ型のデータストアであり、キューとして利用する分には10MB〜30MB程度のメモリしか消費しません。RabbitMQを無理に削ってディスクI/Oを発生させるより、はるかにシステム全体が安定します。

FastAPI環境へRedisベースのキュー(Taskiqを推奨)を導入する具体的な手順と、「孤児プロセス」を発生させないための設定をまとめました。

1. Redisのインストールとメモリ上限設定

Ubuntuの公式リポジトリからインストールし、万が一タスクが異常に溜まってもサーバーを巻き込まないようメモリ上限をかけます。

# インストール
sudo apt update
sudo apt install redis-server -y

/etc/redis/redis.conf を開き、以下の2行を追記または修正します。

# メモリ上限を50MBに制限(タスクキュー専用ならこれで十分すぎます)
maxmemory 50M

# 上限に達した場合の挙動(新規タスクを拒否し、古いタスクを勝手に消さない設定)
maxmemory-policy noeviction

設定後、再起動して反映させます。

sudo systemctl restart redis-server

2. FastAPI + Taskiq + Redis の実装イメージ

FastAPIと最も相性が良い Taskiq を使用して、Redisをブローカーに設定します。

pip install taskiq taskiq-redis

worker.py (キュー設定)

from taskiq_redis import ListQueueBroker
import asyncio

# Redisをブローカーとして指定
broker = ListQueueBroker(\"redis://localhost:6379/0\")

# キューのレーン分離(ユーザ用と管理用)
@broker.task(queue=\"user_queue\")
async def fetch_user(pair: str):
    # ユーザ用処理
    pass

@broker.task(queue=\"admin_queue\")
async def fetch_admin(channel_id: str):
    # 管理用処理
    pass

3. 孤児プロセスを生まないSystemd設定(最重要)

django-q2 の時に起きたプロセスのゾンビ化・孤児化を防ぐため、ワーカーを管理するSystemdサービス(/etc/systemd/system/q-worker.service)に、確実なプロセス終了プロセス(KillMode)を明記します。

[Unit]
Description=Taskiq Worker
After=network.target redis-server.service

[Service]
User=www-data
Group=www-data
WorkingDirectory=/var/www/q-tools
# 特定のキュー(q_queue)だけを処理
ExecStart=taskiq worker worker:broker --queue q_queue

# プロセスの終了管理(確実なキル)
KillMode=mixed
KillSignal=SIGTERM
TimeoutStopSec=10

Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

KillMode=mixed の効果

Systemdがサービスを停止・再起動する際、親プロセスに終了シグナル(SIGTERM)を送った後、もし子プロセスが生き残っていても強制的にすべて一斉キル(SIGKILL)します。これにより、先ほど確認したような「親を失って裏で暴走するプロセス」は二度と発生しなくなります。

[Python]Taskiq + Redis
[Linux]nice優先度について
Linuxのnice値(優先度)の仕組みや設定方法、コマンドの使い方を解説します。-20から19の範囲でプロセスのCPU割り当てを調整し、バックグラウンド処理の効率化や重要サービスの応答性向上を実現する実践的な知識が身につきます。
Q よくある質問 (FAQ)
Q. TaskiqのブローカーとしてRedisを採用するメリットは何ですか?
A.
Redisは極めて軽量(メモリ消費10MB〜30MB程度)であり、RabbitMQ等と比較してディスクI/Oを抑え、システム全体を安定させることができます。
Q. Taskiqワーカーの停止時に孤児プロセス(ゾンビプロセス)が発生するのを防ぐにはどうすればよいですか?
A.
Systemdのサービス設定に「KillMode=mixed」を指定することで、親プロセスの終了後に残った子プロセスも強制的に一斉キル(SIGKILL)し、プロセスの生存を防ぎます。

コメント

タイトルとURLをコピーしました