When your API starts experiencing performance bottlenecks on shared hosting, the immediate solution often involves upgrading to a VPS. However, a more elegant approach exists: distributing traffic between both servers using multiple A records. This DNS-based load balancing technique can significantly improve response times while maintaining redundancy.
Multiple A records for the same domain create a simple load balancing mechanism called DNS Round Robin. When you configure:
example.com. 300 IN A 192.0.2.1 example.com. 300 IN A 203.0.113.2
DNS servers will alternate the order of these records in responses, effectively distributing requests between both IP addresses.
Here's how to configure this on popular DNS providers:
# Cloudflare API example (using curl) curl -X PATCH "https://api.cloudflare.com/client/v4/zones/ZONE_ID/dns_records" \ -H "Authorization: Bearer API_TOKEN" \ -H "Content-Type: application/json" \ --data '[ { "type": "A", "name": "api.example.com", "content": "192.0.2.1", "ttl": 300 }, { "type": "A", "name": "api.example.com", "content": "203.0.113.2", "ttl": 300 } ]'
Browsers typically use the first A record returned by DNS, but this behavior isn't guaranteed. Modern browsers may implement their own DNS caching and selection algorithms. For API clients, consider these factors:
- DNS TTL values (shorter TTLs allow faster failover but increase DNS queries)
- Client-side DNS caching behavior
- Health checks (basic DNS lacks built-in health monitoring)
For more sophisticated traffic management, consider these enhancements:
# Weighted DNS example (not universally supported) api.example.com. 300 IN A 192.0.2.1 api.example.com. 300 IN A 203.0.113.2 ; Weight annotation (implementation-specific) api.example.com. IN TXT "weight=192.0.2.1:70;203.0.113.2:30"
Implement a monitoring script to ensure both servers are responsive:
#!/bin/bash # Basic health check script servers=("192.0.2.1" "203.0.113.2") for server in "${servers[@]}"; do if ! curl -s --connect-timeout 2 "http://$server/health" | grep -q "healthy"; then # Trigger DNS update or alert echo "Server $server failed health check" | mail -s "API Server Down" admin@example.com fi done
When your API starts gaining traction, shared hosting often becomes the first performance bottleneck. The 503 errors you're seeing typically indicate resource exhaustion - your host is hitting its CPU/memory limits when processing concurrent requests.
Yes, you can absolutely set up multiple A records for the same domain. This technique is called DNS round robin, where DNS servers rotate through the list of IP addresses when resolving your domain.
example.com. IN A 192.0.2.1
example.com. IN A 203.0.113.2
When a client queries your DNS:
- The DNS server returns both IP addresses
- Most clients will use the first IP in the list
- Subsequent queries get the records rotated
DNS round robin has some limitations you should know:
// Example of checking DNS records programmatically (Node.js)
const dns = require('dns');
dns.resolve4('yourdomain.com', (err, addresses) => {
console.log(Available IPs: ${addresses});
});
For more sophisticated traffic distribution:
- Use a cloud load balancer (AWS ALB, NGINX, HAProxy)
- Implement geographic DNS (Route53, Cloudflare)
- Consider Anycast routing for global APIs
After implementation, monitor both servers:
# Sample monitoring script (Bash)
while true; do
curl -s -o /dev/null -w "%{http_code}" api.yourdomain.com
sleep 60
done