ホームページ  >  記事  >  バックエンド開発  >  Golang が同時実行性の高い瞬間にキルに遭遇したとき~

Golang が同時実行性の高い瞬間にキルに遭遇したとき~

藏色散人
藏色散人転載
2020-10-29 15:10:482219ブラウズ

下面由golang教程栏目给大家介绍当Golang遇到高并発行秒杀,希望对需要的朋友有所帮助! GO 発言はまた、ゲームの 1 回の会議でもあり、動作上はフレームワークに関連した問題であり、爆破よりも新しい開発の発言には注目が必要です。 #####################################################################)反対に多くの人が真の行為を開始しませんでした。ザクセンは常に GO を想定しており (コード規則が一致し、泥水を徹底的に除去し、配置が単一で、速度が速いため)、これらの変更は、時々、変更される可能性があります。真否到多多大帮助,后来系统逐次開始用GO实现,用多了ゆっくりゆっくり地刊现:

咦~,配置再也不要浮架建依赖环境了(不配置环境播布,刚开開始还)真有点不习惯,总感觉少来点何;Golang が同時実行性の高い瞬間にキルに遭遇したとき~

别人写的代序視着也不反触心理,虽然说有的代コード不是自己写的,仔细阅读的時候感觉像是自己書写的、writeJAVA と PHP の時間阅读代コード哪は内心拒否绝的;

开発某マイクロサービス务接口一切变得简单了、書メイン、書帪接口、提交、秒秒种就上線上了~;

上記は主に GO との出会いと、GO が私に与えた最初の影響について話しています。ある夜、突然アイデアが私の頭に浮かびました。GO 言語のシンプルさは多くの改善をもたらし、私のアーキテクチャ システムはシステムの複雑さを単純化して軽減するために GO も使用できますか? このアイデアが浮かんで以来、私の頭の中にずっと残っています。私がアーキテクチャに取り組み始めた頃を思い返すと、ミドルウェアの原理や最適化によってパフォーマンスが向上することを知ったときは非常に興奮し、「マスターした」と思えるまで一生懸命勉強しました(もちろん今でもマスターしたいと思っています)。システムでは、システムアーキテクチャに使用されるミドルウェアコンポーネントが多ければ多いほど良いと感じており、システムのミドルウェアコンポーネントが多ければ多いほど、システムはより強力になります。しかし、長くやっていると、システムは使えさえすればよくて、アーキテクチャのために構築することはできないことがわかります。従来の技術スタックからの削除には、深い知識も必要です。技術原理を完全に理解することによってのみ、それを置き換えることができ、そうして初めて、問題を引き起こすことなく大胆に考えて実行することができるからです。ことわざにあるように、「すべての大陸はローマに通ずる。」個人的な観点から言えば、建築はその時のビジネスに適したものでなければなりません。建築設計の目標は、最小限のコストでできるだけ多くのことを達成することです。同じサーバー リソースを消費します。場合によっては、数倍、さらには数十回のリクエストをサポートできます。同じリクエスト量に達した場合、実装と展開は非常にシンプルで操作可能です。 GOさんの考えはこの時期、私に微妙に影響を与えてきました。

当社はマイクロサービスをやると決めるまで、最初はJavaを使ってマイクロサービスをやっていました。その後、他の言語でもマイクロサービスができるのではないかと考えたところ、自然とGOが思い浮かび、いろいろ迷った末、これでいいのではないかと思い、GOを使ったマイクロサービスをいくつか書き始めました。書いてみると、Golang はマイクロサービスを書くのに非常に適していることがわかりました。これは便利で、非常に効率的で、Tomcat をカプセル化する必要もありません (これを jar パッケージに入れるのは非常に不適切だと感じます)。バイナリは、Docker なしで実行できます。システムの依存関係 (信じられない人は試してみてください) 心の底から、GO はますます良くなってきています GO が好きになるほど、GO を使って後続のシステムを再構築したくなります (私はたくさんのことを書いています) Java、この便利さに出会うと春を見つけたような気分になります)GOはシステムアーキテクチャの考え方に深い影響を与えました。

しかし、建築とは正確には何ですか、そして建築家はどのように作られるのでしょうか? 建築家になるための 8 つの困難な段階を以下に示します:

最初の段落: レンガを動かすのは、できる人に分けられます。レンガを動かすのが得意な人と、レンガを動かすことしかできない人 (あるグループはレンガを動かすことに留まり、残りは成長し続けます);

2 番目の段落: レンガを動かすことができる人は、次のことができます。 Brick;

第 3 段落: 原理を理解する人は、常に研究している人と部分的に理解している人に分けられます。理解;

第 4 段落: 継続的な研究も、深い研究、幅広い研究、トンボ知識の 2 つのタイプに分類できます。深さと幅を持った人材は、純粋に技術系とビジネス系に分かれます (差別化が始まります);

第 6 段落: ビジネス系は良好なコミュニケーションが必要であり、システムや要件に対して一定の設計管理能力を持っている人;

段落 7: ヒープ ミドルウェアを使用して、このレベルの「アーキテクチャ」システムを構築するのは簡単です (ジュニア アーキテクト);

段落 8: このレベルでの非常に重要な点は次のとおりです。問題を慎重かつ包括的に検討し、コミュニケーションが上手であること。基盤となる実装を実行し、基盤となる原則を理解し、ビジネス、研究開発、テスト、展開、保守、アップグレードの複数の視点から開始し、現地の状況に応じて構築される「アーキテクチャ」は、開発効率、運用効率、開発品質、ビジネスの柔軟性を実現しますメンテナンスの便宜上、そのような人々をアーキテクトと呼ぶことができます (この分野の経験がある場合は、表面的には美しく見えても、実際には使いにくいアーキテクチャがどれほど多いかを考えてください)。

フラッシュ セール システムを構築する場合、最初に思い浮かび、最も簡単に考えられる従来のテクノロジー スタックは、分散セッション、Redis クラスター、分散キャッシュ、nginx リバース プロキシ、nginx の詳細な最適化、マシンの最適化、およびメッセージです。キュー。そう、キャップ氏も当時からそう考えていて、この「成熟した」技術を当社のフラッシュセールシステムに適用しても問題ないと考えていたのです。これ。

1. 分散セッション Nginx Web Redis クラスターを使用してセッションを保存し、セッション検証の目的を達成することに多大な労力を費やしました。セッションアーキテクチャ 以下の図に示すように:

Golang が同時実行性の高い瞬間にキルに遭遇したとき~ 一見問題なさそうに見えますが、このようになります。 Nginx と Web サーバーを追加します。これは水平方向の要件も満たします。拡張しますが、トラフィックが数億に達すると、ドアのコストが少し高くなります。また、往復のネットワーク リクエスト セッションの時間を絞りたいと考えています (そのときはいつも何かがおかしいと感じていました)、nginx もトラフィックが多いときに 504 が表示されることがあります。

2. 分散キャッシュ、これは非常に単純に見えますが、高トラフィックで同時実行性の高いシステムでは非常に複雑です。次の問題が発生する可能性があります。

1)キャッシュの一貫性(これを使うと下手すると売られすぎが起こります);

2) キャッシュの浸透;

3) キャッシュなだれ;

4) キャッシュブラックホールの質問:

5) ドッグパイル効果;

...注意すべき点はたくさんあります。つまり、分散キャッシュは非常に多用途で価値がありますが、高い同時実行性と大規模なトラフィックに対応できる分散キャッシュ システムを構築するには、非常に強力な技術チームが必要です。サポート、実装も非常に複雑なので、ここでは詳しく説明しません;

ただし、一見問題のないソリューションには大きな問題があります。実装は「難しすぎる」ため、しきい値は次のとおりです。高い。リソースコストも非常に高くなります。セッションは水平方向の拡張に対応する必要があり、Web キャッシュも redis クラスターを含む水平方向の拡張に対応する必要があります。唯一の方法はクラスターを継続的に追加することです。

簡単な例を示します (他のことはさておき)アーキテクチャの重要性を説明するための要因)、現在 1 台のマシンがあり、インターフェイスの処理能力が 5000QPS (8 コアおよび 8G) で、フラッシュ セールのために数億のトラフィックを処理する必要があると仮定します。フラッシュ セール開始時の瞬間トラフィックは平均 300W と推定されます 待ち時間は 7 秒に基づいて計算されます (インターフェイスは最大 3.5WQPS まで許容します)。結果として、システムには 90 近くのインターフェイスが必要です。同じ要件を持つ他のサポート サーバーは含まれません。これらのサポート サーバーについては、次のように簡単に説明します。;

1. まず第一に、nginx レベルは同じレベルの処理能力 (なしの場合、ユニットあたり約 2WQPS) を備えている必要があります。最適化、約 20 ユニットと推定されます);

2. Web インターフェイスも対応するレベルまで拡張する必要があります (推定 90 ユニット);

3. Reids クラスターは、次の場合に役立つ可能性があります。複数の製品です(個別の製品では、アクセス数が多い場合クラスタは役に立ちません);

上記は分散されています セッションが満たす必要があるマシン要件には分散キャッシュは含まれていません。フラッシュ セール システムを構築して実装することがいかに難しいか、そして展開の複雑さは考慮されていません。実装するのは非常に複雑で、4 ~ 5 年の経験を持つ 1 人か 2 人では実際には短期間で完了できません。簡素化する他の方法は考えられますか? 答えは「はい」です。まず原理を理解する必要があり、次にアーキテクチャから引き算を行う必要があります。使用しない場合は最適化する必要はありません。

どこを最適化する必要がありますか?

1) アクセス許可検証の原則に基づいて、Flash Kill 同時実行ではセッションを省略できます;

2) 分散キャッシュは使用できません (インターフェースに置き換える);

3) nginx を省略する (運用と保守の難易度を下げる);

4) Redis クラスターも省略できます;

この方法 2 番目、フラッシュ セールを行うにはどうすればよいでしょうか? Java と PHP では実現できないわけではありませんが、実装は難しい場合がありますが、GO 言語の機能と組み合わせて新しいアイデアを提供できるようになりました。

1. Nginx は省略できます、直接 GO を使用してポート公開サービスを開始します (nginx はここでは省略できます);

2. cookie メソッドまたは wt メソッドを使用して分散セッション ソリューションを置き換え、サーバー側コードレベルの検証;

3 .OverSold は Redis クラスターの代わりにインターフェイス フォームを使用します;

4.負荷分散は安価な SLB を使用します (Nginx を回避します);

フラッシュ セールの最適化後、大統領アーキテクチャは以下の図の構造として表示できます。詳細な方法は「Go High Concurrency Flash Kill Practice」を参照してください。

Golang が同時実行性の高い瞬間にキルに遭遇したとき~

変換結果より

1. Web アプリケーションはすべて Go を使用します。バイナリ ファイルをデプロイする方法については、centos サーバーは依存関係に従う必要はありません (デプロイが大幅に容易になります):

2. SLB の安価で実用的なソリューションを使用して、nginx リバース プロキシを回避します。高度な lua スクリプトでも回避できます ;

3. ここでは Redis クラスターも回避​​され、サービスはインターフェイスを通じて提供されます;

テクノロジー スタック全体が知っておく必要があるのは、高同時実行フラッシュの販売を完了するための GO、RabbitMQ、および Mysql のみです。このシステムは、操作の容易さの点で非常に魅力的です。以下の調整されたアーキテクチャに基づいて推測できます (現在、スタンドアロン GO は、Web インターフェイスを提供します。これは、最適化なしでおそらく 2WQPS に達する可能性があります):

1. 単一マシンの GO インターフェイスの権限検証パフォーマンスは 4 倍向上し、展開の複雑さは次のようになります。ゼロに近いこと (nginx、redis クラスター、および動作に依存する環境がない);

2. トラフィック レベルが増加し続けるため、改善するには、Web サーバーと数量制御サーバーを追加するだけで済みます。他のサービスのオーバーヘッドはありません (比例的な成長モデルとパフォーマンスのボトルネックがないため、スケーラビリティによりコストが可能な限り削減されていると言えます);

3. 従来のソリューションとの比較、サーバーの数は 4 倍以上削減されます (元のベースで計算できます); 実装の観点から見ると、GO は Web サービスを提供し、外部依存関係を減らすことができます (Web サービス自体のパフォーマンスも非常に高いです)。 GO の 2 つのジャストインタイム機能を使用すると、一致するアーキテクチャを差し引くだけでフラッシュ セール システム全体を実装することは難しくありません。もちろん、Java と PHP の両方で、上の図の調整されたフラッシュ セール アーキテクチャを実装できます。しかし多くの面から見て、大統領はGOよりも明らかに有利である。

計画を振り返ると、Go はそのシンプルさによって実装が容易になり、効率性と安定性の高さがアーキテクチャの最適化につながり、思考パターンの変化を促進したと感じます。優れたシステム アーキテクチャは、シンプルで効率的で、実装が簡単である必要があります。

以上がGolang が同時実行性の高い瞬間にキルに遭遇したとき~の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.imで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。