API Performance - Nexa Documentation

API Performance

Optimasi Performa

Performa API adalah faktor kritis dalam pengembangan aplikasi modern. Dokumentasi ini mencakup strategi dan praktik terbaik untuk mengoptimalkan performa API Anda.

Caching

Response Caching

class CacheMiddleware {
    public function handle($request) {
        $key = $this->getCacheKey($request);
        
        if ($cached = $this->cache->get($key)) {
            return $cached;
        }

        $response = $this->processRequest($request);
        $this->cache->set($key, $response, 3600);
        
        return $response;
    }
}

Cache Headers

header('Cache-Control: public, max-age=3600');
header('ETag: "' . md5($content) . '"');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $lastModified) . ' GMT');

Database Optimization

Query Optimization

// Gunakan index
CREATE INDEX idx_user_email ON users(email);

// Pilih kolom spesifik
SELECT id, name, email FROM users WHERE status = 'active';

// Gunakan joins yang efisien
SELECT u.*, p.* 
FROM users u 
INNER JOIN profiles p ON u.id = p.user_id 
WHERE u.status = 'active';

Response Optimization

Pagination

class PaginatedResponse {
    public function paginate($query, $page = 1, $perPage = 10) {
        $total = $query->count();
        $items = $query->offset(($page - 1) * $perPage)
                      ->limit($perPage)
                      ->get();

        return [
            'data' => $items,
            'pagination' => [
                'total' => $total,
                'per_page' => $perPage,
                'current_page' => $page,
                'last_page' => ceil($total / $perPage)
            ]
        ];
    }
}

Data Filtering

class DataFilter {
    public function filter($data, $fields) {
        return array_intersect_key($data, array_flip($fields));
    }
}

Compression

// Enable GZIP compression
if (extension_loaded('zlib')) {
    ini_set('zlib.output_compression', 'On');
    ini_set('zlib.output_compression_level', '5');
}

Load Balancing

upstream api_servers {
    server api1.example.com:80;
    server api2.example.com:80;
    server api3.example.com:80;
}

server {
    listen 80;
    server_name api.example.com;

    location / {
        proxy_pass http://api_servers;
    }
}

Best Practices

  • Implementasikan caching di berbagai level
  • Optimalkan query database
  • Gunakan pagination untuk data besar
  • Aktifkan kompresi response
  • Implementasikan load balancing
  • Monitor performa secara regular
  • Gunakan CDN untuk aset statis
  • Optimalkan payload response
  • Implementasikan connection pooling
  • Gunakan asynchronous processing untuk task berat

Monitoring

class PerformanceMonitor {
    public function logMetrics($request, $response, $startTime) {
        $endTime = microtime(true);
        $duration = $endTime - $startTime;
        
        $metrics = [
            'endpoint' => $request->getPath(),
            'method' => $request->getMethod(),
            'duration' => $duration,
            'memory' => memory_get_peak_usage(true),
            'timestamp' => time()
        ];
        
        $this->logger->log('performance', $metrics);
    }
}

Profiling Tools

  • New Relic - Monitoring dan profiling lengkap
  • Xdebug - PHP profiling dan debugging
  • Apache Benchmark (ab) - Load testing
  • JMeter - Performance testing
  • Prometheus - Metrics collection
  • Grafana - Metrics visualization