聞きたいこと
現在「システム1」のような処理をしているシステムがあります。
スケールアウト出来ない為、システム2, 3, 4 等を考えたのですが最適解が分かりません。
※私が考えた中ではシステム4が良いかと思っていますが、実装に時間がかかりそうなのでまだ手を動かせていません。
Q1. 他にも良い処理方法はありますでしょうか。
Q2. スケールアウト可能なシステム設計として何か良い設計方法(デザインパターン等)を知りたいです。
※Javaで例えるとGoFのような物。スケールアウトについてのよく知られた手法があれば知りたいです。
Q3. スケールアウト可能なシステム用のライブラリ等はありますか?
※C# 用をご存知でなければ他の言語のライブラリでもご紹介頂けると助かります。
※プログラムのレイヤに限らず、別のレイヤのスケールアウトの話もご紹介頂けると助かります。「スケールアウトに適したDB設計がある」等
システム1
構成: 処理用サーバ1台のみ
- DB から処理対象のアカウントをID昇順で10件取得する。
- 1で取得したアカウント1つにつきスレッドを1つ建てる。合計10個の並列処理を行う。
- 2の終了を待機する。
- 1に戻る。
問題なく処理出来ます。
少しでも並列処理したかったのでスレッドを10個建てました。
しかし、ID 昇順に取得している為サーバを追加しても処理速度の向上が出来ません。
システム2
構成: 処理用サーバ2台
サーバ1
- DB から処理対象のアカウントをID昇順で、
IDが偶数のもの
を10件取得する。
以下略
サーバ2
- DB から処理対象のアカウントをID昇順で、
IDが奇数のもの
を10件取得する。
以下略
2台での処理に対応出来ました。
しかし、偶数と奇数だけなのでサーバ2台のスケールアウトしか対応できません。
また、テーブルデータを一部削除した場合、奇数と偶数にばらつきが出る可能性があり、最も効率よく分散して処理出来るかは不明です。
システム3
構成: 処理用サーバn台
- DB から処理対象のアカウントをID昇順で、
IDの下m桁が一致する物
を10件取得する。
以下略
n台の処理に対応できました。
1桁であれば最大10台、2桁であれば最大100台に対応できます。
しかし、サーバ3台の構成にする場合以下の様に振り分ける必要があり、サーバ3に負担がかかる事になります。
また、システム2と同じ問題を抱えている上に、サーバ追加、削除時に値を振り直す必要があるので面倒です。
サーバ番号 | 下1桁 |
---|---|
1 | 0, 1, 2 |
2 | 3, 4, 5 |
3 | 6, 7, 8 ,9 |
システム4
構成:指示用サーバ1台、処理用サーバn台
- 指示用サーバで、DB から処理対象のアカウントをID昇順で全件取得する。
- 1で取得したアカウントを処理用サーバn台に順番に振り分ける。
- 処理用サーバは指示用サーバから受信したアカウントデータを元に処理する。
n台の処理に対応できました。
システム2やシステム3の問題を解決できました。
しかし、通信やスレッドの管理等がある為、指示用サーバと処理用サーバの
プログラムを正しく実装する事にかなり時間がかかりそうです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/01 10:17