質問: ### 環境: Cloud9 Ruby on rails 4 Github Heroku ### 前提 現在Railsアプリーケーションを作成してHerokuへのデプロイを終えています。 評価機能、フォロー機能、お気に入り機能などの多対対の関係構築などは問題なくこなせます。 APIを使ったサービスの構造がいまいち理解できず、Facebook,TwitterログインなどのAPI周りの作業に苦戦してます。 ### 実現したいこと ユーザー登録にDeviseを使用しているのですが、その各ユーザーに紐付いた プライベートなメッセージ機能をもたいせたいと考えております。 ### 条件 authenticate_user!が自分のページから または 送信先ユーザーのページにて 「ダイレクトメッセージ」ボタンを押すことで、送信者として自分の(current_user)idを紐付けたメッセージ空間を作成。 且つ、その空間に保存された内容を観れるのは招待したauthenticate_userと招待されたauthenticate_user! のみに限定する。 ### 現在 今は、いろいろ調べてみた結果,Websocket(-rails/Gemfile)やSSE、Pusherなるサービス?があるようで、 試しにPusherで先人方のブログを参考にしながら進めた結果、リアルタイムに更新されるChatルーム作成までは来れました。 ですが、いまいちその構造を掴めていません。 メッセージも一度ページを閉じると消えてしまっています。 ということはもし、上記で述べたような機能を搭載するには、独自にChat ModelやDB上にchatsテーブル・messageカラム:string のように作成し、リレーション構築、DBに保存させる処理のコーディング作業を取らなければいけないということでしょうか? 簡潔にまとめますと、FacebookやWantedlyのような直接会話できるメッセージ機能を持たせるには、 どのような作業が必要になるのか? です。 まだプログラミングを始めて2か月ほどで、ところどころ分からないところもあり、こう言った外部APIなどを利用する知識が浅いため、分からなくなってしまいました。 どうか、知恵をお貸しください。 回答に必要な情報あれば、すぐに載せます。 よろしくお願いいたします。
回答: プログラムをはじめて2ヶ月との事ですので、ちょっと難しいかもしれませんが、、、 まず、よくサンプルである、Websocketを使ったチャットルームは、あるクライアントから送信されたメッセージを、他の接続クライアントへ配信する機能だけのものがほとんどです。 なので、ブラウザ閉じればきえてしまいますし、配信側と、受信側がともにオンラインでないと、メッセージは送受信されません。あくまでも同時オンラインの場合にのみ有効な方法です。 1. そこで、すでにお気づきのようですが、クライアントから受信したメッセージは、一度サーバ側で、何かしらの方法で蓄積する必要があります。DBでもいいですし、NoSQLでも、ファイルでも、何でもいいですが、蓄積をしておきます。 2. 次に、クライアントの接続状態を見極めます。オンラインになっているユーザには、メッセージをそのまま配信すればいいですね。 ただ、ここで、面倒なのは、過去のオンライン時に、どこまでクライアントがメッセージを受信したかを管理しないと、重複してメッセージを送ってしまうとか、途中歯抜けになってしまうとか、そのような状態になってしまいます。 どこまで、送信したか履歴を管理するか、毎回全部おくっちゃうとか!(ネットワークに申し訳ない!)まあ、考え方はさまざまです。 3. オフラインのユーザには、Push通知でも送ることになるのでしょうか。オフラインのユーザが、オンラインになったら、メッセージを取りにこさせるとか、その導線をどうクライアントに組むのかとか、 サイレントプッシュであらかじめダウンロードさせるとか?ここもいろいろやり方はありかと。 4. そして、またまた面倒な、問題です。複数の端末で、同一アカウントにログインしていたとき(PCとスマホとか)の考慮も必要です。他の端末で閲覧したメッセージは、既読あつかいしないとですね。 5. さらに、どこまでメッセージ保存しておきましょうか?GoogleやFaceBookのような、莫大な資産があれば、消さないでどこまでも持っておけますが、普通はある程度で消すとかしないと、DBパンクします。では、有料サービスにするのか、とか、、、 6. そして、最後に一番やっかいな問題です。完璧なプログラムはありません。何かしら不具合はでるものです。さて、チャットのようなプログラム作りました、リリースしました。運用はどうするか、結構きめておかないと、大変なことになります。24時間、誰が監視するのか?また、どの程度のユーザ数を見込むのかなどによって、サーバの構成やら、なんやら、スケーラビリティー、云々・・・。 っと、つらつらと書きましたが、 正直、かなり大がかりな仕事になることが予想されます。 ここに、こんな感じのサンプルあるよ、とか、こんな感じで書いてみれば、と簡単にできることではありませんので、、、 もし、本気ではじめるなら、覚悟して取りかかってください。 また、もしかしたらチャットエンジンのようなサービスを提供しているサイトとかあるかも?なので、そのあたりにおんぶに抱っこが現実的かもしれません。