🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

デザインパターン

デザインパターンは、ソフトウェアのデザインでよく起きる問題に対して、解決策をノウハウとして蓄積し再利用出来るようにした設計パターンを指します。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

Q&A

解決済

1回答

1442閲覧

スケールアウト可能なシステムを作りたい

iazra20911

総合スコア10

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

デザインパターン

デザインパターンは、ソフトウェアのデザインでよく起きる問題に対して、解決策をノウハウとして蓄積し再利用出来るようにした設計パターンを指します。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

0グッド

0クリップ

投稿2019/12/26 04:42

編集2019/12/26 04:46

聞きたいこと

現在「システム1」のような処理をしているシステムがあります。
スケールアウト出来ない為、システム2, 3, 4 等を考えたのですが最適解が分かりません。
※私が考えた中ではシステム4が良いかと思っていますが、実装に時間がかかりそうなのでまだ手を動かせていません。

Q1. 他にも良い処理方法はありますでしょうか。

Q2. スケールアウト可能なシステム設計として何か良い設計方法(デザインパターン等)を知りたいです。
※Javaで例えるとGoFのような物。スケールアウトについてのよく知られた手法があれば知りたいです。

Q3. スケールアウト可能なシステム用のライブラリ等はありますか?
※C# 用をご存知でなければ他の言語のライブラリでもご紹介頂けると助かります。
※プログラムのレイヤに限らず、別のレイヤのスケールアウトの話もご紹介頂けると助かります。「スケールアウトに適したDB設計がある」等

システム1

構成: 処理用サーバ1台のみ

  1. DB から処理対象のアカウントをID昇順で10件取得する。
  2. 1で取得したアカウント1つにつきスレッドを1つ建てる。合計10個の並列処理を行う。
  3. 2の終了を待機する。
  4. 1に戻る。

問題なく処理出来ます。
少しでも並列処理したかったのでスレッドを10個建てました。
しかし、ID 昇順に取得している為サーバを追加しても処理速度の向上が出来ません。

システム2

構成: 処理用サーバ2台

サーバ1

  1. DB から処理対象のアカウントをID昇順で、IDが偶数のものを10件取得する。

以下略

サーバ2

  1. DB から処理対象のアカウントをID昇順で、IDが奇数のものを10件取得する。

以下略

2台での処理に対応出来ました。
しかし、偶数と奇数だけなのでサーバ2台のスケールアウトしか対応できません。
また、テーブルデータを一部削除した場合、奇数と偶数にばらつきが出る可能性があり、最も効率よく分散して処理出来るかは不明です。

システム3

構成: 処理用サーバn台

  1. DB から処理対象のアカウントをID昇順で、IDの下m桁が一致する物 を10件取得する。

以下略

n台の処理に対応できました。
1桁であれば最大10台、2桁であれば最大100台に対応できます。
しかし、サーバ3台の構成にする場合以下の様に振り分ける必要があり、サーバ3に負担がかかる事になります。
また、システム2と同じ問題を抱えている上に、サーバ追加、削除時に値を振り直す必要があるので面倒です。

サーバ番号下1桁
10, 1, 2
23, 4, 5
36, 7, 8 ,9

システム4

構成:指示用サーバ1台、処理用サーバn台

  1. 指示用サーバで、DB から処理対象のアカウントをID昇順で全件取得する。
  2. 1で取得したアカウントを処理用サーバn台に順番に振り分ける。
  3. 処理用サーバは指示用サーバから受信したアカウントデータを元に処理する。

n台の処理に対応できました。
システム2やシステム3の問題を解決できました。
しかし、通信やスレッドの管理等がある為、指示用サーバと処理用サーバの
プログラムを正しく実装する事にかなり時間がかかりそうです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

システム3は普通にIDを3で割った余りでいいと思います

このように余りを使った場合、偏りは出ると思いますが、
そのへんは大数の法則を期待するしかありません

気軽に台数を増減したいのなら、システム4の形式がよく
指示用サーバではなく、指示用テーブルをDBに作成しておき、
自分のサーバIDで紐付けて取得すればいいです

ただ、要件にもより、DBは1台でいいのか、複数のIDにまたがる処理はないのか
ボトルネックはどこなのか、などから最適な設計はいくらでも変わってきます
これが良いです、と言い切ることはできないです

投稿2019/12/26 06:15

izmktr

総合スコア2856

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

iazra20911

2020/01/01 10:17

おっしゃるとおり、システム3は余りで考えればよかったですね。 取り急ぎシステム3で実装して、将来を考えてシステム4に移行する形にしたいと思います。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問