# Wybrane technologie Serverless: Rekomendacje praktycznych narzędzi do budowy wydajnych i skalowalnych aplikacji
Architektura Serverless staje się coraz bardziej popularna, znacznie upraszcza wdrażanie i utrzymanie aplikacji, pozwalając programistom skupić się na implementacji logiki biznesowej. Jednak, aby w pełni wykorzystać zalety Serverless, wybór odpowiedniego stosu technologicznego jest kluczowy. W tym artykule, opierając się na dyskusjach na X/Twitterze, polecimy kilka praktycznych narzędzi i zasobów Serverless oraz przedstawimy kilka praktycznych wskazówek dotyczących budowy wydajnych i skalowalnych aplikacji.
## Kluczowe zalety Serverless
Zanim przejdziemy do konkretnych narzędzi, najpierw przypomnijmy sobie kluczowe zalety Serverless:
* **Brak konieczności zarządzania serwerami:** Nie ma potrzeby ręcznej konfiguracji i konserwacji serwerów, co obniża koszty operacyjne.
* **Automatyczne skalowanie:** Platforma automatycznie dostosowuje zasoby w zależności od rzeczywistego ruchu, zapewniając stabilne działanie aplikacji przy dużym obciążeniu.
* **Płatność za użycie:** Płacisz tylko za faktycznie wykorzystane zasoby obliczeniowe, unikając marnowania zasobów.
* **Szybkie wdrażanie:** Uproszczony proces wdrażania aplikacji, co zwiększa efektywność programowania.
## Narzędzia Infrastructure as Code (IaC)
Mimo że Serverless podkreśla brak konieczności zarządzania serwerami, konfiguracja infrastruktury jest nadal ważna. Użycie narzędzi IaC może zautomatyzować wdrażanie i zarządzanie infrastrukturą, zapewniając spójność i powtarzalność.
* **AWS CloudFormation / AWS CDK:** Natywne narzędzia IaC dostarczane przez AWS. CloudFormation używa YAML lub JSON do definiowania infrastruktury, a AWS CDK pozwala na definiowanie zasobów chmurowych za pomocą znanych języków programowania (takich jak TypeScript, Python, Java itp.).
* **Praktyczne wskazówki:** Użyj CloudFormation StackSets, aby wdrożyć zasoby w wielu regionach i kontach. Zaawansowane warstwy abstrakcji CDK mogą uprościć konfigurację złożonych zasobów, takich jak budowa potoków CI/CD.
* **Terraform:** Narzędzie IaC o otwartym kodzie źródłowym, które obsługuje wiele platform chmurowych, w tym AWS, Azure i Google Cloud.
* **Praktyczne wskazówki:** Użyj modułowej funkcjonalności Terraform, aby podzielić definicję infrastruktury na komponenty wielokrotnego użytku. Wykorzystaj plik stanu Terraform do zarządzania stanem, aby zapewnić spójność konfiguracji.
* **Serverless Framework:** Narzędzie IaC zaprojektowane specjalnie dla aplikacji Serverless, obsługuje wiele platform chmurowych i upraszcza wdrażanie i zarządzanie aplikacjami Serverless.
* **Praktyczne wskazówki:** Wykorzystaj mechanizm wtyczek Serverless Framework, aby rozszerzyć jego funkcjonalność, na przykład dodawanie niestandardowych domen, konfigurowanie uwierzytelniania API itp.
## Platformy obliczeniowe
Platforma obliczeniowa jest rdzeniem architektury Serverless, służącym do wykonywania logiki biznesowej aplikacji.
* **AWS Lambda:** Usługa obliczeniowa funkcji dostarczana przez AWS, obsługuje wiele języków programowania, takich jak Python, Node.js, Java, Go, C# itp.
* **Praktyczne wskazówki:** Użyj Lambda Layers, aby udostępniać wspólny kod i zmniejszyć rozmiar pakietu funkcji. Wykorzystaj Lambda Extensions, aby dodać funkcje monitorowania, bezpieczeństwa itp. Zwróć uwagę na problem zimnego startu Lambda, możesz użyć Provisioned Concurrency, aby wcześniej podgrzać funkcje.
```python
# Przykładowa funkcja Python Lambda
import json
def lambda_handler(event, context):
body = {
"message": "Hello from Lambda!"
}
response = {
"statusCode": 200,
"body": json.dumps(body)
}
```## Platformy obliczeniowe Serverless
* **AWS Lambda:** Usługa obliczeniowa oferowana przez Amazon Web Services (AWS), która pozwala na uruchamianie kodu bez konieczności zarządzania serwerami. Obsługuje wiele języków programowania, takich jak Node.js, Python, Java, Go, C# i Ruby.
* **Praktyczne wskazówki:** Używaj zmiennych środowiskowych do przechowywania konfiguracji. Używaj warstw Lambda do współdzielenia kodu między funkcjami. Monitoruj wydajność funkcji za pomocą AWS CloudWatch.
```python
import json
def lambda_handler(event, context):
# TODO Implementuj
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
```
* **Vercel:** Platforma Serverless skupiona na frontendzie, która oferuje szybkie wdrażanie i CDN. Jest szczególnie popularna wśród programistów React, Vue i Next.js. Jak wspomniał @@rauchg, Vercel jest zoptymalizowany pod kątem szybkiego wdrażania i globalnej sieci CDN.
* **Praktyczne wskazówki:** Używaj Vercel do wdrażania aplikacji frontendowych i statycznych stron. Wykorzystaj funkcje Serverless Vercel do obsługi backendu.
```javascript
export default function handler(req, res) {
res.status(200).json({ text: 'Hello' })
}
```
* **Netlify:** Podobnie jak Vercel, Netlify to platforma Serverless skupiona na frontendzie, która oferuje automatyczne wdrażanie i CDN.
* **Praktyczne wskazówki:** Używaj Netlify do wdrażania aplikacji frontendowych i statycznych stron. Wykorzystaj funkcje Netlify do obsługi backendu.
```javascript
exports.handler = async (event, context) => {
return {
statusCode: 200,
body: JSON.stringify({ message: 'Hello World' })
}
}
```
* **Cloudflare Workers:** Platforma Serverless oferowana przez Cloudflare, która pozwala na uruchamianie kodu na krawędzi sieci CDN. Jest to idealne rozwiązanie do obsługi żądań HTTP i modyfikowania odpowiedzi.
* **Praktyczne wskazówki:** Używaj Cloudflare Workers do obsługi żądań HTTP i modyfikowania odpowiedzi. Wykorzystaj Cloudflare Workers KV do przechowywania danych.
```javascript
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
async function handleRequest(request) {
return new Response('Hello worker!', {
headers: { 'content-type': 'text/plain' },
})
}
```
* **Supabase Edge Functions:** Jak wspomniał @@supabase, Supabase Edge Functions pozwalają na uruchamianie kodu TypeScript na krawędzi sieci, co zapewnia niskie opóźnienia i wysoką wydajność.
* **Praktyczne wskazówki:** Używaj Supabase Edge Functions do obsługi żądań HTTP i modyfikowania odpowiedzi. Wykorzystaj Supabase Postgres do przechowywania danych.
```typescript
import { serve } from 'https://deno.land/std@0.168.0/http/server.ts'
serve(async (req) => {
const url = new URL(req.url)
const name = url.searchParams.get('name')
const message = name ? `Hello ${name}!` : 'Hello, World!'
return new Response(
`
Przykładowa funkcja Edge!
${message}
`,
{ headers: { 'Content-Type': 'text/html; charset=utf-8' } }
)
})
```
* **Deno:** Jak wspomniał @@lino_levan, Deno to środowisko uruchomieniowe JavaScript i TypeScript, które jest bezpieczne i wydajne. Deno obsługuje Serverless Functions, co pozwala na uruchamianie kodu Deno na platformach Serverless.
* **Praktyczne wskazówki:** Używaj Deno do pisania funkcji Serverless. Wykorzystaj Deno Deploy do wdrażania funkcji Serverless.
```javascript
import { serve } from "https://deno.land/std@0.131.0/http/server.ts";
serve((req) => {
const url = new URL(req.url);
const name = url.searchParams.get("name");
const resp = `Hello ${name ?? "World"}!\n`;
return new Response(resp);
}, { port: 8000 });
```
* **Fastly Compute@Edge:** Platforma Serverless oferowana przez Fastly, która pozwala na uruchamianie kodu na krawędzi sieci CDN. Jest to idealne rozwiązanie do obsługi żądań HTTP i modyfikowania odpowiedzi.
* **Praktyczne wskazówki:** Używaj Fastly Compute@Edge do obsługi żądań HTTP i modyfikowania odpowiedzi. Wykorzystaj Fastly KV Store do przechowywania danych.
```javascript
///
import { createResponse } from '@fastly/js-compute';
addEventListener('fetch', event => event.respondWith(handleRequest(event)))
async function handleRequest(event) {
// Get the client request.
let req = event.request;
// Construct a new Response object.
let resp = new Response("Hello, world!", {
status: 200,
headers: { "Content-Type": "text/plain" }
});
// Send the new response back to the client.
return resp;
}
```
* **Fly.io:** Platforma, która pozwala na uruchamianie aplikacji blisko użytkowników na całym świecie. Obsługuje wiele języków programowania i frameworków.
* **Praktyczne wskazówki:** Używaj Fly.io do wdrażania aplikacji, które wymagają niskich opóźnień. Wykorzystaj Fly.io Volumes do przechowywania danych.
```python
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
return "
Hello, World!
"
```
* **OpenFaaS:** Framework open source do budowania funkcji Serverless na Kubernetes. Pozwala na uruchamianie funkcji w kontenerach Docker.
* **Praktyczne wskazówki:** Używaj OpenFaaS do budowania funkcji Serverless na Kubernetes. Wykorzystaj OpenFaaS CLI do zarządzania funkcjami.
```python
from flask import Flask, request
import os
app = Flask(__name__)
@app.route("/", methods=["POST"])
def handle():
request_json = request.get_json(silent=True)
if request_json and "name" in request_json:
name = request_json["name"]
else:
name = "World"
return f"Hello {name}!"
if __name__ == "__main__":
app.run(debug=True, host='0.0.0.0', port=int(os.environ.get('PORT', 8080)))
```
* **Kubeless:** Framework open source do budowania funkcji Serverless na Kubernetes. Podobnie jak OpenFaaS, pozwala na uruchamianie funkcji w kontenerach Docker.
* **Praktyczne wskazówki:** Używaj Kubeless do budowania funkcji Serverless na Kubernetes. Wykorzystaj Kubeless CLI do zarządzania funkcjami.
```python
def handler(event, context):
return "Hello World"
```
* **Fn Project:** Platforma open source do budowania funkcji Serverless, która obsługuje wiele języków programowania.
* **Praktyczne wskazówki:** Używaj Fn Project do budowania funkcji Serverless. Wykorzystaj Fn CLI do zarządzania funkcjami.
```python
from fdk import response
import json
def handler(ctx, data=None, loop=None):
name = "World"
try:
body = json.loads(data.decode('utf-8'))
name = body.get("name")
except (Exception, ValueError) as ex:
print(str(ex))
return response.Response(ctx, response_data=json.dumps(
{"message": "Hello {0}!".format(name)}),
headers={"Content-Type": "application/json"}
)
```
* **Google Cloud Functions:** Usługa obliczeniowa oferowana przez Google Cloud, podobna do AWS Lambda.
* **Praktyczne wskazówki:** Google Cloud Functions domyślnie integruje się z Cloud Logging i Cloud Monitoring, co ułatwia rejestrowanie logów i monitorowanie wydajności.
* **Azure Functions:** Usługa obliczeniowa oferowana przez Microsoft Azure, która również obsługuje wiele języków programowania.
* **Praktyczne wskazówki:** Azure Functions obsługuje wiele wyzwalaczy, takich jak HTTP, Queue, Timer itp., co pozwala na zaspokojenie potrzeb różnych scenariuszy.
* **Deno Deploy:** Platforma Serverless oferowana przez twórców środowiska uruchomieniowego Deno, charakteryzująca się wysokim poziomem bezpieczeństwa i wydajności. Jak wspomniał @@deno_land, Deno Deploy oferuje natychmiastową bazę danych serverless Postgres, którą można zintegrować z Prisma.
* **Praktyczne wskazówki:** Deno Deploy jest odpowiedni do budowania aplikacji o wysokich wymaganiach dotyczących wydajności i bezpieczeństwa.
## Przechowywanie danych
Aplikacje Serverless zazwyczaj wymagają użycia baz danych NoSQL do przechowywania danych.
* **Amazon DynamoDB:** Usługa bazy danych NoSQL oferowana przez AWS, charakteryzująca się wysoką dostępnością, wydajnością i automatycznym skalowaniem. Jak wspomniał @@Sanchit0496, Lambda i DynamoDB to popularne połączenie do budowania aplikacji Serverless.
* **Praktyczne wskazówki:** Wybierz odpowiednią strategię indeksowania w zależności od scenariusza biznesowego. Używaj DynamoDB Accelerator (DAX) do buforowania danych, aby poprawić wydajność odczytu.
* **Google Cloud Datastore:** Usługa bazy danych NoSQL oferowana przez Google Cloud.
* **Praktyczne wskazówki:** Google Cloud Datastore ma potężne możliwości przetwarzania transakcji, odpowiednie dla aplikacji wymagających transakcji ACID.
* **Azure Cosmos DB:** Globalnie rozproszona usługa bazy danych wielomodelowej oferowana przez Microsoft Azure.
* **Praktyczne wskazówki:** Azure Cosmos DB obsługuje wiele interfejsów API, takich jak SQL, MongoDB, Cassandra itp., co ułatwia migrację istniejących aplikacji.
* **Turso Cloud:** Jak wspomniał @@penberg, sterownik bazy danych Serverless oferowany przez Turso Cloud może być dostępny za pomocą API `fetch()`, co jest odpowiednie dla funkcji Serverless i brzegowych, które nie wymagają lokalnej bazy danych.
* **Praktyczne wskazówki:** Turso Cloud jest odpowiedni do budowania lekkich aplikacji Serverless.
## Zarządzanie API
Brama API służy do zarządzania i ochrony API.
* **Amazon API Gateway:** Usługa bramy API oferowana przez AWS, obsługująca REST API, WebSocket API i HTTP API.
* **Praktyczne wskazówki:** Używaj funkcji autoryzacji API Gateway, aby chronić bezpieczeństwo API. Używaj funkcji buforowania API Gateway, aby poprawić wydajność API.
* **Google Cloud API Gateway:** Usługa bramy API oferowana przez Google Cloud.
* **Praktyczne wskazówki:** Google Cloud API Gateway integruje się z Google Cloud Endpoints, co ułatwia zarządzanie i ochronę gRPC API.* **Azure API Management:** Usługa bramy API oferowana przez Microsoft Azure.
* **Przydatna wskazówka:** Azure API Management obsługuje różne metody uwierzytelniania, takie jak API Key, OAuth 2.0, OpenID Connect itp.
## Narzędzia związane z AI/ML
Jak zauważyli @@GoogleDevsIN i @@AWSstartups, architektura Serverless jest szeroko stosowana w dziedzinie AI/ML.
* **Google Cloud Run:** Platforma kontenerowa oferowana przez Google Cloud, która może uruchamiać kontenery bezstanowe, obsługuje automatyczne skalowanie i płatność na żądanie. Google wykorzystuje Cloud Run do budowania skalowalnych aplikacji Serverless AI.
* **AWS SageMaker:** Platforma uczenia maszynowego oferowana przez AWS, która może być używana do budowania, trenowania i wdrażania modeli uczenia maszynowego.
* **Przydatna wskazówka:** Możesz użyć SageMaker Endpoint do wdrożenia modelu uczenia maszynowego i uzyskania do niego dostępu za pośrednictwem API Gateway.
## Inne przydatne narzędzia
* **Prisma:** Narzędzie ORM o otwartym kodzie źródłowym, które może uprościć operacje na bazie danych. Deno Deploy oficjalnie zaleca używanie Prisma.
* **ONNX:** Otwarty format modelu uczenia maszynowego, który może z łatwością migrować modele między różnymi frameworkami.
## Serverless vs. VPS: Jak wybrać?
Jak zauważył @@rozzabuilds, Serverless i VPS (Virtual Private Server) mają swoje zalety i wady, a wybór zależy od konkretnego scenariusza zastosowania.
| 特性 | Serverless | VPS |
| -------------- | --------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------ |
| 运维 | Nie wymaga zarządzania serwerem, platforma zarządza automatycznie | Wymaga samodzielnego zarządzania serwerem, w tym konfiguracji, konserwacji, bezpieczeństwa itp. |
| 扩展性 | Automatyczne skalowanie, automatyczne dostosowywanie zasobów w zależności od rzeczywistego ruchu | Wymaga ręcznej konfiguracji skalowania, może wymagać przestoju w celu aktualizacji |
| 成本 | Płatność na żądanie, płatność tylko za faktycznie wykorzystane zasoby obliczeniowe | Stała opłata, opłata jest naliczana niezależnie od tego, czy jest używana |
| 适用场景 | Nadaje się do aplikacji opartych na zdarzeniach, backendów API, zadań przetwarzania wsadowego itp. | Nadaje się do aplikacji, które wymagają długotrwałego działania, aplikacji, które wymagają niestandardowej konfiguracji itp. |
| 复杂性 | Architektura jest stosunkowo złożona, wymaga zrozumienia koncepcji i zasad Serverless | Architektura jest stosunkowo prosta, łatwa do zrozumienia |
**Podsumowując:**
* Jeśli Twoja aplikacja jest sterowana zdarzeniami lub wymaga szybkiego wdrażania i automatycznego skalowania, Serverless jest dobrym wyborem.
* Jeśli Twoja aplikacja wymaga długotrwałego działania lub niestandardowej konfiguracji, VPS może być bardziej odpowiedni.
## Podsumowanie
Architektura Serverless przynosi nam wiele korzyści, a wybór odpowiedniego stosu technologicznego jest kluczem do budowania wydajnych i skalowalnych aplikacji. Mam nadzieję, że narzędzia i zasoby przedstawione w tym artykule pomogą Ci lepiej wykorzystać zalety Serverless i zbudować jeszcze lepsze aplikacje. Pamiętaj, że ciągła nauka i praktyka to jedyna droga do zostania ekspertem Serverless. Życzę Ci sukcesów w świecie Serverless!