1 これは背景です最近、複数の条件を任意に組み合わせて注文データを照会する機能を提供してほしいという要望を受けました。データベース内の 1 億件を超える注文を見ると、髪の毛が 2 本抜け落ちたことがわかります。これは、この要件が単純ではないことを示しています。 写真 2 本の抜け毛の問題は、技術的に実装するのが難しくありません。実際、技術的な実装は明確かつ簡単です。データの異質性を介してデータを ES に同期し、ES の転置インデックス、キャッシュなどの機能を使用して、複数の条件で複雑なクエリを実行する機能を提供します。 ES クラスターはすでに存在します。 しかし、現在の ES インデックスには一部のデータが存在しません。つまり、1億件を超える注文データを注文データベースからESに再度更新する必要があり、この操作には1週間かかります。 何?信じられないなら、話し合いましょう。 2. 注文データをESに同期させる複雑さを見てみましょう2.1 データ同期ESインデックスプロセス写真 上図に示すように、これは ES インデックスにデータを同期するプロセスです。 まず、注文データベースからすべての注文データを照会し、次に注文データに保存されているユーザー ID、製品 ID、その他の情報に基づいて、ユーザー サービスと製品サービスから関連情報を照会する必要があります。処理および組み立て後、情報は ES クラスターに分類されます。 ユーザー情報と製品情報を照会する理由は、ES インデックス内の異種注文データが MySQL のデータと 1 対 1 で対応していないためです。商品カテゴリやユーザー情報などをもとに注文情報を照会したいという要望が多くあります。そのため、ここでは多くの上流サービスに照会して情報を収集する必要があります。 2.2 何か困難があるかどうかを整理してみましょう。
ああ、考えただけで頭が痛くなる! つまり、物事は単純に見えますが、実際にはそれほど単純ではないのです。 3 素晴らしいサービス髪をもっと心地よくするために、上記の困難に対処する魔法のサービスが開発されました。それが ECP です。プロセス全体を自動化および視覚化できるため、ES への異種データのコストが削減されます。タスク インターフェースは次のとおりです。 写真 3.1 ECPの簡単な操作プロセス簡単に言えば、ECP の役割は、データ ソースからデータを読み取り、それを ES 書き込みサービスにプッシュすることです。データ処理のロジックは業務ごとに異なるため、ES 書き込みサービスはさまざまなドッキング パーティによって実装され、単純なプロセスは次のようになります。 写真 これには、複数のデータ ソースからデータを読み取る方法、データ ソースの構成、SQL 検証、動的電流制限、SPI メカニズム、再試行戦略と障害認識、活性検出と障害回復、環境分離などの技術的な詳細が含まれます。 以下、順に紹介します。 3.2 複数のデータソースからのデータの読み取りECP は現在、ID ソース、テキスト ソース、スクリプト ソースの 3 つのデータ ソースからのデータの読み取りをサポートしています。 3.2.1 IDソースIDを入力するためのテキストボックスがあります。このシナリオは、小さなデータの同期に適しています。たとえば、一部のデータベースと ES データに不整合があることがわかった場合は、データを更新するだけで済みます。 写真 3.2.2 ファイルソースファイル ソースとは、テキスト ファイルから取得されるデータ ソースを指し、中規模のデータの同期に適しています。 ECP はオブジェクト ストレージに接続されており、ユーザーはオブジェクト ストレージにファイルをアップロードできます。タスクが実行されると、ECP はオブジェクト ストレージ内のテキスト データを読み取ります。 この場合、ユーザーがアップロードしたファイルは比較的大きい可能性があり、処理のためにメモリに直接読み込むのは現実的ではないことに注意してください。そのため、ここではストリーム方式を採用して読み取り、バッチを読み取り、バッチを処理し、バッチを解放することで、OOM が発生しないようにしています。 写真 簡略化された処理方法は次のとおりです。 3.2.3 スクリプトソーススクリプト ソースは、大量のデータを同期するのに適しています。 スクリプトは基本的に SQL とデータ ソースの組み合わせです。 ユーザーは ECP でデータベース接続情報を構成し、次に SQL を構成します。 ECP は SQL を実行し、構成されたデータベースからデータを読み取り、それを ES 書き込みサービスにプッシュします。 スクリプト ソースは、数億のデータの読み取りとプッシュをサポートできます。次の図は、注文ライブラリ (サブライブラリとサブテーブル) に対して構成されたスクリプト情報を示しています。 写真 3.2.4 スクリプトソースビッグデータ読み取りの実装数億のデータをメモリに読み込んで処理するのは明らかに不可能なので、ローカルデータを読み込んで処理するのが正しい方法です。 ビジネスでは、ページングがよく使用されます。ただし、ページングで制限オフセットとサイズのみを使用する場合、オフセット値が大きいとパフォーマンスが急激に低下し、SQL が遅くなり、データベース全体のパフォーマンスが低下することもあります。 したがって、ページ数が多い場合は、インデックス付きフィールドをカーソルとして指定する必要があります。このカーソルはページングのパフォーマンスを向上させることができます。たとえば、注文テーブルで注文 ID が増分され、インデックスが設定されている場合、SQL は次のように記述できます。select * from t_order where order_id > xxx order by order_id desc limit 10; order_id 値を変更するとページング効果が得られます。 この方法は良いのですが、ユーザーにカーソル インデックスの選択を要求すると、使用のハードルが間違いなく高くなります。したがって、ECP はビッグ データを読み込むために上記のページング メソッドを使用せず、次に示すように JDBC カーソル クエリ メソッドを使用します。 カーソル クエリは毎回 fetchSize 量のデータを読み取るため、大量のデータを読み取ることで発生する OOM の問題を効果的に回避できます。 3.3 SQLの解析と検証ユーザーは SQL スクリプトを構成し、ECP は SQL スクリプトを検証して変更する必要があります。従来の文字列処理 (正規表現など) は、特定の状況では要件を満たすことができますが、エラーが発生しやすくなります。そのため、ECP は、SQL を AST 構文ツリーに解析して SQL に対してさまざまな処理を実行できる Druid の SQL 解析ツールキットを使用します。次の図に示すように: 写真 ECP によって提供されるデータ サンプル クエリは、SQL に制限 1 を自動的に追加します。 写真 写真 3.4 動的電流制限の実装電流制限は、クラスター電流制限と単一マシン電流制限に分けられます。評価の結果、シンプルさを保つという原則に基づいて、単一マシンの電流制限を採用し、電流制限コンポーネントとして guava の RateLimiter を使用しました。 写真 ページで QPS 値が変更されると、その値はデータベースに同期されます。スケジュール タスクは値の変更を継続的にスキャンし、変更された値を RateLimiter コンポーネントに同期します。 もちろん、データ監視戦略(MQ のブロードキャストなど)を採用して、変更された値をよりタイムリーに RateLimiter に同期させることもできますが、この方法では他のコンポーネントの導入も必要となり、複雑さが急速に増大し、当社のシンプルな実装戦略に適合しません。 動的電流制限の実装プロセスは次のとおりです。 写真 次の図は、さまざまな時点で現在の制限値が変更された後の QPS の変化を示しています。 写真 3.5 再試行戦略と障害認識ES と DB のデータは可能な限りリアルタイムの一貫性を確保する必要がありますが、最終的な一貫性も保証する必要があります。したがって、データのプッシュと処理が失敗した場合は、再試行を実行する必要があります。再試行するには? まず、障害の種類を理解し、適切な再試行戦略を策定する必要があります。自分自身と敵を知ることで、あらゆる戦いで勝利が保証されます! 1. ネットワーク ジッタによるインターフェイス呼び出しのタイムアウト。マイクロサービス RPC インターフェイスを呼び出す場合、ネットワーク ジッターなどの条件により、インターフェイス呼び出しがタイムアウトする可能性がありますが、すぐに回復します。通常、これはたまにしか発生せず、次の通話では正常になります。 2. データ処理ロジックが異常です。この場合、異常は自動的に回復することはできず、手動で介入することしかできません。 3. 上流サービスの異常。アップストリーム サービスの負荷が大きすぎてインターフェイス呼び出しが失敗した場合は、速度を落として処理を続行する必要があります。呼び出しを続けてアップストリーム サービスをクラッシュさせることはできません。 上記の失敗タイプの特性と組み合わせると、フィボナッチ数列の再試行戦略は、フィボナッチ数列の特性(1、1、2、3、5、8、13、21、34、55、89…)に非常に適しています。 最初の失敗が発生すると、1 秒の遅延後に再試行が実行されます。タイムアウトの原因がネットワーク ジッタである場合、再試行は成功し、データ処理速度には影響しません。失敗の数が増えると再試行間隔が長くなり、上記の 2 番目と 3 番目の失敗の種類も考慮されます。 再試行コンポーネントは Guava Retry を使用します。簡単な疑似コードは次のとおりです。 一定回数の再試行後に失敗した場合は、エラー メッセージがアラーム グループに送信されます。プッシュされた情報に基づいて、エラーの種類、再試行回数、タスクの作成者などの情報を明確に把握できます。ほとんどの問題はログを確認しなくても見つけることができます。以下のように表示されます。 写真 3.6 処理のためにデータをどのサービスにプッシュする必要がありますか? -SPIメカニズムECP はユニバーサル サービスであるため、共通機能をまとめて完成品にし、非共通機能を抽象化してさまざまなドッキング パーティに引き渡して実装する必要があります。 シンプルな実装の観点から、サービスが ECP に接続したい場合は、ECP 上で開発し、サービス インターフェイスを呼び出して、データをサービスにプッシュします。アイデアは明確ですが、接続とメンテナンスのコストが非常に高く、統一された仕様がないため、お勧めできません。プロセスは次のとおりです。 写真 Java にはこの問題を解決できる優れたアイデアがあります。それが SPI です。そのため、ECP はインターフェースを提供して仕様を策定し、ES インデックス データの具体的なアセンブリ ロジックは各ドッキング パーティによって実装されます。 このように、新しいドッキング パーティが参加する場合は、インターフェイスを実装するだけでよく、ECP は変更を加える必要がありません。 写真 サービス検出に関しては、ECP が採用している構成方法は、次の図に示すように、新しいタスクを作成するときにデータ プッシュのコンシューマー サービスを選択することです。 写真 実装方法としては、同社が独自に開発したRPCフレームワークにより、呼び出しサービスを動的に指定する方式を提供している。疑似コードは次のとおりです。 3.7 環境隔離データの同期は比較的負荷の高い操作ですが、オンライン ビジネスに影響を与えることはありません。したがって、データを同期するためのサービスはオンライン サービスから分離する必要があります。 ECP は、アーキテクチャ グループが提供するラベル ルーティング機能を統合しており、リクエスト リンク全体で指定されたラベルを持つサービスを呼び出して環境の分離を実現できます。 ECP ラベル ルーティング構成図: 写真 次の図に示すように、ECP でタスクのラベル ルーティングが FLUSH として設定されている場合、同期タスクの実行中に、リンク内の FLUSH ラベルにバインドされたサービス グループが自動的に呼び出されます。 写真 一部のサービスが FLUSH ラベルを持つグループとして構成されていない場合は、サービスの通常のオンライン環境が自動的に要求されます。このようにして、ある程度の環境隔離を実現できます。 写真 3.8 活性検出とタスク障害回復メカニズムデータ プッシュ プロセス中に予期せぬ事態が発生し、タスクが中断された場合はどうすればよいですか? 要件の期限を迎えた時、某年某月某日に進捗が1%になった時点でタスクが止まっていることに気づき、泣きました。 さらに、労働時間は短く、仕事量は多いです。中断がないかどうかを常にタスクに監視することはできませんよね?これは不適切かつ失礼です。 もちろん、ECP には「セルフレスキュー パッケージ」があるため、このような状況は ECP では発生しません。次に、ECP のタスク検出と割り込み回復メカニズムについて説明します。 次の図に示すように、ECP には、活性検出とタスク障害回復という 2 つの主要コンポーネントがあります。活性検出コンポーネントは、現在のタスク スレッドの実行ステータスを監視する役割を担います。タスク スレッドが実行中の場合、タスクの生存時間が更新されます。タスク障害回復コンポーネントは、現在未完了のタスクをスキャンする役割を担います。タスクの最後の生存時間が指定されたしきい値よりも大きい場合、タスクは実行を再開するためにプルされます。 写真 更新の疑似コードは次のとおりです。 タスク障害回復の疑似コードは次のとおりです。 3.9 スムーズな移行の実現通常、データを ES に同期する方法は 2 つあります。
新しいインデックスを作成するときは、多くの場合、インデックス マッピングを変更したり、元のインデックスに影響を与えずに操作をロールバックできるようにしたりする必要があります。 このシナリオでは、ECP は過去に ES インデックスを手動で更新する手順を分析し、プロセスを抽象化して、次の図に示すように次の手順をまとめました。 写真 ECP は、Apollo 構成センターを統合してプッシュ機能を実装するスムーズな移行コンポーネントを提供します。簡単な実装プロセスは次のとおりです。 写真 3.10 エレガントなログ次の図はタスク操作のログを示しています。原則として、ログ レコードは非コア業務であり、コア業務コードから分離する必要があります。したがって、注釈付きのフロー レコードを使用するのが適切な選択です。 写真 しかし、注釈付きフロー レコードには問題があります。多くのシナリオでは、フロー内の値を動的に取得する必要があります。これは注釈を使用して実現できますか?答えはイエスです。上図に示すように、タスク ID とデータ ソースはどちらも動的データです。これを実現するにはどうすればよいでしょうか?次のコードを見てください。 subjectIdEp はフロー サブジェクト ID であり、#taskPo.id は、パラメーター taskPo の ID 値を動的に取得するために使用できる式です。ここではspringEl式の能力が活用されています。 content = "'タスクの作成、タスク ID:' + #taskPO.id " はフロー情報であり、springEL 式はリクエスト パラメーター taskPo の ID 情報を動的に取得するためにも使用されます。 ただし、一部の情報を取得するには、オブジェクトから単に値を取得するのではなく、一連の計算が必要になります。次のように: T(com.zhuanzhuan.esmanage.utils.DateUtils).dateToStringSimple(#aliveTime) は、DateUtils.dateToStringSimple メソッドが実行されることを意味し、これは、Spring コンテナーからオブジェクトを取得したり、オブジェクトのメソッドを呼び出したりするなど、式がメソッドを呼び出すことができることを意味します。 このアノテーションベースのパイプラインの実装原則は、SPEL 式と Spring Aop の特性を使用して、カスタム フロー アノテーションをインターセプトするセクションを記述することです。疑似コードは次のとおりです。 4 結論一般的に、ECP の実装では考慮すべき技術的な詳細が多く、技術的な難易度は平均的です。 実際、私たちのプロジェクトのほとんどでテストされるのは、細部に対する制御です。 追伸:この記事のタイトルを強力にサポートしてくれたChatGPTに感謝します 著者についてYan Zhan 氏、Zhuanzhuan Trading Platform の研究開発エンジニア |
<<: クラウドプロバイダーが効率性と生産性の向上にどのように役立つか
>>: サービス検出は、動的な運用と保守において、サービス アドレスの適時性を継続的に維持するにはどうすればよいでしょうか。
クラウド分析は、大量のデータを処理し、実用的な品質重視の洞察を生成する優れた方法です。クラウド コン...
[[390061]]この記事はWeChatの公開アカウント「LoyenWang」から転載したもので、...
みなさんこんにちは。Snow Leopardです。私は皆さんとSEOについてコミュニケーションをとっ...
SEO コンサルティング サービスをしていたとき、5 つの基本的な SEO の問題によく遭遇しました...
Vaicdnは2017年に設立され、2018年9月にMaker 100 FundとCDN大手のChi...
hosteonsの担当者から2つのニュースが届きました。(1) OpenVZ7でもKVMシリーズでも...
3月12日のウェブマスターネットワーク(www.admin5.com)によると、2月下旬、百度はウェ...
raksmartは、今後「新年限定」イベントを開始すると発表した。3月1日から3月31日まで、rak...
要点この削除事件は小紅書に大きな衝撃を与えた。データによれば、月間アクティブユーザー数は減少し、1億...
最近2日間休みを取ったのですが、家に帰ってから朱偉坤さんが書いた記事を見ました。「汕頭SEOが共有す...
動画サイトでは、2つの興味深い現象が起きている。1つは、今年1億元を投じて「中国の声」第2シーズンの...
Racknerd はロサンゼルスに DC3 データセンターを新たに開設しました。今回は 258 個の...
QNデータセンターは先月、CEO/CFOをはじめとする人事の交代を完了しました。直下のPacific...
2008 年 9 月 1 日、私は SEO という神聖な業界に正式に参入しました。私の SEO の旅...
この問題の根本的な原因は、上司が出張中で、私が一週間何もせず、外部リンクを投稿せず、ニュースを更新し...