Serverless Architecture ile Backend Geliştirme

Teknoloji 📖 3 dk okuma
#web#javascript#kariyer

Serverless architecture, infrastructure yönetimi olmadan backend geliştirme sunar.

Serverless Nedir?

Server yönetmeden kod çalıştırma:

  • Pay-per-execution
  • Auto-scaling
  • Zero maintenance
  • Event-driven

AWS Lambda Example

// Lambda function
exports.handler = async (event) => {
  const { name } = JSON.parse(event.body);
  
  const response = {
    statusCode: 200,
    headers: {
      'Content-Type': 'application/json',
      'Access-Control-Allow-Origin': '*'
    },
    body: JSON.stringify({
      message: `Hello ${name}!`,
      timestamp: new Date().toISOString()
    })
  };
  
  return response;
};

Cloudflare Workers

// Worker script
addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request));
});

async function handleRequest(request) {
  const url = new URL(request.url);
  
  // Edge caching
  const cache = caches.default;
  let response = await cache.match(request);
  
  if (!response) {
    response = await fetch(request);
    
    // Cache for 1 hour
    const headers = new Headers(response.headers);
    headers.set('Cache-Control', 'public, max-age=3600');
    
    response = new Response(response.body, {
      status: response.status,
      headers
    });
    
    event.waitUntil(cache.put(request, response.clone()));
  }
  
  return response;
}

Vercel Edge Functions

// api/hello.js
export const config = {
  runtime: 'edge',
};

export default async function handler(request) {
  const { searchParams } = new URL(request.url);
  const name = searchParams.get('name') || 'World';
  
  return new Response(
    JSON.stringify({ message: `Hello ${name}!` }),
    {
      headers: { 'Content-Type': 'application/json' }
    }
  );
}

Database - Serverless

Supabase (PostgreSQL)

import { createClient } from '@supabase/supabase-js';

const supabase = createClient(
  process.env.SUPABASE_URL,
  process.env.SUPABASE_KEY
);

// Query
const { data, error } = await supabase
  .from('users')
  .select('*')
  .eq('status', 'active');

Planetscale (MySQL)

import { connect } from '@planetscale/database';

const conn = connect({
  url: process.env.DATABASE_URL
});

const results = await conn.execute(
  'SELECT * FROM users WHERE id = ?',
  [userId]
);

File Storage - S3

import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3';

const s3 = new S3Client({ region: 'us-east-1' });

async function uploadFile(file) {
  const command = new PutObjectCommand({
    Bucket: 'my-bucket',
    Key: file.name,
    Body: file.buffer,
    ContentType: file.mimetype
  });
  
  await s3.send(command);
  return `https://my-bucket.s3.amazonaws.com/${file.name}`;
}

Event-Driven Architecture

// SQS Queue trigger
exports.handler = async (event) => {
  for (const record of event.Records) {
    const message = JSON.parse(record.body);
    
    // Process message
    await processOrder(message);
  }
};

// S3 upload trigger
exports.handler = async (event) => {
  for (const record of event.Records) {
    const bucket = record.s3.bucket.name;
    const key = record.s3.object.key;
    
    // Process uploaded file
    await processImage(bucket, key);
  }
};

Cold Start Optimization

// Keep function warm
let cachedDb = null;

async function getDbConnection() {
  if (cachedDb) return cachedDb;
  
  cachedDb = await connectToDatabase();
  return cachedDb;
}

exports.handler = async (event) => {
  const db = await getDbConnection();
  // Use cached connection
};

Cost Optimization

AWS Lambda Pricing:

  • First 1M requests: FREE
  • $0.20 per 1M requests
  • $0.00001667 per GB-second

Example:

  • 10M requests/month
  • 512 MB memory
  • 200ms duration
  • Cost: ~$18/month

Serverless ile scale edin, maliyet düşürün!