この記事では、ネットワークインターフェイスを動的に切り替える機能を整理する方法に焦点を当てます。
この問題の原因は、ソーシャルネットワークから大量の情報を収集する必要があった以前のsocmetr.ruプロジェクトから拡大し始めたため、インターネットで唯一のチャネルが詰まりました。 分析では、圧縮しても受信情報の量が非常に多いためブロックされ、CPUとメモリの容量は20%使用されず、ディスクサブシステムはほとんど常にアイドル状態になります。つまり、チャネル幅によって制限されます。プロバイダーが提供します。
最初に考えたのは、少し冷静に考えながら、広範な方法で機能を単純に向上させることでした。私たちは問題を未来にシフトしていることに気付きました。 もちろん、「私たちは同志をどこへ行こうか」という疑問が生じました。 その結果、次のアイデアを実現しました。
![画像](http://socmetr.ru/work/20170111/habr-diagrams.png)
サーバーのセットアップ
構成は均一に見えるため、記号表記を導入することは理にかなっています。
A 1は最初のネットワークインターフェース、A 2は2番目の... A Nは最後のネットワークインターフェースです。
IP 1はネットワークインターフェイスA 1に関連付けられたIPアドレス、IP 2はA 2に関連付けられたアドレスです... IP NはA Nに関連付けられたアドレスです
GW 1はプロバイダーゲートウェイP 1 (プロバイダー1)のIPアドレス、GW 2はプロバイダーP 2のゲートウェイアドレスです... GW NはゲートウェイアドレスP Nです
GW 1 _NETはプロバイダーのネットワークP 1のIPアドレス、GW 2 _NETはプロバイダーのネットワークP 2のIPアドレスです... GW N _NETはプロバイダーのネットワークP NのIPアドレスです
その後、次のように設定を行うことができます。
N- ( N - ) ip route add {GW1_NET} dev {A1} src {IP1} table T1 ip route add default via {GW1} table T1 ... ip route add {GWn_NET} dev {An} src {IPn} table Tn ip route add default via {GWn} table Tn : ip route add {GW1_NET} dev {A1} src {IP1} ... ip route add {GWn_NET} dev {An} src {IPn} ip route add default via {GW1} : ip rule add from {IP1} table T1 ... ip rule add from {IPn} table Tn
そして問題は、特定のインターフェイスへのすべてのリクエストがそれから応答を受信することを保証する設定を取得することです。
使用する
異なるネットワークアダプターを使用するには、特定のプログラミング言語の設計を使用するか、サードパーティのライブラリを使用する必要があります。 Javaでは、これはソケットを介して行うことができます。例:
socket.bind(new InetSocketAddress(InetAddress.getByName("network-adapter"), port));
このスキームを実装することにより、情報システムのライフサイクルのさまざまな段階で、サーバーで発生するビジネスプロセスとロジックに応じて、インターネットチャネルの帯域幅を制御することができました。
長所:
- インターネットチャネルの柔軟なスケーリング(新しいプロバイダーを接続し、現在のプロバイダーの帯域幅を増やすことにより、インターネットチャネル全体をいつでも増減できる機会を得て、その容量を計画および予測することが可能になります)
- 負荷を管理する機能、それぞれ
- 任意のサブシステムがいつでも任意のチャネルまたはそのシーケンスを使用する機能
短所:
- 適切な機器の購入に関する初期費用
- 多くのインターネットサービスプロバイダーの必須の可用性
おそらく誰かが同様の問題に既に直面していて、私たちは自転車を作ったので、解決策に対する批判は大歓迎です。