[I]経験本当の面接と面接アリの最初の「出会い」(添付問題詳細)

この記事の内容は、実際の経験を読者に基づいており、最初の数夜を前にようやく終わっ費やし、記事のこのスタイルを試みてから採用面接を掲示し、私はあなたを助けるために願っています。コスタリカは、ガイドからのオープンソースのコレクションがあるJavaGuideでは。この記事では、以下について説明します。

  1. ショッピングモール分散:アーキテクチャ図を説明します。
  2. 関連メッセージキュー:クリッピングとデカップリング。
  3. Redisの関連:キャッシュは浸透の問題を解決します。
  4. いくつかの基本的な質問:
    • ネットワーク関連:1つのブラウザは、伝送の信頼性を確保する方法を2.TCP UDPと3.TCPを何が起こったかの差のURLを入力してください???
    • Javaの基本:1バイトの流れがあるので、文字ストリーム2深いコピーと浅いコピーがあるなぜどのような違いは、それが作るん?

以下は、テキストです!

私の前に座って、面接の始まりは私がインタビュアーはありますか?これは、脂肪プログラマああの量のようなものを見ていませんか?私は唯一のインタビュアーが言っ聞いて、つぶやいていた:「男、良い午後は、私は今日午前、のはこのインタビューを始めましょう、あなたの面接です!」

第1の側が起動します

インタビュアー:私言うまでもないが言うことは、まず、履歴書を自分自身を紹介し、いくつかは、カザフスタンを言うことはありません。

I:心臓OS:「案の定、私は予想通り、あなたは私が最初に自分自身を紹介させ知っているが、幸い私が見たJavaGuideを、まとめたいくつかのルーチンのルーチンを学んだ:最高の2が自分自身を導入する準備ができている、Aを時間は自分の経験を強調するために、メインスピーカーを言うために、プログラミング言語が引き継ぐ;別のインタビュアーの技術に言った、私たちは、主にオーバースケートうプロジェクト経験、経験の技術的な詳細について話します。そう、私はこのルーチンAかなり汎用テンプレートに従って準備ができている、すべての後、私は怠惰なことよ!もっと全体の共通の利益よりも、自己紹介を用意する必要はありません!

インタビュアー、こんにちは!私はサバイバルソングと呼ばれます。大学の時は、私は主にJava関連の知識を習得するために余分な時間を使用しています。特定のシステムの開発に携わっ学校中には、バックエンドデータベースの設計やシステム開発を担当しています。中に問題を解決するため、barabara。また、私はまた、分散型システムの開発へのアクセスを行うために、このウェブサイトの主な電力供給を書き、電気の供給業者のウェブサイトのシステムを書かれたオンラインチュートリアルを参照して学習プロセスにしています。学習よりも、私は自分の学んだ知識を共有するためにブログを整理することを好みます。私は、コミュニティの認証である今持っている好評のスレッドプールと使用ソースコードの分析に一連の記事を書きました。また、私は地方のプログラミングゲームの二等賞を受賞した、私はGitHubのにこの賞を受賞したオープンソースプロジェクトもそれのスターの2k収穫のだろうか?

インタビュアー:あなただけの参照オンラインチュートリアルは、電気の供給システムを作りましたか?あなたは、電気事業・システムの概略図を描くことができますか?

I:心臓OS:「これは私が倍それの多くを描画アーキテクチャを考えている。このシステムの前に、プロジェクトに注意を払う必要がありますあなたの履歴書に書くために知って打つことができない!!」

分散型の電力供給は、上記のシステムアーキテクチャ図に精通している必要があり行っている(現在はより多くの人気をマイクロサービスアーキテクチャですが、分散開発の経験を持っている場合にも非常に余分なポイントです!)。

インタビュアー:このシステムの簡単な紹介あなたはそれを行うことです!

私:私は厳粛に私にちょうどモールのアーキテクチャ図を描く一口作られたロケットは、最大話し始めました。

システムは、プレゼンテーション層、サービス層と永続化層3層で構成されています。プレゼンテーション層を中心に、この層は単なるショーにあるとして、それはどんなサービスを提供していない、など、そのようなページ、モールのホームページとして、名前が示す表示、バックオフィスシステムの我々のシステムのページを検索するために使用されます。

プレゼンテーション層とサービス層がどのように相互作用するので、プレゼンテーション層とサービス層は、典型的には、異なるマシン上の並行性とスケーラビリティを向上させるためにアップ展開されますか?このシステムでは、ダボサービスのガバナンスに使用します。ダボは、高性能、軽量なオープンソースのJava RPCフレームワークです。このシステムではダボ主要な役割は、リモートRPCコールを提供することです。情報サービスは、ZooKeeperの、ZooKeeperのにダボを通じて関連する情報やサービスへのプレゼンテーション層へのアクセスにダボを登録することによって、このシステムのレイヤ。飼育係の役割は、単にRPCリモート関数呼び出しやダボを実装して、ストレージサーバーのアドレスといくつかの情報サービスでサービスを提供することです。あなたはタイムサービスを参照する必要がある場合は、我々は唯一の設定ファイルに関連する情報を設定する必要がありますローカルコールとちょうど同じように、コード内で直接使用することができます。あなたは、サービスの利用を増加させたとき、我々は唯一のシステム全体のサービスを追加することなく、このサーバーの単一のサービスの増加を使用すると言うなら。

さらに、それは一般的にMySQLを使用した本システムのデータベースを使用して、データベースミドルウェアMyCatを使用します。さらに、このシステムはまた、キャッシュとして反応速度を増加させるためにRedisのメモリ・システムにデータベースを使用します。それは、ハードディスクから読み取られるため、データベース内のデータの一部へのユーザの最初の訪問の場合、このプロセスは、遅くなります。ユーザによってアクセスされるデータの数は、データへのアクセスがキャッシュから直接取得することができるので、次回、キャッシュ内に存在します。キャッシュメモリは、操作の直接の操作なので、スピードはかなり速いです。

このシステムはまた、検索機能を提供するために、Elasticsearchを使用しています。使用Elasticsearch我々は非常に簡単に私たちのモールの前提条件検索機能に追加することができ、および他の有用な機能を提供し、容易に拡張することができ、またElasticsearchを使用しています。

インタビュアー:私も、メッセージキューを使用するシステムの内部であなたを参照してください、あなたはそれを使用する理由について話すことができますか?

私:

メッセージキューを中心に:

1.クリッピングし、必要な応答時間を短縮。

2.低い結合システム(システムのスケーラビリティを向上/デカップリング)。

インタビュアー:あなたは、これは単純すぎると言います!もう少し詳しく説明することができ、それは説明私を描くのがベストです。

I:心臓OS:「両方2019、そしてほとんどが記憶これら二つの利点をもたらすためにシステムのメッセージキューにインタビューすることができました、そして、あなたは遠くの人は少し深く理解して行くにしたくない場合は!」

私たちは、メッセージキューを使用しない場合は、すべてのユーザーの要求は、直接サーバーに分類し、データベースまたはキャッシュで応答します。何のキャッシングやデータベースそんなに圧力を買う余裕はないが存在しない場合は、高並行性のシナリオの下でならば、それは遅い応答速度を引き起こし、さらにはデータベースのダウンタイムが発生します。メッセージキューは、消費者のプロセスのメッセージキューでメッセージキューからデータを取得し、その後、すぐに戻り、データベースへの非同期書き込みが、メッセージが繰り返されないことを保証するためにできた後ただし、メッセージキューを使用した後、データは、ユーザの要求に送信されます消費もメッセージの損失の問題を考慮に入れます。応答速度が大幅に改善されるように、サーバ・データベース内のメッセージ・キュー処理速度、以来。

テキストは、マップそれに直接、あまりにも空であります!下の図は、前とプロセスのユーザー要求にメッセージングシステムを使用した後の比較を示し(PS:!あなたはこの絵を見て良い、トリプル品質へのその後のトラブルを考える場合、私自身は、この図の美しさに描かれているが)。

非同期処理により、システムのパフォーマンスを向上させます

上記の分析を通して、私たちは、と結論付けることができ、メッセージキューは、クリッピング機能の優れた効果を持っている、である- 非同期処理を経ての短期性の高い同時トランザクションメッセージは、このように同時トランザクションのピークを平坦化、メッセージキューに格納されて生成されます。たとえば:電子商取引、プロモーション活動のスパイクのいくつかは、効果的にプロモーションに抵抗することができますメッセージキューの使用の合理化は、システムへの影響の受注の多数の流入を開始しました。下図のように:

クリッピング

メッセージキューはさらに、結合システムを減らすことができます。私たちは、その後、システムのスケーラビリティは間違いなく優れているので、こと、他のモジュールより小さな影響をモジュールにモジュールを追加または変更は、モジュールの間には直接呼び出す場合は存在しないことを知っています。直接地図上に:

デカップリング

製造者(クライアント)が受信者(サーバ)メッセージを処理するメッセージキューにメッセージを送信し、システムはまた、明らかに増加するシステム及び他の結合を持っている必要があり、ことなく消費のメッセージキューにメッセージを直接取るために消費者を必要としますシステムの拡張性。

インタビュアー:あなたはそれがどんな弱点を持っていると思いますか?またはどのようにメッセージキューを考慮していませんか?

I:心臓OS:「これは鶏泥棒の面接ではありませんが、本当に私はよく準備それを夢中、幸いにも私を誘惑!?。」

私はそれは、次のいくつかの側面からかもしれないと思います。

1. システムの可用性削減:ある程度まで減少し、システムの可用性を、なぜあなたは言うのですか?MQに入社する前、あなたはそうで紛失したり、ハングアップとされるMQメッセージの場合を考慮していませんが、MQの導入後、あなたはそれについて考える必要があります!

2. システムの複雑性の増加: MQを追加した後、あなたはメッセージがメッセージの損失の取り扱い、消費を繰り返さないようにする必要があり、秩序あるメッセージングなどを保証します!

3. 一貫性:私はおよそ上記の話をしたが、非同期メッセージキューが実際に速く、システムの応答性をもたらすことができ、非同期メッセージキューを実現することができます。メッセージが本当に正しいの消費者ニュースの消費者ではない場合は、どのように行うには?これは、データの矛盾になります!

インタビュアー:何か問題が発生したプロセスでプロジェクトを行いますか?解決しようか?次いで、この溶液をある場合はどのようにそれを解決するには?

I:心臓OS:!「すべての問題を持っていないようでしたことのプロセスああどのように私は突然、私はすべての後、私はRedisの井戸とかなりよく知っている、プロセスで遭遇Redisの問題を使用すると考えていたことを行う方法、?? 誘致するために、この方向に行くための面接を確認するために、。 "

私は、共通のデータバッファリング処理の質問に貫通Redisのキャッシュを使用して作られました。それから私は、Googleの検索関連のソリューションを通じて解決しました。

インタビュアー:あなたはああキャッシュ貫通を知っていますか?ああも!それは何と言うことはキャッシュされ、最終的なソリューションを貫通しています。

私:私はそれに浸透キャッシュされているものについてお話しましょう!

キャッシュ浸透単純なポイントは、要求キーの多数が直接データベースへのリクエストで、その結果、キャッシュに存在しないことがあり、この層を通るキャッシュが存在しません。たとえば、次のように意図的に重要なハッカーたちは要求データベースの落ちが多数で、その結果、多数の要求を開始したキャッシュに存在しません。

それはこれに沸きます:

1.バッファ層はヒットしません。

2.ストレージ層は当たらない、ない、ライトバックキャッシュ空の結果を実行します。

3.クライアントに空の結果を返します。

150内の接続の一般的なMySQLのデフォルトの最大数は、これができるshow variables like '%max_connections%';コマンドを表示すること。接続の最大数は、物理的状態、CPU、メモリ、ディスク、ネットワークの唯一の指標であるので、並行する能力が制限され、その動作インジケータは、あります!そのため、一般的な3000の同時リクエストは、データベースのほとんどを殺すことができます。

インタビュアー:若い男ああも!「なぜ死に押しつぶさ接続4000データベースの3000同時最大数をサポートすることができますか?」の答えに、事前に自分を想像もお聞きに行きます!はい!

I: DOは自慢ではありません!のない自慢を行います!私は私が最後に今のプログラムを使用だけでなく、知っているソリューションの一部についての話に来て!あなたは、私たちは問題はありません見ることができます。

最も基本的には、すべてのチェックのパラメータ、直接クライアントに戻しスロー正当な要求情報でないパラメータの最初にあります。直接ようにクライアントにエラーメッセージを返し、ない場合、データベースクエリとしてIDは、0以上の受信メールボックスフォーマットにすることはできません。

ケースのパラメータは、我々は、以下のプログラムを通じて、この問題を解決することができ、まだ浸透するキャッシュによって検証されています:

1)キャッシュ無効なキー:キャッシュとデータベースは、Redisのを書くためのいくつかの重要なデータが移動し、次のコマンドを使用して、有効期限を設定して見つけている場合:SET key value EX 10086あなたは、キー変更要求を解決することができます。この方法では、頻繁ではないが、どのように悪質なハッカーの攻撃、異なる要求キーで構成それぞれ、Redisのは、無効なキャッシュキーの多数につながります。明らかに、このアプローチは、根本的にこの問題を解決していません。私は浸透の問題を解決するには、この方法を使用する必要がある場合は、そのような1分として、無効なキーセットの短い有効期限ポイントを試してみてください。

また、ここでは通常の状況下で、我々は、このような重要な設計をしている、口を避けます:表名:列名:主键名:主键值

2)ブルームフィルタ:ブルームフィルタは、我々は簡単にデータの塊で与えられたデータに存在するかどうかを決定できるような幻想的なデータ構造です。私たちは、ブルームフィルタは、我々は「人々は」を探していることを望むものである何の感情がない、キーが正当であるかどうかを判断する必要があります。

インタビュアー:悪くありません!あなたは、ブルームフィルタああを知っていますか!私に話をしに来ます。

I:心臓OS:「あなたは大規模なデータ処理の上に顔の質問への準備ができている場合は、あなたがでなければなりません:」?デジタル濃縮物を大量に含まれている数がいるかどうかを決定するためにどのように(!デジタルセットが大きい場合には、500以上の万人)、「質問が非常ました理解!この質問を解決することはブルームフィルタを使用する必要があります。」

ブルームフィルタは、いつデエンファシス大量データのために有用であるか、またはデータの正当性を検証します。自然ブルームフィルタは、実際には全てのメモリRubuロングフィルタデータは一つだけであることを意味する「ビット(ビット)配列」です。私たちは通常、一般的に使用されるリスト、地図、設定および他のデータ構造に比べて、それはより少ないスペースを占有し、より効率的ですが、欠点は、その戻りの結果は確率論と非常に正確ではないです。

場合ブルームフィルタエレメントが添加された場合、次のように進行します。

1.ブルームフィルタエレメントハッシュ関数値は、ハッシュ値(ハッシュ関数は、いくつかのハッシュ値の数を与えるために)、計算されました。

目標値1に対応するビットアレイで得られたハッシュ値。

私たちはブルームフィルタ時に要素があるかどうかを判断する必要がある場合は、次のように、我々は続行されます:

1.同一の要素には、再計算されたハッシュを与えられています。

フィルタ要素がブルームしていないことを示す、1以外の値がある場合2.結果の値の値が1である場合、各要素1に設定されたビットの数が、あるかどうかを決定した後、その値は、ブルームフィルタに記載しました容器。

ここでは簡単な例です:

ブルームフィルタハッシュ計算

図示のように、文字列が1に設定さブルームフィルタ、異なるハッシュ関数の複数によって生成された第1のハッシュ値の列、およびビットのグループテーブル番号に対応する要素に追加する記憶されています(ビット配列が初期化されるとき、すべての位置はゼロです)。前の対応する位置と同じメモリの第二列は、1に設定されている場合、それはこの値が既に存在を知ることは容易である(重量に便利です)。

我々はブルームフィルタの文字列かどうかを決定する必要がある場合、唯一の文字列が再び各要素1で得られた値の後に設定されるビットの数が値場合、であるかどうかを決定する、同じハッシュ計算を与えられました要素がブルームフィルタに存在しないことを示す、1以外の値が存在する場合、両方の1は、その値が、ブルームフィルタに記載されています。

それは我々が適切に設定されたビットの数を増やすか、当社のハッシュ関数のサイズを調整することができ、その場合には位置アウト同じ異なる文字列のハッシュであってもよいです。

要約すると、我々は結論することができます:ブルームフィルタ要素が存在し、正義の流産の小さな確率は述べています。ブルームフィルタは、この要素は、特定の要素ではないと言うことではありません。

インタビュアー:あなたがブルームフィルタはかなり良いことを知っているようです!そして、あなたはすぐに最終的にキャッシュの浸透を解決するためにそれを使用する方法を教えてくれ。

I:それは非常に簡単に行うことです後ブルームフィルタの原理を知っています。私は何をするRedisのブルームフィルタを使用します。私は、ユーザの要求が上、私が最初のユーザによって送信されたリクエストの値がブルームフィルタに存在するかを決定するときに要求された値が存在することができるすべては、ブルームフィルタに格納されている置きます。存在しない場合、返されたが、クライアントに直接パラメータエラー情報を要求し、それだけで次の手順を取る存在します。それは(これは直接見つけるためにインターネットを節約するために、私が描く絵ではありません)以下、この絵に沸きます:

このブルームフィルタについての詳細は、私は、元のを見ることができます:「ブルームフィルタを理解していませんか?全体の記事あなたがはっきり!強くお勧めします、個人的に私はインターネットがとても明確に白い記事の要約を見つけるべきではない気がします。

インタビュアー:まあ、まあ。プロジェクトでは、ここで求められています!ここで私は単にあなたを求める、より基本的な質問をいくつか紹介します。ハートOS:、高い同時実行の完全なこの男の作者を行いも、最も基本的なものは右ではありません!

私:良い良いです!問題ありません!

インタビュアー:ブラウザ、何が起こったかのURLを入力してください?

I:心臓OS:「それは、Baiduはこの質問をするように、ほとんどのようで、追加の小さな図書の良いノートを取ることが推奨され、頻繁に聞かれる質問だ方が良いBaiduの面接に行きましたが、ああ、同様の問題この質問の宿題事前に準備:!!オープンWebページには、全体のプロセスが使用するものでしょう?。」

イラスト(出典: "グラフィックHTTP"):

全体的に、次のプロセスに分かれて:

1. DNS解決

2. TCPコネクション

3. HTTPリクエスト

4.サーバーが要求を処理して返すHTTPパケット

ページのレンダリングブラウザのパース

6.接続終了

具体的には、次の資料を参照してください。

- segmentfault.com/a/119000000...

インタビュアー: TCPとUDPの違いは?

私:

TCP、UDPプロトコルの違い

UDPは、UDPパケットを受信した後、リモートホストにデータを送信する前に、接続を確立する必要はありません、任意の確認を与える必要がありません。UDPは信頼性の高い配信を提供していませんが、いくつかのケースでは、UDPは確かのような(一般的にインスタントメッセージングに使用)作業の最も効果的な方法の一つですが:などQQの声、QQのビデオ、放送、

TCPは、コネクション型のサービスを提供しています。あなたは、データ転送接続の終了後に解放されるように、データを送信する前に、接続を確立する必要があります。TCPは、ブロードキャストやマルチキャストサービスを提供していません。TCPは、データを渡す前に、信頼性の高いTCPはTCPに反映(信頼性の高い接続指向の輸送サービスを提供しているので、そこに接続を確立するために、3ウェイハンドシェイクもしますが、データ転送、確認、窓、再送信、輻輳制御機構の時には、データ転送後、)節約のシステムリソースに切断されます、これは、このような確認応答、フロー制御、接続管理タイマーなど、回避するためのオーバーヘッドが難しいの多くを追加します。これは、ヘッダプロトコルデータユニットは、多く増加させるだけでなく、プロセッサリソースの多くを取るだけでなく。TCPは、一般的なファイル転送のために使用され、送信したメール、telnetや他のシーンを受けます。

インタビュアー:伝送の信頼性を確保するためにどのようにTCP?

私:

1.アプリケーションデータは、最も適切なTCP送信とみなさデータブロックに分割されています。

各番号のパケット受信機に送信2. TCPパケットは、アプリケーション層に順序付けられたデータをソートします。

3. チェックサム: TCPテストし、それがヘッダとデータを維持します。この試験は終了し、データ伝送プロセスの任意の変化を検出する目的です。あなたは、テストのセクションやエラーを受け取った場合、TCPは、このセグメントを破棄し、このセグメントの受信を確認しないでください。

受信側4. TCPは、重複データを破棄します。

前記フロー制御:各パーティのTCP接続は、バッファ空間の固定サイズを有する、受信TCPは、受信側の送信端は、データバッファを受信することができる可能にします。場合は、受信データの送信者を処理する機会は、送信者は、パケットの損失を防ぐために、伝送の速度を低下させる促すことができます。フロー制御プロトコルTCPは、スライディングウィンドウの変数のサイズを使用しています。(TCPは、スライディングウィンドウフロー制御を使用して実装しました)

前記輻輳制御:ネットワークが混雑している場合に、送信データを減少させます。

7. ARQプロトコル:また、信頼性の高い伝送を実現するために、その基本的な原理は、それぞれの完成が確認応答を停止し、待機にパケットを送信することです。そして、パケットで発行された確認を受けます。

8. 再送: TCPセグメントが送信された場合、それはセグメントの受信を確認するために先を待つタイマを起動します。あなたが確認を受信できない場合は、このセグメントを再送します。

インタビュアー:私は今あなたにいくつかの基本的なJavaの問題を尋ねに来て!若い男。

私:すべての権利。(ハートOS: "あなたが来ますが!")

インタビュアー:今、あなたはバイトのストリームを持っていることを、なぜ文字ストリームを持っていますか?

I:心臓OS:「聞いて本質的な問題:それは読み取りと書き込みのファイルやネットワークの送信および受信するかどうかを、情報記憶の最小単位はバイトで、I / O操作は、それを動作させるためにバイトストリームと文字ストリーム操作に流入する理由? "

Java仮想マシンのバイトによる文字列が変換され、この過程でまだ嘘の問題は、私たちがコーディングの種類は文字化けに非常に傾向があるかわからない場合は、非常に時間がかかり、そして。だから、I / Oストリーム単に我々が通常動作の文字の流れを促進し、文字の上に動作するように直接的なインタフェースを提供します。バイトストリームとオーディオファイル、画像、その他のメディアファイルが優れている場合、それは文字になる場合は、その後、より良い文字のストリームを使用しています。

インタビュアー:それはどのような違いを生むんので、深い浅いコピーコピー?

私:

1. 浅いコピー:コピーとして渡された参照データ型を参照して、値によって渡さ基本データ・タイプは、これは浅いコピーです。

2. ディープコピー:値によって渡された基本データ型、データ型への参照は、新しいオブジェクトを作成するには、コピーその内容は、これはディープコピーです。

深いと浅いコピー

インタビュアー:グッド!インタビューの終わり。若い男のことができます!ゴーホームと予告それ!

私:良い良いです!あなたは、ハードアップを働きました!

推奨されるオープンソースプロジェクト

他のオープンソースプロジェクトの推薦:

  1. JavaGuide:Javaの学習[+]面接ガイドは、Javaプログラマの大半はコアな知識を習得する必要がカバーしています。
  2. ガイド-springboot:春ブートチュートリアル(一緒に暇な時間の保守、メンテナンス歓迎)初心者に適しただけでなく、経験豊富な開発者のアクセス。
  3. 進歩-プログラマー:私は技術スタッフが、いくつかの良い習慣を持つべきだと思います!
  4. -security-JWTスプリングガイド:ゼロから始めましょう!(検証機関を含む)春のセキュリティが強化されたJWTコードの後端部。

いいえ公共ありません

私の公共の番号

おすすめ

転載: juejin.im/post/5def6af96fb9a016253c02f5