Javaの新鮮なビジネスプラットフォーム-SpringCloudマイクロサービスアーキテクチャの戦闘並行性の高いパラメータ最適化
I、EDITORIAL
私はマイクロサービスアーキテクチャを構築するために自分の会社で春クラウドフレームワークを使用している私の友人の電子ビジネスプラットフォームロットの新鮮なJavaプラットフォームを信じて、結局、これは技術の非常に火災です。
春クラウドを利用して、従来のITシステムの利用者の少量のみが露出することができる場合は、問題を見ていません。
量がより多くのユーザー、毎秒ピーク、並行システムの数万のためのインターネット会社の要求である場合には、春のクラウド技術を使用して注意が必要ないくつかの問題があります。
第二に、シーンの導入、早期の問題
インターネットのようなビジネスを行う会社の友人は、アップシステムのマイクロサービスアーキテクチャを構築する春のクラウド技術スタックの使用上、小さな研究開発チームを設置しました。
それを行うには、通常は通常のQAテストはすべての主要な問題を見つけることができませんでしたいくつかの時間、最終的には、コアビジネスシステムのための残業の昼と夜は、私はかなり良いパフォーマンスを感じ、すべてが完璧です。
システムライン上のように、そして、ユーザは、小規模、登録ユーザー数千人の、ユーザーの日活の何十万もの少量を開始します。
毎日、データベース内のテーブルに新しいデータは、そう時間をかけて、データのサイズは、実際にゆっくりと、単一のテーブルの何百万人に育つとは思いませんでした。
それは、また非常に間違っていないようです。この時間は、ユーザーがいくつかのオペレーティングシステムは、ブラシアウトページカトン数秒を感じるだろうことを訴えていることです。
これはなぜそれで?
コアの理由は、数百万の大規模な単一のテーブルデータの数、です。
たくさんの関連付けられた個々のサービス、実行するSQLはより複雑で、マルチテーブル
そして、良いインデックス、またはインデックスのデザインが、いくつかの兄のフラストレーションは、SQLの行数百人を書いた設計ではない、SQLが複雑すぎる場合、SQLは、数秒を使い果たし確かに正常です。
我々はマイクロサービスフレームワークを少し理解していれば、それはたとえば装う+サービス起動フレームワークリボン組成のために、言ったタイムアウトを呼び出すためのインターフェースがあり、知っておくべき、タイムアウトインターフェース呼び出しを設定することができ、いくつかのパラメータがあります。
あなたは数秒のブラシが出てこないため、人々はタイムアウト例外を返しますインターフェースを呼び出す場合は、ユーザーがページを磨くません。
良いよりも第三に、若いトムはちょうど沸騰し、危害
一般的にこの種のものに遭遇し、糞の大きな塊そこにSQLのように、SQLを見て、エンジニアの80%は、時間の書き換えと最適化を費やすことを望んでいない、読んでいない月の自国民を書きます。
まず、修正人件費は、この責任の負担が高すぎる、と二人でしょうですか?
正常に稼働しているシステム、それが遅いのポイントである、あなたは、単に復興を通じて方向転換の結果は、システムのコアビジネスプロセスを行う方法を掛け?
だから、それらの兄弟の最初の反応は:タイムアウトああを向上させます!インターフェイスの速度が遅くなることがありますが、ああ残業に応答しません!
のは、ユーザーがページを磨くことができない結果を返すために数秒を実行するためのインタフェースを作ろう!ノー再構成システム、ああ!幸せ+簡単!
それを高めるためにどのように?非常に単純な、知っている次のパラメータを見てみましょう。
以前の記事を読めば、あなたが知っておくべき、一般的には春の雲はhystrixスレッドプールで要求されたインターフェース呼び出しを実行することになります。
だから、タイムアウトは、一般的に2ヶ所、装うリボンや残業の作品だけでなく、hystrixピースのタイムアウトを設定する設定。後者の部分は、一般に前者タイムアウトよりも大きくなければなりません。
春の雲は、私は本当に仲間を滑らない春クラウドプレーをたくさん見て、本当にそのようにしたので、笑うことができ、これらの構成を見ていない、良い兄弟を演じます。
まあ、人生は続きます。。。
私はいくつかのユーザーページを磨くために遅い遅いが、少なくとも数秒だと思いますが、パラメータの最適化の後、効果は、かなりよさそうです。
今回は、何千人ものユーザーの日常生活は、単にすべてで最も何秒あたりの同時リクエストで10年か20年のピークによって複雑に何もしませんでした。
第四に、問題は、惨劇を勃発しました
時間が経つにつれて、同社のビジネスの急速な発展......
会社の弟、成熟した研削システム、十パイロットユーザーの何千ものはOKです後、上司はすぐに数千万の資金調達ラウンドを取得します。
同社は間違いなくああ元気になります!そして、運用チームを設置国の大規模な範囲を促進するためのチームをプッシュすること、です。
とにかく、三つの言葉:プッシュ!プッシュ!プッシュ!
プッシュは問題ではありません!バックグラウンドシステムにおけるR&D担当者が、加入者Cengceng線形成長こすることがわかります。
登録ユーザーは、万人のレベルを破って、いくつかの倍に増加し、日活のユーザーも、実際に日常生活のユーザーの何百万人に達し、その種のピーク時に、数回になって!
ハッピートラブル。。。
なぜあなたは言うのですか?アップユーザーの量なので、悲劇的な何かが起こりました。
秒あたりの同時リクエストのピークは、実際にほぼ1万度、到達怠慢をあえて兄弟のR&Dチームを!このプロセスでは、最初のサービスの緊張拡大のすべての種類の、1は、2つの4になり、2になります。
そして、データベースのマスタ・スレーブ・アーキテクチャをハングアップする、独立した読み取りおよび書き込みが要求され、どのように単一のデータベース・サーバまたはベアラ要求が大きいことができます!読み取り要求の数が多いので、基本的にはカン朱持ち歩き、ライブラリーから出て数以上。
Kouchaは物事が起こった多くの悲劇的です、リラックス、座って準備を進めています。
プロセスでは、それらの兄弟は、多くの場合、ページのピークの機能は、システムが突然全体が死亡ハングして、ただの要求に応えることができないことを見つけて下さい!すべてのユーザーは、このページを更新する一切対応することはできません!
これはなぜでしょうか?理由は簡単ああです!サービスの例は、呼び出し元のスレッドプールのスレッドは、サービスB、おそらく数十の合計に専念します。各スレッドの呼び出しサービスBは5秒間立ち往生されます。
どのような場合には、このサービスインスタンスそれ以上の1秒あたりの要求数百?スレッドプールのスレッドがすべて死んだがハングアップすること突然のすべては、その後、任意の要求に応答しません。
私たちは、以下のこの絵を見てみましょう、そして直感的には、このプロセスでは無力感を覚えます!
この時間は、私たちは、になって?兄弟は、マシンを再起動し、プログラマ最古の魔法に頼っ!
唯一のマシン内のビットの短い初期資源と同等の、マシンを再起動することができます出会いのページには、磨くません。
その後、操作の期間に続いて、再び再起動し、立ち往生!それは本当にああ崩壊さ!彼らは非常に貧弱なユーザーエクスペリエンスあり、上司の機嫌は怒っています!
画外音:
実際には、このこと自体は問題ではありませんが、春の雲のための本物の経験、高い同時実行のシナリオが存在しない場合は、確かに兄弟の束のように、いくつかの奇妙な問題を思い付くことがあります。
例えば、会社は、明らかにサービス・インターフェースのパフォーマンスを最適化するために行く必要があり、結果は単にタイムアウトをクランク。高い同時実行、デッドハングのサービスへの直接呼び出し、その結果、システムはブラシコアページから出てこない、ユーザーエクスペリエンス、およびこのせい?
第五に、根本的な原因に後方に曲がっ
私は助けるために誰かを見つけることができるもの、兄弟のバンドを、行うことはできません。ここでは彼らの完全なシステムの最適化のコース全体のガイドです。
第一歩
Bコアサービスのパフォーマンスの数値を最適化するためのキーポイント。インターネット企業は、コアビジネスロジックは、ユーザー指向のC末端高い同時要求は、データ量の列の単一のテーブルの何百万人として、それは数秒の実現につながる、大規模な、マルチテーブル関連のラインのSQLの数百を使用しないでください。
実際には、最良の方法はあるか、完全にこのような計算にいくつかの関連など、実行するには、Javaシステムに単純な単一テーブルのクエリと更新、および複雑なビジネスロジックを実行するためにデータベースに取り組んでいます。
このステップが終了し、コアサービスBの応答速度が数十ミリ秒に最適化された後、それは非常に満足していないのですか?数秒から数十ミリ秒に!
第二のステップ
そのタイムアウトは、それは、タイムアウトhystrixの設定上記とリボンたものです。
学生はいないため、システムのパフォーマンスの低下のため、あなたに助言し、インタフェースが混乱秒や残業の数十秒に怠け者である、一般的なタイムアウトが1秒以内に定義され、それがより一般的で合理的です。
なぜあなたは言うのですか?
インターフェースなので、理論的に最適な応答速度は200msの未満、または低速数百ミリ秒のインターフェイスである必要があります。
1秒+のインタフェースの応答時間は、キャッシング、インデックス、NoSQLのおよび他の技術を検討することをお勧めします場合は、パフォーマンスを最適化するために見て、考えることができます。
そうでなければ、あなたが何気なく数秒タイムアウトを設定した場合、あるいは数十秒の、ケースの下流応答サービスも時間ささいなことの問題は、寛大な、いくつかのチャンスはありますか?そして、あなたは、このスレッドプールのスレッドは、すべてのスタック飛びました!
hystrixスレッドプールやベストプラクティス生産タイムアウト特定、次の記事を参照してください:「ダブル11カーニバルでのマイクロサービスのアーキテクチャ99.99%の可用性を保護するための方法」
、実際には、通常のシステムのパフォーマンスを解決するためにこの2つのステップの後、Bのコアサービスは迅速に対応するだけでなく、1秒のタイムアウト以内に、状況hystrix頻繁にスタックスレッド・プールは表示されません。
第三段階
事は、それは経験不足だった、あなたが本当にそれを得るための2つのステップを考える必要が、終了していません。
あなたは1秒のタイムアウトになりたい場合は、ネットワークのジッタが偶発的、インタフェースの呼び出しで結果が1.5秒それであれば理由は?ネットワークインタフェース偶然の呼び出しの問題がタイムアウトので、これは、よくあるケースです。
したがって、通常の合理的なセットの再試行タイムアウト期間、この時点で、次のように
この再試行を設定した後、春クラウドを組み合わせ装う+であなたがタイムアウト要求が失敗したマシンを発見した場合リボンは、サービスの呼び出しを行う、それは自動的にこのマシンを再試行するとき、または別のマシンに変更されますされていない場合もう一度お試しください。
ネットワーク要求のために、このような時折タイムアウトので、避ける自動的に再試行することはできませんか?
第四段階
実際には、事は、場合retryパラメータの設定を終了していない、との結果が、あなたが実際に行ってみましょう、それは他の人ああの責任を負いませんでした!
お使いのシステムアーキテクチャ、それは、冪等は、インターフェイス上のメカニズムを保護しなければならない、再試行しています。
あなたは何回か再試行するためのインターフェイスをペアそうでない場合、想像し、その結果を他の人がデータの挿入を繰り返して、どのようにそれを行うには?
実際、冪等性を保証自体は、ビジネスによると、一般的なシナリオ複雑ではありません。
競合が重複したデータを挿入しません場合は、とき一意のインデックスデータを挿入、データベース内で一意のインデックスを構築することができます
あなたはRedisのを介してデータを挿入するたびに、その値がすでに存在する場合は何を決めるか、一意のID値にRedisの通す、その後、そのデータを複製挿入しないでください。
このようないくつかのプログラムがあります。要するに、するインタフェースが複数回呼び出されたときにことを確認し、重複したデータを挿入することはできません。