WebSocketを使ってるWebサービスをスケールさせる
2019-12-25 21:17:39 Author: furutsuki.hatenablog.com(查看原文) 阅读量:239 收藏

 対象として簡単なチャットシステムを考えます。ユーザがメッセージを送信するとそれはwebsocket経由でサーバに送信され、それを受け取ったサーバはいわゆるbroadcastを行い、接続している各クライアントにメッセージを配信します。

f:id:Furutsuki:20191225203742p:plain

 ところで、Webサービスはスケールさせたくなります。なんか必要に応じて動的にサーバの数が変わったりするらしいです。するとこうでしょうか。

f:id:Furutsuki:20191225204429p:plain

 ロードバランサ経由でどうWebSocketをつなぐのかはいい感じに解決したとしても、異なるサーバに繋がれたクライアント同士ではメッセージを交換できない、という問題が生じます。こまりました。

 調べてみると、どうやらRedisのPub/Sub機能を使うらしいです *1

 図にするとこうですか。

f:id:Furutsuki:20191225205054p:plain

 裏側はたぶんRedisじゃなくてもPub/Subさえできれば何でもよくて、要するにクライアントととサーバがN : 1 で繋がっていたように、サーバとRedisがN : 1で繋がる、いわゆる木のような構造をつくってメッセージを配信していることになります。なるほどなぁ。

 というのに感心したのとRedis触ってみたくなったのとでPoCのようなものを書きました。 make build とかしてバイナリとdocker imageを作って、docker-compose up --scale server=2 などとすると、上図のような構成になります(LBはないですが)。

kaidsuka/wscalechat at master · theoremoon/kaidsuka · GitHub

f:id:Furutsuki:20191225205950p:plain

 実ネットワークでどのくらいのオーバヘッドがあるのかはよくわかりませんがとりあえず動いて嬉しいです。ただ、これRedisが1台だけだと結局どこかで限界が訪れることになるはずで、その場合はどうするんでしょう。木の高さを増やしていくのか、どこかでメッシュ型にするのか、よくわかりませんね。

 この記事は憶測で構成されています。このあたりについて何かご存知だったり、当記事の誤りを発見された方は是非ご教授ください。

 この記事の図はdraw.ioを使ってかきました。ソースコードhttps://github.com/gorilla/websocket/tree/master/examples/chat を真似てます。


文章来源: https://furutsuki.hatenablog.com/entry/2019/12/25/211739
如有侵权请联系:admin#unsafe.sh