Sanmen Meituanはついにオファーを受け取り、インタビューの質問を共有しました:Spring + Dubbo + Redis + microservices ...

序文:

一流メーカーは、プログラマーを含むインターネット関係者の夢の企業であり、BATメーカーの参入障壁が高く、ドアを見てため息をつくだけなので、ノックする機会しかありません。彼らのスキルを練習することによってBATのドアに。以下は、Sanmenmei Groupからのオファーを獲得したJavaプログラマーの個人的な経験であり、参照と学習のために実際の面接の質問を提示します。

image.png

パート1。春のトピック

1.Springはクラスのスコープをどのように定義しますか

これは、Bean定義のscope属性によって定義されます。

2.SpringでサポートされているいくつかのBeanのスコープ

次の5種類のBeanのスコープがサポートされています。

  • シングルトン:Beanには、各Springiocコンテナに1つのインスタンスしかありません。(デフォルトデフォルト)
  • プロトタイプ:Bean定義には複数のインスタンスを含めることができます。
  • リクエスト:各httpリクエストはBeanを作成し、スコープはWebベースのSpringApplicationContextのコンテキストでのみ有効です。
  • セッション:HTTPセッションでは、Bean定義はインスタンスに対応します。このスコープは、WebベースのSpringApplicationContextのコンテキストでのみ有効です。
  • global-session:グローバルHTTPセッションでは、Bean定義はインスタンスに対応します。このスコープは、WebベースのSpringApplicationContextのコンテキストでのみ有効です。

3.Springでサポートされているトランザクション管理の種類

  • プログラムによるトランザクション管理:これは、トランザクションをプログラムで管理することを意味します。これにより、柔軟性は大幅に向上しますが、維持するのは困難です。
  • 宣言型トランザクション管理:これは、ビジネスコードとトランザクション管理を分離でき、トランザクションを管理するために注釈とXML構成を使用するだけでよいことを意味します。

4.制御の反転(IOC)とは何ですか?依存性注入とは何ですか?

  • 制御の反転(IOC):従来のアプリケーションは、オブジェクト内で自分自身によってアクティブに制御され、依存オブジェクトを直接取得します。コンテナは、依存オブジェクトの検索と挿入に役立ちます。オブジェクトは、依存オブジェクトのみを受動的に受け入れるため、制御の反転です。
  • 依存性の注入:コンポーネント間の依存性は、実行時にコンテナーによって決定されます。より鮮明に言うと、コンテナーは特定の依存性をコンポーネントに動的に注入します。依存性注入メカニズムにより、コードを使用せずに単純な構成でターゲットに必要なリソースを指定するだけで、特定のリソースがどこから誰によって提供されるかを気にすることなく、独自のビジネスロジックを完成させることができます。
  • 実装方法:コンストラクター注入、セッターメソッド注入、およびインターフェース注入。アノテーションアセンブリはデフォルトでは有効になっていません。アノテーションアセンブリを使用するには、Spring構成ファイルでcontext:annotation-config /要素を構成する必要があります。

5. Springはいくつのコアコンポーネントで構成されていますか?

  • Beanコンポーネント
  • コンテキストコンポーネント
  • コアコンポーネント

6. Spring MVCのコアワークフローは?

  • ユーザーはサーバーに要求要求を送信し、要求はSpringMVC中央コントローラーDispatcherServletによってキャプチャされます。
  • DispatcherServletは、要求URLを解析して、要求されたリソースID(URI)を取得します。次に、URIに従って、HandlerMappingマッピングプロセッサを呼び出して、指定されたコントローラにリクエストを送信します。
  • コントローラは実行後、返されたデータ情報をModelAndViewオブジェクトにカプセル化し、最後に適切なビューレンダリングビューを選択して、ViewResolverビューリゾルバを介してインターフェイスに戻ります。

7. Springトランザクション分離レベル(5つのインタビューすべてを言うのが最善です)

  • DEFAULTこれは、データベースのデフォルトのトランザクション分離レベルを使用した、PlatfromTransactionManagerのデフォルトの分離レベルです。
  • コミットされていない読み取り:ダーティ読み取り、繰り返し不可能な読み取り、および仮想読み取りが発生する可能性があります。トランザクション分離レベルが最も低く、別のトランザクションがこのトランザクションのコミットされていないデータを確認できるようにします。
  • コミットされた読み取り:ダーティ読み取りを回避します。ただし、繰り返し不可能な読み取りと仮想読み取りが発生する可能性があります。トランザクションは、送信後に別のトランザクションでのみ読み取ることができるようにしてください。別のトランザクションは、トランザクションのコミットされていないデータを読み取ることができません。Oracleのデフォルト
  • 繰り返し可能な読み取り:このトランザクション分離レベルは、ダーティな読み取りと繰り返し不可能な読み取りを防ぐことができます。ただし、ファントム読み取りが発生する場合があります。あるトランザクションを別のトランザクションで読み取れないようにするだけでなく、次の状況(繰り返し不可能な読み取り)も回避します。Mysqlのデフォルト
  • シリアル化可能:これは最も高価で非効率的ですが、最も信頼性の高いトランザクション分離レベルです。トランザクションは順次実行として処理されます。ダーティリードと繰り返し不可能なリードを防ぐことに加えて、ファントムリードも回避されます(3つのタイプを避けてください)。

8.春のトランザクション機能(4つのインタビューすべてを言うのが最善です)

  • アトミシティ(アトミック性):トランザクション内のデータベースに対するすべての操作は、すべてまたはまったくない、分割できない一連の操作です。
  • 一貫性:トランザクションの実行前後のデータの整合性は一貫性を保ちます。
  • 分離(分離):トランザクションの実行中に、他のトランザクションによって干渉されてはなりません
  • 耐久性:モノが送信されると、データベースへの変更は永続的です

9. Springトランザクションの7つの伝播特性(7つのインタビューで1つまたは2つと言われています)

  • Propagation.REQUIRED(デフォルト)インタビューはこれを言わなければなりません。呼び出し元はすでにトランザクションを持っています。同じトランザクションに参加して実行します。それ以外の場合は、トランザクションを自動的に開始します。
  • Propagation.REQUIRES_NEW。私が新しいビジネスを始めるときはいつでも
  • Propagation.SUPPORTS。呼び出し元にトランザクションがある場合は、同じトランザクションに参加して実行されます。トランザクションがない場合は、非トランザクション方式で実行されます。
  • Propagation.NOT_SUPPORTED。呼び出し元にトランザクションがある場合、呼び出し先が実行を終了するまでトランザクションは一時停止され、トランザクションが再開されます。
  • Propagation.MANDATORY。呼び出し元にトランザクションがある場合は、同じトランザクションに参加して実行されます。存在しない場合は、例外がスローされます。
  • Propagation.NEVER。呼び出し元にトランザクションがある場合、例外がスローされます
  • Propagation.NESTED。呼び出し元にトランザクションがある場合は、ネストされたトランザクションを実行します。呼び出し元にトランザクションがない場合は、Propagation.REQUIREDの方法で実行します。つまり、新しいトランザクションを開始します。

10. SpringBeanのライフサイクルを簡単に説明します

インスタンス化、初期化、使用、および破棄。

キーワード:BeanFactoryPostProcessor、BeanPostProcessor、init-method / destroy-method

[画像のアップロードに失敗しました...(image-b401f-1611732924344)]

パート2.ダボインタビュートピック

1. Dubboのフォールトトレランスメカニズムは何ですか?

ダボの公式ウェブサイトは、合計6つのフォールトトレランス戦略を提案しています

  • フェールオーバークラスターモード:障害時の自動切り替え。障害が発生した場合は、他のサーバーを再試行します。(デフォルト)
  • フェイルファストクラスター:フェイルファスト、呼び出しを開始するだけで、失敗した場合はすぐにエラーを報告します。通常、レコードの追加など、べき等ではない書き込み操作に使用されます。
  • フェイルセーフクラスター:フェイルセーフ。例外が発生した場合は、無視してください。通常、監査ログへの書き込みなどの操作に使用されます。
  • フェイルバッククラスター:失敗した自動回復、失敗した要求のバックグラウンド記録、および定期的な再送信。通常、メッセージ通知操作に使用されます。
  • フォーククラスター:複数のサーバーを並行して呼び出し、1つが成功する限り戻ります。これは通常、リアルタイム要件の高い読み取り操作に使用されますが、より多くのサービスリソースを浪費する必要があります。緯線の最大数は、forks =” 2”で設定できます。
  • Broadcast Cluster:Broadcastはすべてのプロバイダーを呼び出し、それらを1つずつ呼び出し、いずれかがエラーを報告した場合はエラーを報告します。(2.1.0からサポート)通常、キャッシュやログなどのローカルリソース情報を更新するようにすべてのプロバイダーに通知するために使用されます。

概要:実際のアプリケーションでは、クエリステートメントのフォールトトレランス戦略にデフォルトのフェールオーバークラスターを使用することをお勧めします。追加、削除、変更には、フェールオーバークラスターを使用するか、フェールオーバークラスターを使用することをお勧めします(retries = "0")重複データの追加やその他の問題を防ぐための戦略。インターフェイスを設計するときにクエリを提供するために、クエリインターフェイスメソッドを個別のインターフェイスとして使用することをお勧めします。

2.ダボを使用するときにどのような問題が発生しましたか?

サービスバージョン番号とコンシューマーサービスバージョン番号を増やします

具体的には、これは問題ではありませんが、問題の解決策です。実際の作業では、さまざまな環境資源の不足に直面します。これも非常に現実的な問題です。最初は、関連するサービスも提供できます。開発とテストですが、複数の環境、複数のバージョン、複数のタスクがある場合、それは私たちのニーズを満たしていません。現時点では、プロバイダーにバージョンを追加することで差別化できます。これにより、同時に多くの物理リソースが残ります。将来、インターフェイス定義がオンラインでリリースされる場合、バージョン番号を使用して、停止せずにリリースできます。参照では、対応するバージョンのサービスのみが検索されます。次に例を示します。

<pre style="box-sizing: border-box; font-family: inherit; font-size: 16px; margin: 1em 0px; padding: 12px 10px; white-space: pre-wrap; border: 1px solid rgb(232, 232, 232); position: relative; line-height: 1.5; color: rgb(153, 153, 153); background: rgb(244, 245, 246); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"><dubbo:serviceinterface="com.xxx.XxxService" ref="xxxService" version="1.0"/>
<dubbo:referenceid="xxxService" interface="com.xxx.XxxService" version="1.0"/>

3.ダボ参照注釈の問題?

@Referenceは、SpringBeanインスタンスに対応する現在のクラスでのみ使用でき、当面は親クラスで使用できません。親クラスで参照を宣言する必要がある場合は、dubbo:referenceを使用して構成できます。構成ファイルを作成し、参照する必要がある場所でSpringBeanと同じ参照を使用します。それだけです。

4. RpcException:リモートサービスに使用できるプロバイダーが異常な場合はどうすればよいですか?

  • 接続されているレジストリが正しいかどうかを確認します
  • 登録センターにアクセスして、対応するサービスプロバイダーが存在するかどうかを確認します
  • サービスプロバイダーが正常に動作しているかどうかを確認します

5.サービスプロバイダーは登録していませんが、登録センターに表示されませんか?

まず、サービスプロバイダーが正しいレジストリに接続されているかどうかを確認します。構成内のレジストリアドレスを確認するだけでなく、実際のネットワーク接続も確認します。

次に、サービスプロバイダーがストレステストなどで非常にビジー状態になっているかどうかを確認し、レジストリにハートビートを送信するCPUフラグメントがないようにします。この場合、圧力が低下し、圧力が自動的に回復します。

6.ダボの接続方法は何ですか?

Dubboのクライアントとサーバーには、ブロードキャスト、直接接続、およびzookeeper登録センターの使用という3つの接続方法があります。

7.ダボ放送

この方法は、ダボの公式エントリープログラムで使用されている接続方法ですが、多くの問題があります。企業開発では、放送は使用されません。taotao-managerサーバー構成:

<pre style="box-sizing: border-box; font-family: inherit; font-size: 16px; margin: 1em 0px; padding: 12px 10px; white-space: pre-wrap; border: 1px solid rgb(232, 232, 232); position: relative; line-height: 1.5; color: rgb(153, 153, 153); background: rgb(244, 245, 246); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">!-- applicationContext-service.xml 文件中 -->
<!-- 提供方应用信息,用于计算机依赖关系 -->
<dubbo:application name="taotao-manager-service” />
<!-- 使用 multicast 广播暴露服务地址 -->
<dubbo:registry address="multicast://224.5.6.7:1234" />
<!-- 使用 dubbo 协议在 20880 协议暴露服务 -->
<dubboprotocol name="dubbo" port="20880" />
<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="com.taotao.manager.service.TestService" ref="testServiceImpl" />
</pre>

image.png

パート3.Redisトピック

1. Redisとは何ですか?

回答:Remote Dictionary Server(Redis)は、ANSI C言語で記述されたオープンソースのログベースのキー値データベースであり、メモリベースまたは永続的なネットワークをサポートし、複数の言語でAPIを提供します。

値は文字列(文字列)、ハッシュ(マップ)、リスト(リスト)、セット(セット)、ソートされたセット(ソートされたセット)などのタイプである可能性があるため、通常はデータ構造サーバーと呼ばれます。

2. Redisの特徴は何ですか?

  • 文字列(文字列)、リスト(二重リンクリスト)、dict(ハッシュテーブル)、セット(コレクション)、zset(ソートされたセット)、ハイパーログログ(カーディナリティ推定)などのさまざまなデータ構造をサポートします
  • 永続化操作をサポートし、ディスクへのAOFおよびRDBデータの永続化を実行して、データのバックアップやデータの回復などの操作を実行できます。これは、データの損失を防ぐためのより良い手段です。
  • レプリケーションによるデータレプリケーションをサポートします。マスタースレーブメカニズムにより、データをリアルタイムで同期的にレプリケートでき、マルチレベルレプリケーションとインクリメンタルレプリケーションがサポートされます。マスタースレーブメカニズムは、RedisがHAを実行するための重要な手段です。
  • 単一プロセスの要求。すべてのコマンドはシリアルに実行され、同時発生の状況でデータの整合性の問題を考慮する必要はありません。

3. Redisデータ型とは何ですか?

回答:

  • ストリング
  • ハッシュ(ハッシュテーブル)
  • リスト(リンクリスト)
  • セットする
  • SortedSet(順序集合zset)

4. Redisの構成と永続化スキームは何ですか?

回答:次の2つ

  • RDBの方法
  • AOF法

パート4。Zookeeperトピック

1.Zookeeperのフレームワークは何ですか

分散型およびオープンソースの分散型アプリケーション調整サービスは、もともとHadoopとHBaseの重要なコンポーネントでした。

アプリケーションシナリオ:Zookeeperは非常に強力で、多くのアプリケーションシナリオがあります。実際の作業でDubboフレームワークを使用することと組み合わせると、Zookeeperは主にレジストリとして使用されます。

Dubboフレームワークに基づいて開発されたプロバイダーとコンシューマーは、独自のURLをZookeeperに登録します。コンシューマーは、プロバイダーの登録URLを取得してサブスクライブできるため、後続のプログラムの実行時に呼び出すことができます。プロバイダーが変更されると、Zookeeperを介してサブスクライブされたコンシューマーにも通知が送信されます。

2.Zookeeperにはどのようなノードタイプがありますか

  • 永続性:作成後は常に存在します。削除操作がない限り、ノードを作成したクライアントセッションの障害はノードに影響しません。
  • 永続性の順序:永続性と同じです。つまり、親ノードが次のレベルの子ノードを作成するときに、各子ノードが作成された順序を記録し、各子ノードの名前に数値の接尾辞を追加します。
  • 一時的:クライアントセッションの作成が失敗し(セッションが失敗し、接続が切断されないことに注意してください)、ノードが失われます。子ノードを作成できません。
  • 一時的なシーケンス:説明する必要はありません。

3.ノードへのZookeeperの監視監視通知は永続的ですか?

そうではありません。

公式声明:Watchイベントは1回限りのトリガーです。Watchを含むデータセットが変更されると、サーバーはその変更をWatchを含むクライアントセットに送信して通知します。

永続的ではないのはなぜですか?たとえば、サーバーが頻繁に変更され、リスニングクライアントが頻繁に変更される場合、すべてのクライアントに変更ごとに通知する必要があり、パフォーマンスが過度に消費されます。

通常、クライアントはgetData( "/ node A"、true)を実行します。ノードAが変更または削除された場合、クライアントは監視イベントを取得しますが、ノードAが再度変更された後、クライアントはそれを設定していません。イベントはクライアントに送信されなくなりました。

実際のアプリケーションでは、多くの場合、クライアントはサーバーのすべての変更を知る必要はなく、最新のデータのみが必要です。

4. Zookeeperクラスターに3台のマシンがある場合でも、1つのクラスターは機能しますか?2つ掛けてみませんか?

1つの原則を覚えておいてください:生きている半分以上を使用することができます。

クラスターは動的にマシンを追加することをサポートしていますか?

実際、これは水平方向の拡張であり、Zookeeperはこの点ではあまり良くありません。ふたつのやり方:

  • すべて再起動:すべてのZookeeperサービスをオフにし、構成を変更してから開始します。前のクライアントセッションには影響しません。
  • 名前が示すように、1つずつ再起動します。これがより一般的な方法です。

パート5。マイクロサービスに関するトピック

1.マイクロサービストラッキングを使用する理由 それはどのような問題を解決しますか?

1.マイクロサービス呼び出しのステータスはどうなっていますか?

  • マイクロサービスの現状:ビジネスの発展に伴い、モノリシックアーキテクチャはマイクロサービスアーキテクチャになり、システムの規模はますます大きくなり、マイクロサービス間の呼び出し関係はますます複雑になっています。
  • マルチサービスの共同作業:マイクロサービスアプリケーションでは、クライアントによって開始されたリクエストは、バックエンドシステムで複数の異なるマイクロサービス呼び出しを通過して、最終的なリクエスト結果を共同で生成します。
  • 複雑なコールチェーンはエラーが発生しやすい:複雑なマイクロサービスアーキテクチャシステムでは、ほとんどすべてのフロントエンドリクエストが複雑な分散サービスコールリンクを形成し、各リンクの依存サービスには遅延タイムアウトまたはエラーが発生します。最終的な障害が発生する可能性があります。リクエスト全体の

2.マイクロサービストラッキングどのような問題を解決しますか?

マイクロサービストラッキングは、実際には分散システム全体でユーザーリクエストのプロセス(データ収集、データ送信、データストレージ、データ分析、データ視覚化を含む)を追跡できるツールです。これらのトラッキングデータをキャプチャすることで、マイクロサービスを構築できます。マイクロサービスをデバッグおよび監視するための重要なツールである、コールチェーン全体のビュー。

Spring CloudS1euthには4つの特徴があります。

  • リンク追跡の提供:調査を通じて、リクエストがどのサービスを通過したかが明確になります。サービス間の通話関係を整理すると非常に便利です。
  • パフォーマンス分析:調査を通じて、各サンプリング要求にかかる時間を簡単に確認し、どのサービス呼び出しに時間がかかるかを分析できます。リクエストの量が増えるとサービスの呼び出しにかかる時間が増えると、サービスの拡張について固定のリマインダーを提供することもできます。
  • データ分析とリンクの最適化:サービスを頻繁に呼び出すか、並行して呼び出すために、ビジネスに対していくつかの最適化対策を講じることができます。
  • 視覚化エラー:プログラムによってキャッチされない例外は、zipkinインターフェースで確認できます。

最後に書かれた:

スペースの制限により、インタビューの質問の一部のみが記事に表示されます。著者は完全なインタビューの質問をPDFファイルにまとめており、それを必要とする友人はそれを転送するのを手伝うことができます。

次に、ここをクリックして完全なインタビュー文書を無料で受け取ります

以下は、いくつかの面接の質問のスクリーンショットです

Sanmen Meituanはついにオファーを受け取り、インタビューの質問を共有しました:Spring + Dubbo + Redis + microservices ...

おすすめ

転載: blog.csdn.net/weixin_47066028/article/details/113250316