Uberインフラエンジニア面接体験記:ミドルウェア・コンテナ化・サービスガバナンスの完全評価

面接体験記著者: BeautyResume チーム

インフラ経験4年でUberのインフラエンジニアに面接。1次:Java並行処理+ミドルウェア原理、2次:K8s+サービスガバナンス、3次:システム設計+プロジェクト深掘り。実際の問題と準備のアドバイス付き。

背景紹介

まず私の状況から:インフラ4年の経験、以前は中規模インターネット企業でインフラ、主にミドルウェアとコンテナ化プラットフォームを担当していました。正直なところ、LINEのインフラ面接を受ける前は自信がありました——インフラの面接は深く聞かれますが、考察範囲は比較的固定されており、ミドルウェアの原理、コンテナ化、サービスガバナンスの3つの山を越えればいいからです。しかし実際に受けてみると、LINEのインフラ面接は予想よりはるかに深く、特にミドルウェアの原理についての考察は「使ったことがある」レベルではなく、基礎実装を説明できることが求められました。

応募したのはLINEのインフラエンジニアポジションで、勤務地は東京。紹介経由で応募し、書類選考から1次面接まで約4日かかりました。全体のプロセスは1次+2次+3次面接+HR面接で、前後約3週間でした。以下、詳しく振り返ります。

面接プロセスの振り返り

1次面接:Java並行処理+ミドルウェア原理

1次面接の面接官は落ち着いた雰囲気の男性で、自己紹介の後、すぐに技術的な質問に入りました。「1次面接は主に基礎を確認します、特にJava並行処理とミドルウェア原理です」。

最初の質問はJava並行処理に直行:「synchronizedとReentrantLockの違いは?それぞれの使用シーンは?」これは準備していました。synchronizedはJVMレベルのロックで、ReentrantLockはAPIレベルのロックだと説明しました。synchronizedは手動解放が不要で、ReentrantLockは手動でunlockが必要;ReentrantLockはフェアロック、割り込み可能ロック、複数条件変数をサポートし、synchronizedはサポートしない。面接官は「synchronizedのロックエスカレーションプロセスについて理解していますか?」と掘り下げました。理解している——ロックなし→バイアスロック→軽量ロック→重量ロックと答えました。彼はバイアスロックについて詳しく説明するように言い、競合がない場合、ロックを最初に取得したスレッドにバイアスし、CASでオブジェクトヘッダのMark Wordを変更して実装すると説明しました。他のスレッドが競合すると、バイアスロックは取り消され、軽量ロックにアップグレードされます。

次にミドルウェア原理のメインイベント。「Kafkaはなぜ速いのか?ゼロコピーはどう実装されているか?」Kafkaが速い理由はいくつかあると説明しました:順次ディスク書き込み、ゼロコピー、バッチ送信、ページキャッシュ。ゼロコピーはsendfileシステムコールで実装される——ディスクからカーネルバッファに読み込まれたデータが、ユーザー空間を経由せずにDMAで直接ネットワークカードに転送される。面接官は「sendfileとmmapの違いは?」と掘り下げました。sendfileはカーネル空間で直接転送し、mmapはファイルをユーザー空間にマップし、1回のコピーを減らすがユーザー空間のオーバーヘッドがまだあると答えました。彼はさらに「Kafkaのパーティションとコンシューマーグループの関係は?」と聞き、1つのパーティションはコンシューマーグループ内の1つのコンシューマーのみが消費でき、1つのコンシューマーは複数のパーティションを消費できると答えました。

Redisも必須。「Redisの永続化ソリューションには何がありますか?それぞれの長所と短所は?」RDBはスナップショット永続化で、ファイルサイズが小さく復元が速いが、2つのスナップショット間のデータを失う可能性がある;AOFは追記ログ永続化で、データ安全性が高いが、ファイルが大きく復元が遅いと答えました。面接官は「AOFの書き換えメカニズムについて理解していますか?」と掘り下げました。AOF書き換えは子プロセスをforkし、Redisメモリ内のデータを走査して新しいAOFファイルを生成する。書き換え中の新規コマンドは旧AOFと書き換えバッファの両方に書き込まれ、書き換え完了後に新しいAOFで古いものを置き換えると答えました。彼はさらに「Redisのクラスタソリューションについて理解していますか?」と聞き、Redis Clusterはハッシュスロットシャーディングを使用し、16384のスロットを異なるノードに分散し、クライアントはCRC16(key) % 16384でスロットを計算すると答えました。

1次面接ではJava並行処理の質問もありました:「スレッドプールのコアパラメータは何ですか?拒否ポリシーには何がありますか?」コアパラメータにはcorePoolSize、maximumPoolSize、keepAliveTime、workQueue、threadFactory、rejectedExecutionHandlerが含まれると答えました。拒否ポリシーにはAbortPolicy(例外スロー)、CallerRunsPolicy(呼び出し元実行)、DiscardPolicy(破棄)、DiscardOldestPolicy(最古タスク破棄)がある。面接官は「コアスレッド数が満杯、キューも満杯、最大スレッド数も満杯の場合、どうなりますか?」と掘り下げました。拒否ポリシーが実行されると答えました。彼は「本番環境ではどの拒否ポリシーを使っていますか?」と聞き、CallerRunsPolicyを使っていると答えました。タスクを破棄せず、呼び出し元スレッドに実行させることで、流量制限の役割を果たすからです。

1次面接は約1時間で、面接官は「基礎はしっかりしています、2次面接の通知をお待ちください」と言いました。

2次面接:K8s+サービスガバナンス

2次面接の面接官はシニアのテクニカルエキスパートで、いきなりプロジェクトの質問から始まりました。「レジュメにコンテナ化とサービスガバナンスとありますが、詳しく話してください」。

まずコンテナ化の実践について説明しました。「仮想マシンからコンテナにどう移行しましたか?どんな問題に遭遇しましたか?」3つのステップで進めたと答えました:まずステートレスサービスのコンテナ化、次にステートフルサービスのコンテナ化、最後にデータベースのコンテナ化。最大の問題はネットワーク——コンテナネットワークと仮想マシンネットワークが通信できず、Calicoをネットワークプラグインとして使い、BGPモードでノード間通信を実現した。面接官は「CalicoのBGPモードとIPIPモードの違いは何ですか?」と掘り下げました。BGPモードは直接ルーティングでパフォーマンスが良いがネットワークのBGPサポートが必要;IPIPモードはトンネルカプセル化で互換性が良いが追加のオーバーヘッドがあると答えました。彼はさらに「コンテナネットワークのネットワークポリシーはどう処理していますか?」と聞き、NetworkPolicyでPod間のアクセスを制限していると答えました。

K8sのスケジューリングは重点的な考察内容でした。「K8sのスケジューラはどう動作しますか?スケジューリングポリシーには何がありますか?」K8sスケジューラは事前選択と優先選択の2つのフェーズで動作する——事前選択で条件を満たさないノードをフィルタリングし、優先選択で残りのノードにスコアを付けて最適なものを選択すると答えました。スケジューリングポリシーにはノードアフィニティ、Podアフィニティ/アンチアフィニティ、テイントとトレランス、リソース制限などがある。面接官は「あるノードのリソースが不足しているが、Podをそのノードにスケジュールしなければならない場合、どうしますか?」と掘り下げました。nodeSelectorやnodeAffinityで強制スケジュールするか、リソースリクエストを調整すると答えました。彼はさらに「クラスタ全体のリソースが不足している場合はどうしますか?」と聞き、クラスタをスケールするかリソース使用を最適化する必要があると答えました。

サービスガバナンスが2次面接のコアでした。「サービスガバナンスソリューションは何ですか?サービスディスカバリはどうやっていますか?」Nacosでサービスディスカバリと設定管理を行い、サービスはNacosに登録し、コンシューマーはNacosからサービスリストを取得すると答えました。面接官は「NacosとEurekaの違いは?」と聞きました。NacosはAPとCPモードの切り替えをサポートし、EurekaはAPモードのみ;Nacosは設定管理をサポートし、Eurekaはサポートしない;Nacosはヘルスチェックをサポートし、Eurekaはクライアントハートビートに依存すると答えました。彼はさらに「サーキットブレーカーはどうやりますか?」と聞き、Sentinelでサーキットブレーキングとデグレードを行い、スローコール比率、例外比率、例外数の3つのサーキットブレーキング戦略をサポートしていると答えました。

印象に残った質問:「サービスAがサービスBに依存し、サービスBがサービスCに依存し、サービスCがダウンした場合、カスケード障害をどう防ぎますか?」いくつかの保護層を実装していると答えました:1)Sentinelサーキットブレーキング——サービスCが異常な場合、BからCへの呼び出しがサーキットブレーキされ、高速に失敗;2)タイムアウト制御——各呼び出しにタイムアウトを設定し、タイムアウトで自動デグレード;3)レート制限——インバウンドトラフィックをレート制限し、アバランシェを防止;4)フォールバック——サーキットブレーキ後、デフォルト値やキャッシュデータを返す。面接官は「包括的なアプローチですが、フォールバックのキャッシュデータの整合性はどう保証しますか?」と言いました。ローカルキャッシュ+バージョン番号を使用し、設定センターから定期的に更新すると答えました。

2次面接は約1.5時間で、面接官は「コンテナ化とサービスガバナンスの経験は良いですが、LINEの規模ではいくつかの最適化が必要です」と言いました。

3次面接:システム設計+プロジェクト深掘り

3次面接は部門ディレクターでした。雰囲気はよりフォーマルでした。まずインフラに対する理解を聞かれ、「インフラのコアバリューは開発効率とシステム安定性の向上であり、標準化と自動化でビジネスチームの参入コストを下げることです」と答えました。彼は頷き、プロジェクトの深掘りを始めました。

「最も技術的に挑戦的だったインフラプロジェクトは何ですか?」以前の設定センタープロジェクトについて説明しました——百万レベルの設定のリアルタイムプッシュをサポート。最大の課題はプッシュのパフォーマンスと整合性でした。ロングポーリング+バージョン番号で設定変更のリアルタイムプッシュを実現し、サーバーは設定バージョン番号を維持し、クライアントは定期的にバージョン番号が変化したかチェックし、変化していれば新しい設定をプルする。面接官は「百万クライアントが同時にロングポーリングする場合、サーバーはどう耐えますか?」と掘り下げました。いくつかの最適化を行ったと答えました:1)グループプッシュ——設定グループごとに、そのグループを購読しているクライアントにのみプッシュ;2)バッチレスポンス——複数のクライアントが同じ設定をチェックする場合、レスポンスをマージ;3)接続再利用——HTTP/2マルチプレキシングで接続数を削減。彼はさらに「設定変更の整合性はどう保証しますか?」と聞き、バージョン番号+MD5チェックサムを使用し、クライアントは設定プル後にMD5を検証し、不一致ならリトライすると答えました。

オープンエンドのシステム設計問題:「千万レベルのインスタンスをサポートするサービスレジストリを設計してください」。いくつかの側面から設計すると答えました:1)ストレージ——シャードストレージを使用し、各シャードが一部のサービスを担当;2)プッシュ——増分プッシュ+圧縮でデータ量を削減;3)整合性——Raftプロトコルでデータ整合性を保証;4)可用性——マルチデータセンターデプロイ、クロスデータセンター同期。面接官は「Raftプロトコルの選挙プロセスについて理解していますか?」と聞き、理解している——Followerは選挙タイムアウト後にCandidateに移行し、選挙を開始し、多数票を獲得したらLeaderになると答えました。彼はさらに「ネットワークパーティションが発生したらどうしますか?」と聞き、パーティション後、多数派パーティションは新しいLeaderを選出でき、少数派パーティションは選出できず、整合性が保証されると答えました。

最後にLINEのインフラに対する考えとキャリアプランについて聞かれました。LINEのインフラチームは業界で影響力があり、技術の深さとビジネス規模はトップレベルであり、ここでインフラを深めたいと答えました。面接官は「ようこそ」と言いました。

HR面接は通常の給与と入社日の相談で、特別なことはありませんでした。

実際の面接問題

1次面接の問題

1. synchronizedとReentrantLockの違いは?
2. synchronizedのロックエスカレーションプロセスは?
3. Kafkaはなぜ速いのか?ゼロコピーはどう実装されているか?
4. sendfileとmmapの違いは?
5. Kafkaのパーティションとコンシューマーグループの関係は?
6. Redisの永続化ソリューションは?AOF書き換えは?
7. Redis Clusterのハッシュスロットは?
8. スレッドプールのコアパラメータは?拒否ポリシーは?
9. HashMapの基礎実装は?リサイズメカニズムは?
10. volatileとsynchronizedの違いは?

2次面接の問題

1. 仮想マシンからコンテナへの移行プロセスは?
2. CalicoのBGPとIPIPモードの違いは?
3. K8sスケジューラの動作原理は?スケジューリングポリシーは?
4. サービスガバナンスソリューションは?サービスディスカバリはどうやるか?
5. NacosとEurekaの違いは?
6. Sentinelのサーキットブレーキング戦略は?
7. カスケード障害をどう防ぐか?
8. ネットワークポリシーはどう処理するか?
9. K8sのHPAとVPAについて理解しているか?
10. コンテナリソース制限はどう設定するか?OOMはどう処理するか?

3次面接の問題

1. 最も技術的に挑戦的だったインフラプロジェクト
2. 設定センターのリアルタイムプッシュソリューション
3. 百万クライアントのロングポーリングはどう最適化するか?
4. 千万レベルのインスタンスをサポートするサービスレジストリを設計
5. Raftプロトコルの選挙プロセスは?
6. ネットワークパーティションはどう処理するか?
7. インフラのコアバリューは何か?
8. 技術ソリューションの実装をどう推進するか?
9. LINEのインフラに対する考え
10. キャリアプラン

心得とアドバイス

第一に、ミドルウェアの原理は深く理解する必要があります。LINEのインフラ面接では「使ったことがある」レベルではなく、基礎実装を説明できることが求められます。Kafkaのゼロコピー、Redisの永続化、スレッドプールの原理は必須です。ソースコードを読むことをお勧めします。

第二に、Java並行処理はインフラ面接の基礎です。synchronizedのロックエスカレーション、AQSの実装、スレッドプールの原理は完全にマスターする必要があります。「Java並行プログラミングの芸術」とJUCソースコードを読むことをお勧めします。

第三に、コンテナ化には実戦経験が必要です。DockerとK8sの使い方を知っているだけでは不十分で、仮想マシンからコンテナへの移行方法、ネットワーク問題の処理、リソース制限の設定方法を知る必要があります。自分でK8sクラスタを構築して練習することをお勧めします。

第四に、サービスガバナンスはフルチェーンを理解してください。NacosとSentinelの使い方を知っているだけでなく、サービスディスカバリ、負荷分散、サーキットブレーキング、デグレード、レート制限の概念間の関連を理解してください。完全なマイクロサービスプロジェクトを作ることをお勧めします。

第五に、システム設計にはスケール感が必要です。LINEのインフラは百万レベル、さらには千万レベルのスケールで動いています。面接官は大規模シナリオでのソリューション設計に特に注目します。LINEの技術ブログを読み、彼らのアーキテクチャ実践を学ぶことをお勧めします。

FAQ

Q1:LINEのインフラ面接はJavaの要求が高いですか?

はい、非常に高いです。Spring Bootが使えるレベルではなく、JVM、並行処理、ミドルウェア原理といった低レイヤーの知識を理解する必要があります。JUCソースコードとミドルウェアソースコードを読むことをお勧めします。

Q2:コンテナ化の経験がない場合は?

自分でK8sクラスタを構築して練習できます。minikubeやkindでローカルに構築し、いくつかのマイクロサービスをデプロイし、サービスディスカバリ、設定管理、ローリングアップデートを練習する。重要なのはコンテナと仮想マシンの違いと、K8sのコア概念を理解することです。

Q3:ミドルウェアはどの程度学ぶべきですか?

少なくともコアミドルウェアのソースコードを1回は読むべきです。Kafkaはメッセージストレージと送信フロー、Redisはデータ構造と永続化、RocketMQはメッセージ配信とトランザクション。面接官は「Kafkaのゼロコピーはどう実装されているか」というレベルの質問をします。

Q4:サービスガバナンスはどう学ぶべきですか?

Spring Cloudから始め、サービスディスカバリ、設定管理、サーキットブレーキングの概念を理解し、その後NacosとSentinelの使用と原理を学ぶことをお勧めします。最も重要なのは、なぜサービスガバナンスが必要なのかを理解することであり、ツールの使い方だけではありません。

Q5:LINEのインフラの仕事の強度はどうですか?

インフラチームのペースは比較的安定しており、ビジネスチームのようなプロモーションのプレッシャーはありません。しかしオンコールは常態で、本番問題には迅速な対応が必要です。技術的な雰囲気は良く、大規模分散システムの様々な問題に触れられます。インフラエンジニアの成長に非常に役立ちます。

#Infrastructure#Meituan#Middleware#Kafka#Redis#K8s#Service Governance