Ukratko

Najvažnije iz članka

  • Serverless arhitektura (npr. AWS Lambda) omogućuje developerima da se fokusiraju na kod, prepuštajući upravljanje infrastrukturom cloud provideru, uz automatsko skaliranje i plaćanje po izvršenju.
  • AWS Lambda funkcije su event-driven compute servis koji izvršava kod kao odgovor na događaje, dok Amazon SQS (Simple Queue Service) pruža pouzdane redove poruka za asinkronu komunikaciju i dekupliranje komponenti.
  • Kombinacija AWS Lamde i SQS-a omogućuje izgradnju skalabilnih, otpornih i cjenovno učinkovitih aplikacija, gdje proizvođači šalju poruke u SQS, a Lambda funkcije ih asinkrono obrađuju.
  • Ključne best practices uključuju konfiguriranje Dead Letter Queues (DLQ) za neuspjele poruke, dizajniranje idempotentnih funkcija, te pažljivo podešavanje Batch Size i Visibility Timeouta za optimalne performanse i otpornost.
Sadržaj članka
  1. Što je Serverless?
  2. AWS Lambda: Srce Serverless izvršavanja
  3. Amazon SQS: Redovi poruka za Asyncronu Komunikaciju
  4. Izgradnja Serverless Arhitekture s Lambda i SQS
  5. Praktični Primjeri Upotrebe
  6. Postavljanje Lamde i SQS-a (Korak po korak)
  7. Napredne Konfiguracije i Best Practices
  8. Zaključak

U današnjem svijetu brzih inovacija i sve većih zahtjeva korisnika, razvoj aplikacija mora biti agilan, skalabilan i isplativ. Tradicionalne arhitekture s fiksnim serverima često donose operativne kompleksnosti, visoke troškove i probleme sa skaliranjem. Ovdje na scenu stupa serverless arhitektura, paradigmatska promjena koja omogućuje developerima da se fokusiraju isključivo na pisanje koda, prepuštajući upravljanje infrastrukturom pružatelju clouda. Među najpopularnijim i najmoćnijim rješenjima u ovom području su AWS Lambda i Amazon Simple Queue Service (SQS). Ovaj tutorial će vas provesti kroz osnove serverless arhitekture, detaljno objasniti ulogu Lamda funkcija i SQS redova, te prikazati kako ih kombinirati za izgradnju robustnih i visoko dostupnih aplikacija.

Što je Serverless?

Serverless computing, unatoč imenu, ne znači da "servera nema". Umjesto toga, znači da se developer ne mora brinuti o provisioningu, skaliranju i održavanju servera. Cloud provider (npr. AWS, Azure, Google Cloud) dinamički dodjeljuje resurse za izvršavanje koda na zahtjev, naplaćujući samo stvarno iskorišteno vrijeme izvršavanja. Ključne karakteristike serverless arhitekture uključuju:

  • Bez upravljanja serverima: Nema potrebe za patchiranjem, ažuriranjem OS-a ili skaliranjem hardvera.
  • Automatsko skaliranje: Cloud provider automatski skalira resurse prema opterećenju.
  • Plaćanje po upotrebi (Pay-per-execution): Troškovi su direktno proporcionalni stvarnoj potrošnji, što može dovesti do značajnih ušteda.
  • Visoka dostupnost: Ugrađena otpornost na padove i distribuirano izvršavanje.

AWS Lambda: Srce Serverless izvršavanja

AWS Lambda je compute servis koji omogućuje izvršavanje koda bez provisioninga ili upravljanja serverima. Kada koristite Lambda, uploadate svoj kod, a Lambda se brine za sve ostalo potrebno za njegovo pokretanje i skaliranje. Funkcije se pokreću kao odgovor na događaje (eng. events) – to mogu biti HTTP zahtjevi putem API Gatewaya, promjene u podacima unutar S3 bucket-a, streamovi podataka iz Kinesisa, ili, kako ćemo vidjeti, poruke iz SQS reda.

Ključne značajke AWS Lamde:

  • Event-driven (Događajno vođena): Funkcije se aktiviraju događajima.
  • Podržani jezici: Podržava širok spektar programskih jezika (Node.js, Python, Java, C#, Go, Ruby, PowerShell).
  • Konfigurabilno izvršavanje: Možete definirati memoriju, timeout i varijable okruženja.
  • Integracija s ostalim AWS servisima: Neometana integracija s preko 200 AWS servisa.
# Primjer Python Lambda funkcije
import json

def lambda_handler(event, context):
    print("Primljeni događaj:", json.dumps(event))
    # Ovdje bi se nalazila logika obrade poruke
    message_body = event['Records'][0]['body']
    print("Sadržaj poruke:", message_body)

    # Simbolična obrada podataka
    processed_data = f"Obrađena poruka: {message_body.upper()}"

    return {
        'statusCode': 200,
        'body': json.dumps({'message': 'Poruka uspješno obrađena', 'result': processed_data})
    }

Amazon SQS: Redovi poruka za Asyncronu Komunikaciju

Amazon SQS (Simple Queue Service) je potpuno upravljana usluga redova poruka koja omogućuje odvajanje komponenti distribuiranog sustava i njihovu asinkronu komunikaciju. SQS eliminira kompleksnost povezanu s upravljanjem vlastitim redovima poruka, osiguravajući visoku dostupnost i skalabilnost. Umjesto da komponente međusobno komuniciraju direktno (što može dovesti do zagušenja i pogrešaka ako jedna komponenta padne), one šalju i primaju poruke putem SQS reda.

Zašto koristiti SQS?

  • Dekupliranje (Decoupling): Komponente sustava rade neovisno, smanjujući ovisnosti.
  • Skalabilnost: SQS se automatski skalira kako bi podržao bilo koji volumen poruka.
  • Otpornost na pogreške: Poruke se pohranjuju dok ih potrošač ne obradi uspješno, minimizirajući gubitak podataka.
  • Pouzdana isporuka: Poruke se isporučuju barem jednom, a FIFO redovi osiguravaju točan redoslijed.

Postoje dvije vrste SQS redova:

  1. Standard Queues: Nude maksimalnu propusnost, osiguravaju "at-least-once" isporuku i mogu isporučiti poruke izvan redoslijeda (best-effort ordering).
  2. FIFO (First-In, First-Out) Queues: Garantiraju da se poruke obrađuju točno jednom, točnim redoslijedom u kojem su poslane. Idealni su za scenarije gdje je redoslijed poruka kritičan, kao što su transakcijske obrade.

Izgradnja Serverless Arhitekture s Lambda i SQS

Kombinacija AWS Lamde i SQS-a je moćan uzorak za izgradnju asinkronih, otpornih i skalabilnih aplikacija. Uobičajeni scenarij je da jedna komponenta (proizvođač) generira poruke i šalje ih u SQS red, dok druga komponenta (potrošač), u ovom slučaju Lambda funkcija, preuzima i obrađuje te poruke. Evo kako to funkcionira:

  1. Proizvođač šalje poruke u SQS: Bilo koja aplikacija ili servis (npr. web server, druga Lambda funkcija, IoT uređaj) šalje poruke u konfigurirani SQS red. Te poruke mogu sadržavati podatke o korisničkim akcijama, logovima, rezultatima proračuna itd.
  2. SQS pohranjuje poruke: SQS jamči pohranu poruka dok ih potrošač ne preuzme i obradi.
  3. Lambda funkcija kao potrošač: Konfiguriramo Lambda funkciju da bude trigger (okidač) za SQS red. Kada se poruka pojavi u redu, Lambda automatski pokreće instancu funkcije kako bi je obradila.
  4. Obrada poruke: Lambda funkcija preuzima poruku iz reda, izvodi potrebnu logiku (npr. upis u bazu podataka, slanje obavijesti, pokretanje drugog servisa).
  5. Potvrda obrade: Nakon uspješne obrade, Lambda funkcija automatski signalizira SQS-u da obriše poruku iz reda. Ako se obrada ne uspije, poruka se vraća u red (ovisno o konfiguraciji) ili preusmjerava u Dead Letter Queue (DLQ) za daljnju analizu.

Praktični Primjeri Upotrebe

  • Asinkrona obrada slika/videa: Korisnik upload-a sliku na S3. S3 event šalje poruku u SQS red. Lambda funkcija čita poruku, preuzima sliku sa S3, obrađuje je (npr. mijenja veličinu, dodaje vodeni žig) i sprema novu verziju natrag na S3.
  • Obrada narudžbi u e-commerceu: Kada kupac izvrši narudžbu, detalji narudžbe se šalju u SQS. Lambda funkcija zatim asinkrono obrađuje narudžbu: ažurira inventar, šalje potvrdu kupcu, obavještava odjel dostave, bez blokiranja korisničkog sučelja.
  • Analiza logova: Aplikacije šalju logove u SQS. Lambda funkcija preuzima logove, parsira ih, filtrira i pohranjuje u bazu podataka (npr. DynamoDB) ili sustav za analizu (npr. Elasticsearch).
  • Planirani zadaci i dugačke obrade: Umjesto da se dugačke operacije izvršavaju unutar HTTP zahtjeva (što može dovesti do timeouta), one se mogu delegirati Lambda funkcijama putem SQS-a, osiguravajući da se zadatak izvrši bez obzira na trajanje.

Postavljanje Lamde i SQS-a (Korak po korak)

1. Kreiranje SQS reda

  • Prijavite se na AWS konzolu.
  • Idite na SQS servis.
  • Kliknite na Create queue.
  • Odaberite Standard ili FIFO (za ovaj tutorial koristimo Standard).
  • Dajte redu ime, npr. MyProcessingQueue.
  • Ostavite ostale postavke kao zadane ili ih prilagodite po potrebi (npr. Visibility timeout, Message retention period). Visibility timeout je ključan: definira koliko dugo poruka ostaje nevidljiva drugim potrošačima nakon što je preuzeta. Omogućuje Lamdi da je obradi unutar tog vremena.
  • Kliknite Create queue.

2. Kreiranje Lambda funkcije

  • Idite na Lambda servis.
  • Kliknite na Create function.
  • Odaberite Author from scratch.
  • Dajte funkciji ime, npr. MySQSProcessorFunction.
  • Odaberite Runtime (npr. Python 3.9).
  • Za Execution role, odaberite Create a new role with basic Lambda permissions. Kasnije ćemo dodati SQS dopuštenja.
  • Kliknite Create function.

3. Konfiguriranje Lambda triggera (Okidača)

  • Nakon kreiranja, na stranici vaše Lambda funkcije, ispod dijagrama, kliknite na Add trigger.
  • Pretražite i odaberite SQS.
  • Za SQS queue, odaberite red koji ste prethodno kreirali (MyProcessingQueue).
  • Za Batch size, postavite koliko poruka Lambda treba preuzeti u jednom batchu (npr. 10). To utječe na troškove i performanse.
  • Kliknite Add.

4. Dodavanje SQS dopuštenja Lambda roli

  • Idite na Configuration tab vaše Lambda funkcije, zatim na Permissions.
  • Kliknite na Role name (IAM rolu koja je kreirana, npr. MySQSProcessorFunction-role-...).
  • U IAM konzoli, kliknite na Add permissions -> Attach policies.
  • Potražite AmazonSQSFullAccess ili, bolje, kreirajte custom polisu s minimalnim potrebnim dopuštenjima (npr. sqs:ReceiveMessage, sqs:DeleteMessage, sqs:GetQueueAttributes). Za ovaj tutorial, možete koristiti AmazonSQSFullAccess radi jednostavnosti.
  • Kliknite Attach policies.

5. Pisanje koda Lambda funkcije

  • Vratite se na Lambda funkciju i idite na Code tab.

  • Zamijenite zadani kod s primjerom Python koda koji smo ranije naveli ili napišite svoj:

    import json
    
    def lambda_handler(event, context):
        for record in event['Records']:
            message_body = record['body']
            print(f"Obradba poruke iz SQS-a: {message_body}")
            # Ovdje dolazi vaša poslovna logika
            try:
                # Simulacija uspješne obrade
                processed_data = f"Podaci obradeni: {message_body.upper()}"
                print(f"Uspješno obradjeno: {processed_data}")
                # Lambda automatski briše poruku ako funkcija završi bez greške
            except Exception as e:
                print(f"Greška pri obradi poruke: {e}")
                # Ako dođe do greške, poruka se vraća u red (ovisno o Visibility Timeout)
                # ili preusmjerava u DLQ ako je konfiguriran
                raise e # Ponovno bacanje iznimke kako bi SQS znao da obrada nije uspjela
        return {
            'statusCode': 200,
            'body': json.dumps('Sve poruke uspješno obrađene')
        }
    
  • Kliknite Deploy.

6. Testiranje

  • Idite na SQS red (MyProcessingQueue).
  • Kliknite na Send and receive messages.
  • U polje Message body unesite neku testnu poruku, npr. {"action": "process_data", "id": "123"}.
  • Kliknite Send message.
  • Vratite se na Lambda funkciju, idite na Monitor tab i kliknite na View logs in CloudWatch. Trebali biste vidjeti logove iz vaše Lambda funkcije koji pokazuju da je poruka uspješno obrađena.

Napredne Konfiguracije i Best Practices

  • Dead Letter Queues (DLQ): Izuzetno je važno konfigurirati DLQ za SQS redove i Lambda funkcije. DLQ je zaseban red u koji se preusmjeravaju poruke koje se nisu mogle uspješno obraditi nakon određenog broja pokušaja. To sprječava zaglavljivanje sustava i omogućuje vam da pregledate i analizirate neuspjele poruke. Za SQS, DLQ se konfigurira na samom redu, a za Lambda, na Asynchronous invocation settings.
  • Idempotencija: Dizajnirajte Lambda funkcije tako da budu idempotentne. To znači da ponovno izvršavanje iste poruke više puta neće imati neželjene nuspojave. Budući da SQS jamči "at-least-once" isporuku, moguće je da Lambda obradi istu poruku više puta. To se može postići korištenjem jedinstvenih ID-ova poruka i provjerom statusa prije obrade.
  • Batch Size: Eksperimentirajte s veličinom batcha (Batch size) za Lambda SQS trigger. Veći batch može smanjiti broj poziva Lamde i troškove, ali može i povećati latency ako jedna poruka u batchu uzrokuje grešku.
  • Visibility Timeout: Pravilno podesite Visibility timeout na SQS redu. Trebao bi biti dovoljno dug da Lambda funkcija uspije obraditi batch poruka. Ako timeout istekne prije nego što Lambda završi, SQS će poruke ponovno učiniti vidljivima za druge potrošače.
  • Konkurentnost (Concurrency): Podrazumijevano, Lambda ima visoku konkurentnost. Za SQS triggere, Lambda skalira do 1000 istovremenih instanci po redu. Ako je potrebno, možete ograničiti konkurentnost za pojedinu funkciju kako biste izbjegli preopterećenje downstream servisa (npr. baze podataka).
  • Error Handling: Implementirajte robustno rukovanje greškama unutar Lambda funkcije. Iskoristite try-except blokove i razmislite o slanju metrika u CloudWatch za praćenje grešaka.

Zaključak

Serverless arhitektura s AWS Lambda i SQS-om predstavlja moćno rješenje za izgradnju modernih, skalabilnih i otpornih aplikacija. Kombinirajući event-driven model Lamde s pouzdanim asinkronim redovima poruka SQS-a, developeri mogu stvoriti sustave koji su visoko dekuplirani, lako održivi i cjenovno učinkoviti. Razumijevanje i primjena principa kao što su DLQ, idempotencija i pravilna konfiguracija batcha ključni su za izgradnju robusnih produkcijskih sustava. Kroz ovaj tutorial, trebali ste steći solidno razumijevanje kako započeti s ovim fundamentalnim AWS serverless servisima i kako ih iskoristiti za transformaciju vaših aplikacijskih arhitektura. Sretno kodiranje!

Izvori i dodatno čitanje

  1. AWS Lambda - Official Documentation
  2. Amazon SQS - Official Documentation
  3. Serverless Architectures on AWS
  4. AWS Cloud Best Practices - Decoupling and Asynchronous Processing
B
Uredništvo portala

BAJT

Službeni autorski profil redakcije portala BAJT. Sadržaj priprema i provjerava uredništvo portala.