Search code examples
load-balancingregionoracle-cloud-infrastructure

How to send data to corresponding region's instance server?


Let's say I have three regions(eu,us,asia) that host the same app on the respective instance. I will register only one domain name for those same apps.

When a user requests from eu , I like to send data to eu region app server and vice versa.

Eg: user -> request -> example.com (from eu) -> send data to eu app

Eg: user -> request -> example.com (from us) -> send data to us app

Eg: user -> request -> example.com (from asia) -> send data to asia app

Can I set up like that by Load Balancer or something else?


Solution

  • Yes, you can do this with OCI DNS and traffic management via geolocation traffic steering policies. The steering policy should filter or prioritize DNS answers based on a query's continent geokey.

    Example of a POST /steeringPolicies request body using the ROUTE_BY_GEO template:

    {
      "compartmentId": "ocid1...",
      "displayName": "Geolocations mapped to answer pools",
      "ttl": 30,
      "healthCheckMonitorId": "ocid1...",
      "template": "ROUTE_BY_GEO",
      "answers": [
        {
          "name": "US Server 1",
          "rtype": "A",
          "rdata": "192.168.0.2",
          "pool": "US"
        },
        {
          "name": "US Server 2",
          "rtype": "A",
          "rdata": "192.168.0.3",
          "pool": "US"
        },
        {
          "name": "EU Server 1",
          "rtype": "A",
          "rdata": "192.168.0.4",
          "pool": "EU"
        },
        {
          "name": "EU Server 2",
          "rtype": "A",
          "rdata": "192.168.0.5",
          "pool": "EU"
        },
        {
          "name": "rest of world 1",
          "rtype": "A",
          "rdata": "203.0.113.2",
          "pool": "Global"
        },
        {
          "name": "rest of world 2",
          "rtype": "A",
          "rdata": "203.0.113.3",
          "pool": "Global"
        }
      ],
      "rules": [
        {
          "ruleType": "FILTER",
          "defaultAnswerData": [
            {
              "answerCondition": "answer.isDisabled != true",
              "shouldKeep": true
            }
          ]
        },
        {
          "ruleType": "HEALTH"
        },
        {
          "ruleType": "PRIORITY",
          "cases": [
            {
              "caseCondition": "query.client.geoKey in (geoKey '6255149')",
              "answerData": [
                {
                  "answerCondition": "answer.pool == 'US'",
                  "value": 1
                },
                {
                  "answerCondition": "answer.pool == 'EU'",
                  "value": 2
                },
                {
                  "answerCondition": "answer.pool == 'Global'",
                  "value": 3
                }
              ]
            },
            {
              "caseCondition": "query.client.geokey in (geokey '6255148')",
              "answerData": [
                {
                  "answerCondition": "answer.pool == 'EU'",
                  "value": 1
                },
                {
                  "answerCondition": "answer.pool == 'US'",
                  "value": 2
                },
                {
                  "answerCondition": "answer.pool == 'Global'",
                  "value": 3
                }
              ]
            },
            {
              "answerData": [
                {
                  "answerCondition": "answer.pool == 'Global'",
                  "value": 1
                },
                {
                  "answerCondition": "answer.pool == 'US'",
                  "value": 2
                },
                {
                  "answerCondition": "answer.pool == 'EU'",
                  "value": 3
                }
              ]
            }
          ]
        },
        {
          "ruleType": "LIMIT",
          "defaultCount": 1
        }
      ]
    }
    

    -- Traffic Management Steering Policies API Guide, Create Steering Policies Using Templates