インスタントメッセージングの詳細設計と実装(PHP + GatewayWorker + Redisの)
私たちは、機能を実装する必要があります
- 一つのチャット(ささやき)
- チャット-多くの(グループチャット)
- 同様にQQ、マイクロ文字や他のリアルタイムチャットメッセージのリスト
ツールの選択
-
GatewayWorkerは、以下のような特徴がある(複数のネットワーク審査官のマニュアルを参照してください)
- ベースWorkerman開発
- ベースのゲートウェイ、ワーカープロセスモデル
- 分散展開をサポート
- 高い同時実行をサポートしています
- 任意のクライアントにグローバルブロードキャストまたはプッシュデータをサポートしています
- アプリケーション層プロトコルの様々なサポート
- マルチプロトコルのサポート
- 永久支持体を維持するために、オブジェクト、またはリソース
- 高性能
- 他のプロジェクトとの容易な統合
- 長い接続をサポートしています
私たちは、主に、それはプロトコルをWebSocketを使用して、このフレームワークは、GatewayWorkerは、独立して展開することができThinkPHP、laravelや他のフレームワークと組み合わせて使用するために、関連するビジネスロジックの責任は非常に便利であるPHP
- キー操作、セットリストをRedisの。
インスタントメッセージングは、最も重要なのは、応答の速さで、私たちは、「メッセージ一覧」それでは未読メッセージ、未読の数、最後のメッセージの内容、時間などがあるでしょうを表示する必要があります。
WebSocketとGatewayWorker原理はもはや使用物語は、子供用の靴は、あなたのお母さんの程度を理解しないでくださいします
結果は
グループチャット|ささやきレンダリング
メッセージ一覧のレンダリング
データベース設計(別途、グループチャット、プライベートチャット)
ウィスパー設計(デザインブリーフ)
パラメータ名 | 説明 |
---|---|
ID | 主キー |
SENDER_ID | 送信者ID |
receive_id | 受信者ID |
chat_identify | 識別:チャットとB、Bとチャットを。録音AB |
message_details | メッセージの内容 |
last_time_at | チャット記録間隔は、所定の時間を超えて |
- より簡単に、B間のチャットを見つけるために、この分野でchat_identify現場での使用、。
- last_time_at QQ、マイクロチャネルとの間のチャット、時間間隔は、1つのチャット当たりない表示時間を記録します
グループチャット(デザインブリーフ)
- そしてささやき好きですが、受信機のIDは、GROUP_IDグループIDになります。
メッセージリストのデザインは、「プライベートチャット、グループチャット」の効果を期待し、そのリスト表示では、データの変更がリアルタイムで起こります。Redisのとここに
各ユーザーリストには、キー= message_listのコレクションです:USER_ID
Redis集合存储 消息类型 1私信,2群聊
message_list:user_id{
json_encode(['消息类型','接收者id|群组id']),
json_encode(['消息类型','接收者id|群组id']),
json_encode(['消息类型','接收者id|群组id']),
}
查找每个人的消息列表,直接取出该列表即可,但每个成员 都要对应 ‘未读消息数量’,‘最后一条消息内容’,‘最后一条小时时间’。由于是可变的,所以需要单独存储
Redis 键值 key = message_content:user_id_消息类型_id
key =>json_encode(['消息数量','最后一条消息内容','时间'])
上面 集合列表里的每一个成员都 对应这里的每个键值。
- ニュースは、すべての操作のRedis、適切な更新を更新します。
- 速度は、かなり迅速Redisのは間違いありません。
地域のニーズのその後の最適化
-
ウィスパー|グループチャットはテーブルが記録されます。現在の設計では、単一のフォームライブラリです。もちろん、ユーザーの増加、必然的な破裂と。クエリの応答速度に影響を与えます。
- (ソリューション何より:サブライブラリーのサブテーブル、転写バックアップ履歴)
- GatewayWorker通信フレームワークは、高い同時実行性をサポートできない、単一サーバー展開です。