米国では完璧に機能するアプリを展開したのに、ヨーロッパのユーザーが読み込み画面やタイムアウトに何度も遭遇したという経験はありませんか? これは私たちの多くが経験した悪夢であり、地域化という重大な問題を浮き彫りにしています。製品をローカルからグローバル規模に拡大することは、単なる技術的な決定ではありません。複雑さ、驚き、そして多くの成長痛に満ちた旅なのです。
想像してみてください。アプリケーションの米国での応答時間は 100 ミリ秒と速いのに、ヨーロッパのユーザーは 2 秒の遅延に悩まされています。私が Twilio に在籍していたとき、私たちはまさにこの課題に正面から取り組みました。その瞬間、私たちは地域アーキテクチャを完全に再考せざるを得なくなりました。
その後、システムの再構築に注力した 1 年が経ちました。今日は、効果があった具体的なアプローチと、特に効果のなかったアプローチについてお話ししたいと思います。
グローバル展開には、コンプライアンス、レイテンシー、ユーザー エクスペリエンスなど、さまざまな課題が伴います。システムをグローバル化、国際化、地域化に合わせて調整しないと、次のような問題に直面する可能性があります。
Twilio の API を地域化することに着手したとき、主な障害は、コンプライアンスの確保、パフォーマンスの維持、システムを過度に複雑にすることなくスケーラビリティを実現することでした。システムの柔軟性を維持しながら、API を地域対応にすることが重要でした。地域化プロセスを進める際に適用できる、最も効果的で効果的なソリューションを検討してみましょう。
リージョン対応 API を設計する際の主な目標は、システムの複雑さを大幅に増やすことなくデータの局所性を確保することです。以下は、私たちが使用した高レベルのアプローチです。
リージョンをパラメータ化: リージョン API 設計の鍵は、リージョンが API レベルでパラメータ化されるようにすることです。リージョンごとに異なるエンドポイントを用意するのではなく、リージョン パラメータを持つ統合エンドポイントを使用します。これにより、API はリクエストを処理するリージョン リソースを決定し、個別の API バージョンを管理することなくシステムを適応させることができます。
コンテキスト設定: 地域固有の設定を動的に使用することは、最も効果的な手法の 1 つでした。地域固有の設定を保存するために、DynamoDB のグローバル テーブルを使用しました。たとえば、データセンターの地域、データ ストレージ パス、コンプライアンス ルールなどの設定が API 呼び出しの一部として挿入され、ユーザーの地域に基づいて API が動的に設定されます。これにより、アーキテクチャが簡素化されるだけでなく、さまざまな地理的な場所にわたって柔軟性とスケーラビリティが提供され、データの取り扱いと処理が地域のポリシーに準拠することが保証されます。
リージョンエンドポイント解決: 効果的な手法の 1 つは、 DNS ベースのルーティングを活用して、ユーザーを適切なリージョン API エンドポイントに誘導することです。AWS Route 53などの DNS ソリューションは、統一された API ドメインを使用しながら、ユーザーの位置情報に基づいてリクエストを適切なリージョンにマッピングするのに役立ちます。これにより、システムの管理が容易になり、ユーザーフレンドリーになります。
API がリージョン対応になったら、次の重要なステップはデータベースもリージョン対応にすることです。私たちは次のように取り組みました。リージョンごとに個別のデータベースを維持する代わりに、マルチリージョン クラスターを選択しました。
地域対応データベースの調査: 地域データ分散を効果的に処理する能力について、いくつかのデータベースを評価しました。CockroachDBは、地理的なパーティション分割機能により際立っており、最小限の複雑さで複数の地域にデータを分散できます。CockroachDB のマルチアクティブ可用性機能により、各地域で読み取りと書き込みを個別に処理できるようになり、高可用性が確保され、地域間のレイテンシが削減されます。
従来のデータベースからの移行: 従来のデータベースから地域対応システムへの移行には、慎重な計画が必要でした。移行に取り組んだ方法は次のとおりです。
データ抽出: まず、ダウンタイムを最小限に抑えるために、 AWS DMS (データベース移行サービス) などのツールを使用して従来のデータベースからデータを抽出しました。
スキーマの適応: CockroachDB のスキーマは、地理的なパーティション分割をサポートするために適応する必要がありました。これには、データベース スキーマを変更してリージョン タグを含め、データベースが各データの保存場所を決定できるようにすることが含まれます。これらのタグにより、CockroachDB はデータを適切なリージョンにインテリジェントに送信し、パフォーマンスとコンプライアンスの両方を最適化できます。
データのロードと検証: スキーマを調整した後、バッチ挿入を使用してデータを CockroachDB にロードし、その後、データの整合性と正確性を確保するために徹底的な検証チェックを行いました。CockroachDB は大規模な並列書き込みを処理できるため、このプロセスははるかにスムーズになりました。
次のシリーズの記事では、これらのトピックのそれぞれについて詳しく説明し、実装の重要な詳細を追加します。
地域化の重要な部分はコンプライアンスです。複雑さに陥ることなくこれを管理した方法は次のとおりです。
コンプライアンス アズ コード: 当社が実装した最も効果的な手法の 1 つは、コンプライアンス アズ コードです。コンプライアンス ルールをインフラストラクチャ自動化スクリプトにコード化することで、データが地域の要件に沿って処理されることを自動的に確認できるようになりました。これにより、コンプライアンスが監査可能になり、さまざまな環境で繰り返し実行できるようになりました。
データ処理ポリシー: 地域に基づいてデータ フローを規定するポリシーを設計しました。たとえば、API リクエストが EU で発生した場合、結果として生じるデータの保存または処理は EU データ センターにルーティングされます。これらのポリシーはサービスの中核に組み込まれており、コンプライアンスが後付けではなく組み込まれています。
以下は、Terraform を使用してこれを実装した方法のサンプルです。
# Define regional compliance requirements locals { compliance_configs = { eu-west-1 = { data_retention_days = 90 encryption_enabled = true backup_retention = 35 log_retention = 365 data_classification = "gdpr_regulated" allowed_regions = ["eu-west-1", "eu-central-1"] } us-east-1 = { data_retention_days = 30 encryption_enabled = true backup_retention = 30 log_retention = 180 data_classification = "standard" allowed_regions = ["us-east-1", "us-west-2"] } } } # CockroachDB cluster configuration with compliance settings resource "cockroach_cluster" "regional_cluster" { name = "global-api-cluster" serverless = { routing_id = var.routing_id regions = [for region, config in local.compliance_configs : region] } sql_users = { admin = { password = var.admin_password } } # Compliance settings for each region dynamic "region_config" { for_each = local.compliance_configs content { region = region_config.key node_config = { machine_type = "n2-standard-4" disk_size_gb = 100 disk_type = "pd-ssd" encryption_at_rest = region_config.value.encryption_enabled } } } } # Compliance monitoring and alerting resource "cockroach_alert" "compliance_violation" { for_each = local.compliance_configs name = "compliance-violation-${each.key}" cluster_id = cockroach_cluster.regional_cluster.id conditions = { query = <<-EOT SELECT count(*) FROM system.audit_events WHERE "timestamp" > now() - INTERVAL '5 minutes' AND event_type = 'unauthorized_access' AND region = '${each.key}' EOT threshold = 0 } notification_channels = [var.security_notification_channel] }
グローバルなユーザーベースで作業する場合、コンプライアンスとレイテンシーのバランスを取ることは継続的な課題です。
地域 API とデータのローカリゼーションによりコンプライアンスは向上しますが、旅行中のユーザーや地理的に別のデータセンターに近いユーザーの場合は遅延が発生する可能性があります。
この課題に取り組むために、私たちは次のことを行います。
Twilio での地域化の取り組みは、同様の課題を乗り越えようとしている他の人々に役立ついくつかの貴重な洞察をもたらしました。
API とデータの地域化を進めるのは決して簡単ではありませんが、そのメリットは大きく、コンプライアンスの強化、レイテンシの短縮、ユーザーの信頼の向上などが得られます。シンプルなものから始め、マルチリージョン データベース、 DNS ベースのルーティング、コンプライアンス アズ コードなどのツールを活用し、実際の経験から学ぶことで、最小限の労力でシステムを効果的に地域化できます。
この記事が、Twilio での私の経験に基づいて、地域化を進めるための実用的かつ効果的な方法を明らかにすることを願っています。ご質問やご自身のご意見がありましたら、ぜひお聞かせください。会話を始めましょう。
どう思いますか?現在、地域化の課題に取り組んでいますか? コメントを残して、あなたの経験を共有してください。