こんにちは、かびらです。
本日はWebSocketについて解説します。
WebSocketとは?


WebSocketは、サーバーとクライアントが常につながったまま、双方向にやり取りできる仕組みです。
従来のHTTP通信は、左のイメージのように、必要なときにリクエストを送って、レスポンスを受け取るという流れでした。
それに対してWebSocketは、右のイメージのように、一度つながるとそのままの状態を維持して、サーバからも双方向に自由にメッセージを送れるようになります。
この特性から、WebSocketは、チャットやオンラインゲームといった“リアルタイム性”が必要な場面でよく使われています。
WebSocketを使用する理由

では、なぜLuxucomではWebSocketを採用したのか。
理由はとてもシンプルで、“リアルタイムなチャットを実現するため”です。
チャットは、送った瞬間に相手に届くことが求められます。
このユーザー体験を支えるためには、サーバーとクライアントが常に接続された状態で、双方向にメッセージをやり取りできる仕組みが必要です。
その条件を満たすのが、まさにWebSocketの技術です。
WebSocketと関連するアーキテクチャ

次に、LuxucomでWebSocketと関連するアーキテクチャを見ていきましょう。
WebSocketサーバは、ユーザーと常時つながって、やり取りを仲介します。
受け取ったメッセージは、まずDynamoDBに保存されてチャット履歴として残ります。
そして同時に、Redisを使って他のユーザーにも素早く配信されます。
この仕組みによって、リアルタイムに会話が成立するようになっています。
WebSocketを使って良かった点

一つ目は、リアルタイムチャットをシンプルに実現できたこと。
そして二つ目は、Django Channelsというライブラリを使うことで、導入がスムーズに進められたことです。
WebSocketを使って難しかった点

ひとつは、認証の仕組みが通常のHTTP通信と異なっていたことです。
セッションやトークンの扱いが特殊で、その部分を理解して実装するのに少し工夫が必要でした。
もうひとつは、Django Channels特有の「コンシューマ」という概念です。
HTTPのビューとは違い、イベント駆動で書く必要があり、最初は慣れるまで時間がかかりました。
このコンシューマについては、また別途解説したいと思います。
さいごに
今回は、LuxucomにおけるWebSocketの仕組みを紹介しました。
チャット機能を支えるリアルタイム通信の要となる技術だということが伝わったと思います。
次回は、ファイルの保存先として利用しているS3について取り上げます。