問題タブ [horizontal-scaling]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
mysql - サーバーの水平スケーリング
スケーラビリティについて質問があります。サーバーがすべてを処理する Uno などのマルチプレイヤー ゲームがあるとします。(簡単にするために、これはテキストのみのゲームであると仮定します)。たとえば、クライアントでユーザーに情報を出力するために、サーバーはPRINT string
やCHOOSE data
(プレイするカードを選択する) などを送信します。この点で、クライアントは「愚か」であり、サーバーはゲーム ロジックを処理します。
これがプロトコル レベルでどのように機能するかの簡単な例:
サーバーが送信:PRINT Choose a card
サーバーが送信: CHOOSE Red 1,Blue 1
(ユーザーがボタンまたは何かを表示し、赤の 1 を選択)
クライアントが送信:Red 1
私がこのアーキテクチャを持っているとしましょう:
プレーヤー クラスtellData(String data
: ユーザーが持っているカードを保存します。おそらく、PRINT データを送信するいくつかのメソッド ( など) でsendPM()
、ユーザーにプライベート メッセージを送信できます)
Server Class : 認証を処理し、ユーザーが新しいゲームを作成できるようにし、参加できるゲームのリストをユーザーに表示します
Game Class : カードをプレイしているユーザーを処理し、新しいプレーヤーへの切り替えを処理し、 などtellData()
のプレーヤー クラスのメソッドを呼び出します。pickCard()
複数のコンピューターでサーバーを実行するには、これをどのようにスケーリングしますか? 現在、すべてのユーザーが 1 つのサーバーに接続しており、相互にやり取りするには Player、Server、および Game クラスが必要です。誰かが提案を提供したり、これに関する優れたリソース/本を教えてくれたりすると、非常にありがたいです (いいえ、これは宿題やビジネスのためのものではありません。これは単なる個人的なプロジェクトであり、私の)。スケーラビリティの観点から、別のサーバーを追加して、プレーヤーの追加負荷を処理できるようにしたいのですが、同時接続数は最大で 1000 になります。
また、ゲームを追加すると、スケーラビリティの課題が大幅に難しくなりますか?
さらに、ゲームデータを保存する最良の方法は何ですか? SQL データベース、またはオブジェクトのシリアル化、または何ですか? つまり、3 人のユーザーが Uno のゲームに参加していて、後でそのゲームに戻りたいとします。カードとゲームに関する情報を Player/Server/Game クラス (RAM) に永久に保存したくありません - これをどこかにダンプしたいので、ユーザーがログインしたときに情報をロードできます。 RAM にダンプされ、次に適切な Player/Game オブジェクトにダンプされます。
最後に、サーバーを強制終了せずにサーバーに変更を加えて再起動するにはどうすればよいですか? サーバーが Java または Python で作成されているとします。
誰かが提案やいくつかのリソースを提供できる場合、それは大歓迎です-これには、私が最初に述べたアーキテクチャの変更が含まれます.
助けてくれてありがとう!!
編集: このテーマに関して、皆さんがお勧めする良い本や講演はありますか?
php - PHP cURL は RAM またはプロセッサの電力を使い果たしますか?
現在、PHP cURL を使用して 1 分間に数百ページを同時にダウンロードするスクレイパー スクリプトを使用しています。
1 つのメイン サーバーといくつかのリモート サーバーがPHP cURLを使用してページをダウンロードし、 REMOTE MYSQL 接続を使用してデータを送り返すようにセットアップしました(データはメイン サーバーに保存されます)。
これらのサーバーのコストを最適化して削減しようとしています。では、水平方向または垂直方向にスケーリングする必要がありますか? より多くの RAM やプロセッサ パワーを探す必要がありますか?
どんな助けでも大歓迎です。
node.js - Heroku および Node.js での Websocket のスケーリング
Heroku でかなりの数の WebSocket 接続を処理する大規模なアプリケーションがあるとします。このような大きな需要に対処するために、dyno の数は に増加しN
ます。
Heroku のルーターは、実行中の dyno 間で新しい受信 Websocket 接続をどのように分散するのでしょうか?
言い換えれば、dyno の 1 つが Websocket 接続で最大限に使用されている場合、Heroku のルーターは、他の (おそらく) あまり使用されていない dyno の間ですべての新しい着信要求を逸脱するのでしょうか? それとも、http 着信接続のドキュメントに記載されているように、ランダムな割り当てを引き続き使用しますか?
Websocket接続は最初のインスタンスではhttp接続であるため、これは間違いなく理にかなっています。N
ただし、実行中の dyno間で多数の永続的な接続を均等にスケーリングするのはかなり複雑です。
誰でも確認できますか?
nosql - 従来の RDBMS での水平スケーリング
私は、天からの利点をすべて備えた NoSQL システムに出くわしました。それらの 1 つは、楽な水平方向のスケーリングのようです。私の質問は、MySQL や SQL Server のような古典的な RDBMS が水平方向のスケーリングに対応していないのはなぜですか? または、NoSQL システムと同程度にそれを行うことができませんか?
mysql - ActiveRecord を介して複数のデータベースにクエリを分散する
マルチマスター MySQL クラスターがあり、Rails プロジェクトからの読み取り/書き込みクエリを、ロード バランサーを使用して複数のサーバーに分散したいと考えています。
問題は、私の知る限り、Rails はサーバーの存続期間中、接続オブジェクトを存続させようとすることです。ただし、HAProxy は、クエリごとに新しい接続が開かれたときにのみクエリを分散します。これは私が望むものではありません。接続ごとではなく、クエリごとに配布したい。
Rails クエリをクエリごとにサーバーからマルチマスター サーバーに分散するためのオプションは何ですか?
注: これは高可用性の状況であり、すべての SQL サーバーが常に稼働しているかどうかはわかりません。これが、haproxy を使用する理由です。
java - スケーリングの問題:NIO のセレクター
私が使用Selector
したシナリオIO multiplexing
は次のとおりです。
1 つのプライマリ コンテンツ サーバーと 100 のセカンダリ コンテンツ サーバーがあります。セカンダリ サーバーは変更されたコンテンツ メタ情報を送信し、プライマリ サーバーのすべての最新コンテンツ情報が更新されるようにします。最初の設計では、2 次サーバーに 1 対 1 でマップされた 100 個の開いたソケットに対して 100 個のスレッドを使用していました。しかし、より多くのセカンダリ サーバーをサポートする必要がSelectors
あるため、1 つのスレッドが IO 多重化 ( ) を実行し、ワーカー threadPool (サイズ 50 の固定スレッド プールselector.select()
) に送信するように設計を変更しました。SelectionKey
最も幸せな部分は、デザインがうまくいったことです。
このいくつかの質問を実装した後、私の頭に浮かんだのは次のとおりです。
セカンダリ コンテンツ サーバーが 1 秒間に 100/1000 のリクエストを送信した場合、この設計はうまくいくでしょうか (現在、セカンダリ コンテンツ サーバーごとに 1 秒あたり 5 ~ 7 のリクエストを取得しています)。上記の設計は、問題をもう 1 層下に押し込むことに他ならないと感じているためですが、問題はまだ残っています。私は正しいですか?
上記の設計は、セカンダリ サーバーの数を 100 から 500 にスケーリングする問題を解決するだけですが、1 秒あたりのリクエストをスケーリングしたい場合、つまり 5req/sec から 1000 req/sec を想定する場合、問題は解決しません。
mongodb - シャード mongodb でドキュメントを予約する
mongodb にシャードされたドキュメントのコレクションがあり、それにアクセスするいくつかのアプリケーション サーバーがあります。
各アプリケーションは新しいドキュメントを提供し、最終的には一部を削除する必要があります。
どのドキュメントが削除されるかは問題ではありませんが、正確な数を削除 (クレーム) し、他のアプリケーションが同じドキュメントを削除 (クレーム) していないことが重要です。
私の考えは:
このソリューションの潜在的な問題の 1 つは、アプリケーションが多すぎる (およびドキュメントが少ない) 場合、アプリケーションがいくつかのドキュメントを要求して再度リリースし続けることです。
この問題に対するよく知られており、十分にテストされた解決策は何ですか?
「update」と「findAndModify」は、更新されたドキュメントが更新前のクエリと一致することを保証していますか?
または、別のアプリケーションが照合と更新の間にそれを「盗み」、両方のアプリケーションがドキュメントを主張したと考える可能性がありますか?
java - 双方向 SSL Tomcat ステートレス サービス スケール
Tomcat WebサーバーにデプロイされたJavaのステートレスサービスがあり、双方向ssl認証も構成しています。この時点まで、すべてが正常に機能します。新しいクライアントがある場合、新しいクライアント証明書をトラストアに入れ、サービスを再起動するだけで、新しいクライアントがサービスを使用できるようになります。
しかし、私のサービスはステートレスであるため、水平方向のスケーリングが必要ですが、それで問題はありませんが、10 台のサーバーがある場合は、各サーバーに移動して各トラストア ファイルでこの変更を行いたくありません。
何か案は?