解決済
リアルタイムメッセージ機能を作成する際、Ajaxで定期処理をするかWebhook(Django-Channels)を用いるか
Django
JavaScript
初心者
2023/06/16 21:02

お世話になっております。

現在、Djangoを用いたCMSでサービス運営しており、その中でお客様とスタッフ間のメッセージ機能を搭載しています。

現在はAjaxで定期的に新規メッセージの取得を行なっておりますが、
メッセージ取得とメッセージ送信の処理が同時に行われた時など、時たまエラーが発生してしまう場合があります。
また、定期的にオブジェクトを参照するので、サーバー負荷的なものはどうなんだろうという疑問も湧いています。

少し調べていた所、Channelsを発見したのですが、Webhookというものをよく理解しておらず、Webhookのメリット・デメリットをあまり理解できていません。
(現在は単純にAjaxの方が処理が簡単なのでそちらで作ってるレベルです)

例えば、このサイトでのコメント機能をリアルタイムで更新をかけるとしたら、
はる先生でしたら、AjaxかWebhook(Channels)のどちらを選択しますか?

回答 7件
login
回答するにはログインが必要です

ご回答ありがとうございます!

該当のURLを参考にChannelsでアプリは作成できましてテスト環境では問題なく動作をしたのですが、いざ本番環境(AWS Elastic Beanstalk)にアップロードをすると動作しません。

httpsの問題なのだろうと何となくは理解しているのですが、ws を wss に書き換えたり、調べて色々とやってみてもなかなかうまくいかず、、、

解決方法を教えていただけるととても助かります。。

1

こちらの記事を参考にデプロイできますでしょうか!

https://zenn.dev/y_k/articles/e2c50f3e46cc11

尚、参考にしているリンクは下記になります。

https://github.com/PaulleDemon/AWS-deployment/blob/master/django-channels.md

1

と、思ったら、

Nov  9 14:32:11 ip-172-31-13-132 web: self.wsgi = self.app.wsgi()
Nov  9 14:32:11 ip-172-31-13-132 web: File "/var/app/venv/staging-LQM1lest/lib/python3.8/site-packages/gunicorn/app/base.py", line 67, in wsgi
Nov  9 14:32:11 ip-172-31-13-132 web: self.callable = self.load()
Nov  9 14:32:11 ip-172-31-13-132 web: File "/var/app/venv/staging-LQM1lest/lib/python3.8/site-packages/gunicorn/app/wsgiapp.py", line 49, in load
Nov  9 14:32:11 ip-172-31-13-132 web: return self.load_wsgiapp()
Nov  9 14:32:11 ip-172-31-13-132 web: File "/var/app/venv/staging-LQM1lest/lib/python3.8/site-packages/gunicorn/app/wsgiapp.py", line 39, in load_wsgiapp
Nov  9 14:32:11 ip-172-31-13-132 web: return util.import_app(self.app_uri)
Nov  9 14:32:11 ip-172-31-13-132 web: File "/var/app/venv/staging-LQM1lest/lib/python3.8/site-packages/gunicorn/util.py", line 358, in import_app
Nov  9 14:32:11 ip-172-31-13-132 web: mod = importlib.import_module(module)
Nov  9 14:32:11 ip-172-31-13-132 web: File "/usr/lib64/python3.8/importlib/__init__.py", line 127, in import_module
Nov  9 14:32:11 ip-172-31-13-132 web: return _bootstrap._gcd_import(name[level:], package, level)
Nov  9 14:32:11 ip-172-31-13-132 web: File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
Nov  9 14:32:11 ip-172-31-13-132 web: File "<frozen importlib._bootstrap>", line 991, in _find_and_load
Nov  9 14:32:11 ip-172-31-13-132 web: File "<frozen importlib._bootstrap>", line 973, in _find_and_load_unlocked
Nov  9 14:32:11 ip-172-31-13-132 web: ModuleNotFoundError: No module named 'application'
Nov  9 14:32:11 ip-172-31-13-132 web: [2022-11-09 14:32:11 +0000] [4854] [INFO] Worker exiting (pid: 4854)
Nov  9 14:32:11 ip-172-31-13-132 web: [2022-11-09 14:32:11 +0000] [4847] [INFO] Shutting down: Master
Nov  9 14:32:11 ip-172-31-13-132 web: [2022-11-09 14:32:11 +0000] [4847] [INFO] Reason: Worker failed to boot.
Nov  9 14:32:12 ip-172-31-13-132 web: [2022-11-09 14:32:12 +0000] [4862] [INFO] Starting gunicorn 20.0.4
Nov  9 14:32:12 ip-172-31-13-132 web: [2022-11-09 14:32:12 +0000] [4862] [INFO] Listening at: http://127.0.0.1:8000 (4862)
Nov  9 14:32:12 ip-172-31-13-132 web: [2022-11-09 14:32:12 +0000] [4862] [INFO] Using worker: threads
Nov  9 14:32:12 ip-172-31-13-132 web: [2022-11-09 14:32:12 +0000] [4868] [INFO] Booting worker with pid: 4868
Nov  9 14:32:12 ip-172-31-13-132 web: [2022-11-09 14:32:12 +0000] [4868] [ERROR] Exception in worker process

と言ったエラーが発生していました。

AWSのヘルス上も下記の文面が表示されています。

Following services are not running: websocket.

packages:
  yum:
    git: []
    python3-devel: []
    mariadb-devel: []

option_settings:
  aws:elasticbeanstalk:container:python:
    WSGIPath: mysite.wsgi:application
  aws:elasticbeanstalk:environment:proxy:staticfiles:
    /static: static
  aws:elasticbeanstalk:environment:process:http:
    Port: '80'
    Protocol: HTTP
  aws:elasticbeanstalk:environment:process:websocket:
    Port: '5000'
    Protocol: HTTP
  aws:elbv2:listener:80:
    DefaultProcess: http
    ListenerEnabled: 'true'
    Protocol: HTTP
    Rules: ws
  aws:elbv2:listenerrule:ws:
    PathPatterns: /ws/*
    Process: websocket
    Priority: 1
  aws:elbv2:listener:443:
    ListenerEnabled: 'true'
    Protocol: HTTPS
    SSLCertificateArns: [省略]
    SSLPolicy: ELBSecurityPolicy-2016-08
    Rules: ws

Procfileは下記のように記載しています。

web: gunicorn --bind :8000 --workers 3 --threads 2 mysite.wsgi:application
websocket: daphne -b 0.0.0.0 -p 5000 mysite.asgi:application

サーバーサイドには特段エラーが出ていなく、

(index):10 WebSocket connection to 'wss://ドメイン名/ws/6bc111bd-d2c9-4258-a853-5390e1dcdb47/' failed:

というエラーがコンソール上に表示されている状態です。

どこかでエラーが出ていないでしょうか?

Djangoでチャットアプリを作るのであれば、Django Channelsを使いますね。

■参考

https://zenn.dev/y_k/articles/e8878460fff3d5aa1d1d

Webhookは、メッセージを受信したタイミングで処理を実行できる便利なものです。

Webhookはこちらの記事が分かりやすいです。

https://kintone-blog.cybozu.co.jp/developer/000283.html