ホームページ  >  記事  >  Java  >  Javaアーキテクトの道 ~電流制限技術と多彩なプログラミング言語~

Javaアーキテクトの道 ~電流制限技術と多彩なプログラミング言語~

巴扎黑
巴扎黑オリジナル
2017-06-26 11:48:441905ブラウズ

現在市場に出回っているプログラミング言語は主にオブジェクト指向です。オブジェクト指向は、最も基本的なことから始める必要があります。たとえば、私は 24 歳で結婚しましたが、そうでなければどうやってオブジェクト指向プログラミングを行うことができますか。そして、結婚してすぐに子供ができたら、パートナーが逃げたらどうしますか?作成と破棄にコストがかかる場合は、子を作成してオブジェクトへの参照を保持し続ける方が良いでしょう。

なぜ長時間話す人もいれば、一度だけ話す人もいるのですか?私の観察によれば、ほぼ同じように仕事をする二人の人のほうが、将来的にはより良く成長するでしょう。その理由を具体例から感じてみましょう。

友達とチャットするとき、実際、数年前に Renren から出てきた人たちは、いつもちょっとした技術オタクの精神を持っています。あなたのビデオがどのように保存され、再生されているかを人々が私に尋ねます。私が取り組んでいるのはコンテンツとメタだけで、残りは私には関係ないと言いました。ティアンアーは死ぬほどおしゃべりし、彼のパターンは定位置に落ちた。私が行っている開発プラットフォームがあるとすれば、それにはビデオのアップロードが含まれます。まず、初期化のためにクラウド ストレージ インターフェイスを呼び出します。すると、ビデオ メディアのアップロード URL が返されます。 JS 側はメディア フラグメントを URL にアップロードします。ネットワークが中断された場合、またはブラウザが閉じられた場合は、再開インターフェイスを呼び出して、新しく返された URL を使用してアップロードを続行できます。転送再開インターフェイスには、合計ファイル サイズと、これまでに受信したファイルのサイズが含まれており、JS はこれを使用して転送を続行するフラグメントを決定できます。クラウド ストレージは、クラウド トランスコーディング部門との通信を担当します。クラウド トランスコーディングでは、オリジナルの高解像度ファイルからさまざまなビット レートへの変換、および DRM デジタル著作権管理が行われます。それを行う方法はクラウドトランスコーディング部門の責任です。さまざまな DNS ノードに分散するために、内部ではどのような戦略が使用されていますか?ビデオ Web サイトの最も貴重な帯域幅を節約するために、スケジューリング部門がどのようにスケジュールを設定するのか、その具体的な詳細についてはよくわかりません。クラウドのトランスコーディング部門は、変換されたビット レートとビデオ URL を MQ 形式で当社に渡し、データベースに保存します。

それから彼らはもう一度尋ねました、MQ には何を使っていますか? Apache の qpidd について話しています。う~ん、知らないと話がつまらないですよね。したがって、MQ も同様であり、rabbit mq と同様に、AMQP 高度なメッセージ キュー プロトコルに基づいていると言わざるを得ません。これは同社の統合クラスタであり、インストールや導入が非常に便利だという。主流のプログラミング言語もサポートしているので、私はそれを使用しています。主に部門を越えた通信であるため、主に利便性と通信コストの節約を目的としており、メッセージ本文は最初に json 圧縮され、次に Base64 で圧縮されます。また、protobuf のバイナリも使用しません。問題が発生した場合、バイナリは可読性が低く、自己記述が不足しており、トラブルシューティングが容易ではないからです。

同時実行性の高いサービスには、サービスの中断、ダウングレード、分離、電流制限、非同期 RPC などの緊急計画が必要です。サービスの中断、ダウングレード、分離のために、誰もが Netflix のオープンソース分散サービス弾力性フレームワーク Hystrix を使用することを好みます。 Hystrix はトラフィックを制限することもできます。ただし、私たちのサービスは、成熟したトークン バケット アルゴリズムである guava の RateLimiter を使用して実装しています。

サービスのスロットリングは非常に簡単な問題です。私たちのコードには数百行しかありませんが、比較的完全な設計アイデアが含まれています。その目的は、特定の戦略 (URL、プラットフォーム ソース、URL + プラットフォーム ソースなど) に基づいて、きめ細かいビジネス電流制限を実装することです。

すべてのリクエストはこのインターセプターを通過する必要があります。このインターセプターは、現在の制限ホルダーの単一のインスタンスを定義し、制限で構成されるマップをそれぞれ設定します。インターセプターを使用して、対応するキーと RateLimiter を要求します。インターセプタが制限を超えていると判断した場合、処理のためにコントローラに渡されることなく、エラーが直接返されます。 URL などのリクエスト タイプ、きめ細かいレート制限のための RateLimiter。

もちろん、このアプリケーションレベルの電流制限に加えて、IP セッションスペース、リクエスト頻度、同時実行性に関するいくつかの制限を nginx レベルで実装することもできます。ネットワーク攻撃に遭遇した場合は、運用保守レベルから問題解決を試みてください。レベルが高いほどサービスへの影響を最小限に抑えることができます。

優れたソフトウェアアーキテクチャは、システムの品質を満たし、受益者が一貫した目標を達成できるようにし、計画プロセスをサポートし、システム開発のガイダンスを提供し、複雑さを効果的に管理し、再利用の基礎を築き、メンテナンスコストを削減することができます。競合分析をサポートします。

ほとんどのアーキテクチャやプログラミング言語はプロジェクトから生まれます。たとえば、C++ の発明者である Stroustrup がこの言語を設計した当初の意図は、C 言語が不当な初期化パラメータによって重大なプログラミングの問題を引き起こすことを確認することでした。このようなバグは見つけるのが困難です。この問題はクリーニング中にも発生します。それをやり続ければ、必ず成功します。しかし、すべてのものには形成と発展の段階があります。 Java は古いバージョンのパフォーマンス上の問題について苦情が寄せられており、Java の各バージョンにはパフォーマンスの向上が伴うため、JVM をアップグレードすると無料でパフォーマンスの向上がもたらされます。詳細について考えると、final キーワードが思い浮かびます。初期のバージョンでは、final キーワードの部分がインラインで呼び出され、パフォーマンスのオーバーヘッドを引き起こすパラメータのスタックへの継続的なプッシュおよびポップを必要とせずに関数を直接展開していました。 。ただし、関数本体が大きい場合、これにより比較的大きなスペースのオーバーヘッドが発生します。 JVM は 1.5 以降最適化されており、final キーワードはパフォーマンスの点でそれほど重要ではなくなりました。会社にとても優しくて素晴らしいアイデアを持った同僚がいることが分かりました。彼はこう言いました。「私はいつも自分のアイデアのいくつかをノートに記録します。そして、しばらくしてからそれを見ると、その時はそのうちの 1 つのアイデアだけを忠実に実行し、それが成功したことがわかります。 「彼は思っているよりも成功からは程遠いと思います。なぜなら、彼にはアイデアしかなかったのに、それを実行しなかったからです。 JDK1.0という考え方しかないようですが、成功までの距離は少なくともjdk1.5です。

Pythonは、コードサイズが小さく、メンテナンスコストが低く、プログラミング効率が高いことで有名です。しかし、低メンテナンスコストと高いプログラミング効率を実現するために最適化されていないプログラミング言語がどれだけあるでしょうか?そこで人々は、検索エンジンはすでに炎上しているのではないかと私に尋ねましたが、将来的には独自の利点を本当に生み出すことができるのでしょうか。私が言えるのは、試してみなければどうやって分かるだろうか、ということだけだ。 「人生は短い、私は Python を使っています。」 Python のこれらの機能により、女の子をナンパするための時間を増やすことができますが、人生は短いです。 Python 作者の宣伝文句は Python に活力を与えます。実際、Python の単純さは、メモリのリサイクルからわかります。そのため、循環参照の問題は発生しません。 RenrenにいたときにPythonプロジェクトをやっていました。リーダーが「8人分の仕事を一人でやっている」と言っていた時期がありました。ウェブサイト全体のメンテナンス業務に加えて、さまざまな新しい仕事も引き受けています。この性格のせいで、他の人は私に近づくことができず、私は自分自身を困らせるだけで、他の人には迷惑をかけません。当時、私は働き始めて4年足らず、プログラミングを始めて2年足らずで、最初の2年間は日本語の翻訳者として働いていたと言いました。みんなに行ける理由。ある日、私は北京に来て、先輩たちと一緒に頤和園を訪れていました。突然、Renren.com から面接の電話を受けました。電話の相手は私にさまざまな技術的な質問をしましたが、私の答えはすべて「ノー」でした。相手はとても親切で、それは問題ではないと言いました。最後に、電話の向こうに面接官がいて、私に日本語で話しかけ、私の答えにとても満足していました。なぜなら、私の日本語がとても上手だったからです。その結果、私は Renren.com のブリッジ エンジニアになりました。以前書いた記事の個人プロフィールで、ネットユーザーから語学の才能を批判されたと書いたのを覚えていますが、東軟にいた頃は皆から語学の才能があると言われ、そう思うことに慣れていました。 . 私はそれを当然のこととして述べているだけであり、それを宣伝するつもりはありません。私はPythonも知りませんし、オープンプラットフォームが何なのかも知りません。しかし、オープンプラットフォームのボスが美団に去ったため、オープンプラットフォーム全体のメンテナンスを私が一人で引き継ぎました。ちなみに、この上司は本当に素晴らしい人で、清華大学から来て、起業して、Renrenに来て、美団に行って、今は自分のビジネスを始めています。ある日、彼氏が清華同窓会の写真を見せて、「この人はあなたの元同僚ですか?」と尋ねました。私は「そうだね」と言いました。彼は「彼の隣に座っている人は私たちの上司です」と言いました。まあ、私の男性アイドルには改善の余地がたくさんあるようです。

私はこのオープンなプラットフォームをしっかりと守って維持しています。その後、バブルフィッシュゲームは日本のプラットフォームに接続されます。このゲームはPythonで書かれています。当時、このゲームは非常に人気があり、ゲーム会社は非常に忙しく、接続する時間がなかったので、私たちに協力金を払ってくれました。コードを取得して自分で接続することしかできません。当時、Renren は社内起業に取り組むのが好きでした。私たちは海外事業部門であり、お金を稼いでいませんでした。接続して、ゲームパーティから接続料10万もらって、残りがゲームの取り分だったんですが、収入はいくらだったでしょうか。しかし、これは当時私たちにとって唯一の利益をもたらすプロジェクトでした。 Python は学ぶのがとても簡単です。日中はウェブサイトを保守し、夜にみんなが私のところに来て、Python の勉強とドキュメントへのアクセスを行い、支払いのアクセス部分を 1 週間で完了します。テスト環境は有料です。しかし、運用保守MMが構築した正式環境をオンライン化する際に問題が発生しました。夕方にはみんなが帰って、私はそこで一人でオンライン環境の整備をしました。その後、インストールされているツールの一部のバージョンが間違っていることに最終的に気づきましたが、詳細は思い出せません。それは6年前の出来事でした。つまり、Pythonをやったことはありますが、Pythonについては知りません。

JavaとC++の間には高い壁があり、動的メモリ割り当てやガベージコレクション技術に囲まれており、壁の外にいる人は入りたがりますが、壁の中にいる人は出たがります。 Java ではそれほど気楽に行うことはできません。つまり、メモリ割り当てパラメータを最適化するということです。JVM パラメータの最適化について言えば、実際、誰もが知っていても真剣に考えていない最も一般的なことは、初期の最大値と最小値を設定することです。ヒープの自動拡張を回避するために、ヒープの値を同じ値に変更し、スループットの低下と遅延によって引き起こされるフル gc の新世代と旧世代のサイズを調整します。マイナーgcを含むJVMのほぼ全てのgc操作は世界を止めないといけないと言われています

最後に皆さんにオススメしたいのは海外のサイトです。分析を中心に、実践的なツールやチューニング手法が多く紹介されています。代表作に『彼

』などがある。

以上がJavaアーキテクトの道 ~電流制限技術と多彩なプログラミング言語~の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。