すべてのプロダクト
Search
ドキュメントセンター

HTTPDNS:ベストプラクティス

最終更新日:Dec 17, 2025

HTTPDNS は、HTTP API を使用してドメイン名の名前解決機能を提供します。公式 SDK を直接統合できないシナリオでは、開発者はアクセスモードを指定できます。このトピックでは、開発者が HTTP API を最適化するのに役立つ、可用性、パフォーマンス、名前解決の品質、セキュリティなどの主要な側面に関する推奨事項を説明します。

1. 可用性の最適化

シナリオ:特定の HTTPDNS サービスノードが利用不可の場合

背景情報

自然災害、インターネットサービスプロバイダー (ISP) によるブロッキング、ネットワーク障害などの極端な状況では、HTTPDNS の単一のサービスエントリーポイントが利用できなくなり、ドメイン名の名前解決に影響を及ぼす可能性があります。

ソリューション

  1. 起動 IP アドレスのフェールオーバー

    • アプリケーション内に複数の起動 IP アドレスまたはドメイン名を埋め込み、HTTPDNS との継続的な接続性を確保します。

    • リクエストが失敗した場合、次の起動 IP アドレスが自動的に使用されます。

  2. サービス IP アドレスリストの動的更新

    以下のフローチャートは、起動 IP アドレスにリクエストを送信してサービス IP アドレスを取得する方法を示しています。

image

詳細については、「スケジューリングサービスインターフェイス」をご参照ください。

説明

以下のシナリオでサービス IP アドレスリストを更新して保存することを推奨します。

  • (推奨) コールドスタート時にサービス IP アドレスリストを更新します。

  • (推奨) ネットワーク環境を切り替えるときにサービス IP アドレスリストを更新します。

  • (推奨) 少なくとも 8 時間に 1 回はサービス IP アドレスリストを更新します。

  • リトライしてもサービス IP アドレスリストが解決できない場合は、リストを更新します。

  1. フェールオーバーポリシー

    HTTPDNS を使用すると、IP ローテーションメカニズムが実装されます。ある IP アドレスが到達不能な場合、システムは次の IP アドレスにローテーションしてリトライするため、1 つのサービス IP アドレスが利用できなくなっても HTTPDNS は影響を受けません。サーバーに名前解決リクエストが送信されると、システムはグローバルサービス IP アドレスリストから利用可能なサービス IP アドレスを取得します。現在のサービス IP アドレスを使用した名前解決が成功した場合、SDK はそのライフサイクル全体でこの IP アドレスを名前解決に使用し続けます。現在のサービス IP アドレスを使用した名前解決が失敗した場合、システムはグローバルサービス IP アドレスリストの次の IP アドレスに切り替えてリトライします。リトライも失敗した場合、システムは null を返し、再度別のサービス IP アドレスへの切り替えを試みます。

image
重要
  • カーソルはグローバルです。ご利用のコンピューターにカーソルを永続的に保存することを推奨します。

  • ほとんどの場合、名前解決が失敗しない限り、サービス IP アドレスリストは変更されません。

  • サービス IP アドレスリストは動的に設定可能にすることを推奨します。これにより、更新が有効になるまでの時間を短縮し、影響を最小限に抑えることができます。

すべての HTTPDNS サービス IP アドレスが応答しない場合は、オペレーティングシステムのネイティブ DNS チェーンであるローカル DNS の使用にフォールバックします。Android で OkHttp をネットワークライブラリとして使用して HTTPDNS を統合する場合、次のコードを使用してローカル DNS で名前解決できます。

List<InetAddress> result = okhttp3.Dns.SYSTEM.lookup(host);
val result: List<InetAddress> = Dns.SYSTEM.lookup(host)

iOS の場合は、Host の置換やリクエストのインターセプトを避け、元のリクエストは変更しないようにします。

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
// リクエストを送信します。
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    if (error) {
        NSLog(@"error: %@", error);
    } else {
        NSLog(@"response: %@", response);
    }
}];
[task resume];
var request = URLRequest(url: url)
// リクエストを送信します。
let session = URLSession.shared
let task = session.dataTask(with: request) { (data, response, error) in
    if let error = error {
        print("error: \(error)")
    } else {
        print("response: \(response?.description ??  "")")
    }
}
task.resume()
  1. ノンブロッキング名前解決

    アプリで非同期メソッドを使用して HTTPDNS にアクセスします。これにより、ビジネスが名前解決の結果を待つために中断される必要がなくなります。

2. パフォーマンスの最適化

シナリオ:頻繁なクエリによるパフォーマンスのボトルネック

背景情報

各ネットワークリクエスト中に HTTPDNS にドメイン名の名前解決をリクエストすると、ビジネスのレイテンシーと帯域幅の消費が大幅に増加します。ドメイン名の名前解決結果には TTL (Time To Live) キャッシュ値があることを考慮すると、この値に基づいてキャッシュを実装できます。

ソリューション

  1. ローカルキャッシュ

    • DNS 標準 RFC 1034 によると、名前解決の結果は TTL 値に基づいてキャッシュできます。

image
説明
  • TTL 値は、HTTP API 応答の ttl フィールドです。

  • キャッシュがヒットしないか、または有効期限が切れた場合は、名前解決リクエストを開始してキャッシュを更新する必要があります。

  1. 事前解決

説明

キャッシュの有効期限が近づいたとき (例:TTL の 80% 時点) に、関連するドメイン名を解決し、結果をローカルにキャッシュできます。アプリケーションの起動時に、よく使用されるドメイン名を事前解決して結果をキャッシュします。 事前解決はサービスへのアクセスレイテンシーを短縮しますが、名前解決リクエストの数が増加します。ホットスポットドメイン名にのみ事前解決を使用することを推奨します。

  1. コネクションの再利用

    HTTP クライアントのコネクション再利用機能を有効にすることで、TCP 接続の確立にかかる時間を短縮し、HTTPDNS の名前解決レイテンシーを低減できます。

  2. 永続キャッシュ

    前回取得した名前解決の結果を永続的にキャッシュできます。アプリの再起動後、名前解決の結果は永続化レイヤーから優先的に読み込まれます。これにより、初回の読み込み速度が向上します。

説明
  • IP アドレスは、初回使用時に有効期限が切れている (TTL が期限切れになっている) 可能性がありますが、ほとんどの場合は引き続き使用できます。

  • 永続キャッシュを有効にすると、アプリの初回起動時やネットワークタイプが変更されたときに、ドメイン名の名前解決の結果が影響を受けます。永続キャッシュを有効にした後、すべての名前解決リクエストは HTTPDNS サーバーに転送され、ローカルキャッシュ内のデータが更新されます。

3. 解像度品質の最適化

シナリオ:ISP をまたぐ名前解決によるアクセスレイテンシー

背景情報

CDN で高速化されたドメイン名や、インテリジェントルーティング解決が設定されたドメイン名を使用する場合、クライアントが DNS 名前解決で取得した IP アドレスを TTL 値に基づいてキャッシュしていると、ネットワーク環境が変化したときに問題が発生する可能性があります。たとえば、4G ネットワークから Wi-Fi に切り替わった場合 (またはその逆) などです。このような場合、キャッシュされた IP アドレスは新しいネットワーク環境の最適ルートと一致しなくなり、ビジネス関連のネットワークリクエストでパフォーマンスが低下する可能性があります。

ソリューション

  1. ネットワーク環境の監視

    • クライアントネットワークの変更 (例:Wi-Fi からモバイルデータへの切り替え) を監視します。

    • ローカルキャッシュを積極的にリフレッシュして、名前解決の結果が現在のネットワーク環境と互換性があることを確認します。

重要

すべてのドメインの名前解決結果をリフレッシュすると、追加のトラフィックが発生します。

  1. 速度テストとソート

    ICMP または TCP の非同期テストを使用して名前解決の結果をランク付けし、応答時間が最も速い IP アドレスを優先します。

重要

この方法は、ビジネスサーバーの元の負荷分散戦略に影響を与える可能性があります。

4. セキュリティの最適化

シナリオ:名前解決リクエストのハイジャックまたは漏洩

背景情報

認証メカニズムのない名前解決 API は、第三者によってトラフィックを盗まれ、コストが発生する可能性があるため、セキュリティリスクをもたらします。

ソリューション

  1. 認証解決

    認証付きの API 操作を使用してドメイン名を解決することを推奨します。HTTPDNS コンソールで、認証なしの API 操作を無効にするかどうかを選択できます。

    • これらの操作を呼び出してドメイン名を解決すると、HTTPDNS はシークレットキーを使用して暗号化された文字列を生成し、その文字列を認証のためにリクエストに含めます。シークレットキーはリクエストに含まれないため、漏洩リスクが低減され、名前解決リクエストのセキュリティが確保されます。

    • 詳細については、「認証アクセスを実装する」をご参照ください。

  2. HTTPS を使用したセキュアな通信

5. トラブルシューティング

問題を効率的に特定するために、アプリの起動時にセッション ID を生成して、単一のアプリセッションのライフサイクルを一意に識別できます。HTTPDNS にリクエストを開始する際に、このセッション ID をリクエストに含めます。問題が発生した場合、HTTPDNS テクニカルサポートチームは提供されたセッション ID を使用して、問題のトラブルシューティングと解決を行うことができます。セッション ID は [a-zA-Z0-9]{12} 形式です。

例:http://203.107.xxx.xxx/{accountId}/sign_d?host=www.aliyun.com&t=1573XXXX&s=60c7XXXXXX&sid=1234567890ab

6. まとめ

これらの最適化ソリューションに従うことで、開発者は複雑なネットワーク環境において、API を使用して高可用性、低レイテンシー、かつセキュアな HTTPDNS 統合を実現できます。同時に、潜在的な問題に対処し、全体的な名前解決の品質を向上させることができます。