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](https://mtoy.work/develop/wp-content/themes/cocoon-master/images/no-image-160.png)
[Linux]nice優先度について
Linuxのnice値(優先度)の仕組みや設定方法、コマンドの使い方を解説します。-20から19の範囲でプロセスのCPU割り当てを調整し、バックグラウンド処理の効率化や重要サービスの応答性向上を実現する実践的な知識が身につきます。

コメント