nata-water / poc_background_mq_django_redis_celery

Django Rest framework + Redis + Celeryで非同期処理
1 stars 0 forks source link

非同期処理の検証

使い方

コンテナ起動

$ docker-compose up -d

事前準備1:必要なモジュールのインストール

$ cd backend
$ pip install pipenv
$ pipenv shell
# Pipfileを元にインストールするため、特にモジュール名の指定は不要
$ pipenv install

事前準備2:Djangoのマイグレーション実行とユーザ作成・開発サーバ起動

$ pipenv shell
$ python manage.py migrate
$ python manage.py createsuperuser --username admin --email admin@foobar.com --skip-checks
# [!] 以下のメッセージが表示されるため好きなパスワードを指定
#  >Password: admin
#  >Password (again):admin
# [!] パスワードの注意メッセージが表示されるが、yを指定すれば問題なし
#  このパスワードは ユーザー名 と似すぎています。
#  このパスワードは短すぎます。最低 8 文字以上必要です。
#  このパスワードは一般的すぎます。
#  Bypass password validation and create user anyway? [y/N]:
$ python manage.py loaddata xxx_api/fixtures/xxx_api.json
$ python manage.py runserver

事前準備3:Celeryプロセスの起動

# 別シェルで起動する
$ cd backend
$ pipenv shell
$ celery -A xxx_api worker -l info --pool=solo

これでCeleryプロセスの実行準備が完了しました。

(必要に応じて):flower(Celeryタスクの管理ツール)の起動

# 別シェルで起動する
$ cd backend
$ pipenv shell
$ celery flower -A xxx_api --address=127.0.0.1 --port=5555

(必要に応じて):Angularの実行

$ cd frontend/poc-frontend
$ npm install
$ ng serve

(必要に応じて):AngularフロントエンドからCeleryプロセスを実行する場合

screen

[2021-03-22 00:17:12,563: WARNING/MainProcess] current_task_idです:3839db79-0d03-4096-9d88-7b30411ea681
[2021-03-22 00:17:13,953: INFO/MainProcess] Task xxx_api.tasks.do_parse_resource[3839db79-0d03-4096-9d88-7b30411ea681] succeeded in 1.3910000000
032596s: 'program_language.xlsxをParseResultに格納しました'

Djangoバックエンド(Django REST frameworkのAPI)からCeleryプロセスを実行する場合

[1] 単純なCeleryプロセスを実行したい場合

[2] Excelデータ(BinaryResource)をParseResultに書き込む場合

// POSTパラメータ
{"resource_id": "cc42c989-6813-456f-87ab-16858ef38fd9"}

コンテナごとの接続情報

イメージ ホスト名 ポート番号(ホスト) ポート番号(コンテナ)
redis:6.2.1 mq 6379 6379
イメージ ホスト名 DB名 ユーザ名 パスワード ポート番号(ホスト) ポート番号(コンテナ)
postgres:13 db poc admin admin 5432 5432
イメージ ホスト名 ポート番号(ホスト) ポート番号(コンテナ)
adminer:latest adminer 8080 8080

[備忘録] Celery4.xのWindowsでの動作について

Celery4.x以降はWindowsではサポートされないため、通常のコマンドcelery -A xxx_api worker -l infoでは動かない。 pipでeventletかgeventをインストールして以下のように実行する必要あり

$ celery -A xxx_api worker -l info --pool=solo 

[参考資料]

[備忘録] Djangoモデルから取得したバイナリ(Excelファイル)を読み込むには?

import io
import pandas as pd

record = HogeModel.objects.get(pk="hoge")
df = pd.read_excel(io.BytesIO(record.blob_data))

その他

pipenv installしたくない人向け

$ pip install django
$ pip install djangorestframework 
$ pip install celery 
$ pip install django-celery-results 
$ pip install psycopg2 
$ pip install redis 
$ pip install eventlet
$ pip install black
$ pip install flake8
$ pip install openpyxl
$ pip install xlrd
$ pip install flower