AWS Lambda Serverless 2026: Kiến trúc, SnapStart, Event-Driven Patterns và Free Tier cho Production
Posted on: 4/17/2026 9:11:56 AM
Table of contents
- 1. AWS Lambda 2026 — Không chỉ là "chạy hàm"
- 2. Kiến trúc Serverless REST API — Pattern chuẩn
- 3. SnapStart — Giết chết Cold Start trên .NET
- 4. Event-Driven Patterns — Sức mạnh thực sự của Serverless
- 5. Best Practices cho Lambda Production
- 6. Free Tier — Xây production không tốn tiền
- 7. Kiến trúc tham khảo — SaaS Backend hoàn chỉnh
- 8. Những sai lầm thường gặp
- 9. So sánh với các nền tảng serverless khác
- 10. Kết luận — Serverless-first, nhưng không dogmatic
Serverless không còn là khái niệm thử nghiệm — năm 2026, AWS Lambda đã trở thành xương sống của hàng triệu hệ thống production trên toàn cầu. Từ REST API đơn giản đến pipeline xử lý dữ liệu phức tạp, Lambda cho phép developer tập trung vào business logic mà không phải lo quản lý server, scaling hay patching. Bài viết này đi sâu vào kiến trúc serverless trên AWS năm 2026, bao gồm các pattern thiết kế hệ thống, tối ưu cold start với SnapStart, event-driven architecture, và cách tận dụng tối đa Free Tier để xây dựng hệ thống production thực thụ mà chi phí gần như bằng không.
1. AWS Lambda 2026 — Không chỉ là "chạy hàm"
Lambda năm 2026 đã vượt xa khái niệm "Function as a Service" ban đầu. Với sự bổ sung của SnapStart cho .NET và Python, Lambda URLs không cần API Gateway, Response Streaming, và khả năng chạy container image lên đến 10GB, Lambda giờ đây là một compute platform hoàn chỉnh chạy trên nền tảng Firecracker microVM — cùng công nghệ được dùng bởi AWS Fargate.
graph TB
subgraph "AWS Lambda Platform 2026"
A["Lambda Function Code"] --> B["Firecracker microVM"]
B --> C["Execution Environment"]
C --> D["Runtime API"]
D --> E["Extensions API"]
end
subgraph "Triggers"
F["API Gateway / Lambda URL"] --> A
G["S3 Events"] --> A
H["SQS / SNS"] --> A
I["EventBridge"] --> A
J["DynamoDB Streams"] --> A
K["Step Functions"] --> A
end
subgraph "Storage & Data"
A --> L["DynamoDB"]
A --> M["S3"]
A --> N["Aurora Serverless"]
A --> O["ElastiCache"]
end
style A fill:#e94560,stroke:#fff,color:#fff
style B fill:#2c3e50,stroke:#fff,color:#fff
style F fill:#f8f9fa,stroke:#e94560,color:#2c3e50
style G fill:#f8f9fa,stroke:#e94560,color:#2c3e50
style H fill:#f8f9fa,stroke:#e94560,color:#2c3e50
style I fill:#f8f9fa,stroke:#e94560,color:#2c3e50
style J fill:#f8f9fa,stroke:#e94560,color:#2c3e50
style K fill:#f8f9fa,stroke:#e94560,color:#2c3e50
style L fill:#f8f9fa,stroke:#4CAF50,color:#2c3e50
style M fill:#f8f9fa,stroke:#4CAF50,color:#2c3e50
style N fill:#f8f9fa,stroke:#4CAF50,color:#2c3e50
style O fill:#f8f9fa,stroke:#4CAF50,color:#2c3e50
Hệ sinh thái AWS Lambda 2026 — triggers, compute và storage layer
Lambda vs Container (ECS/Fargate) — Khi nào chọn gì?
Lambda phù hợp cho workload event-driven, bursty — API nhận vài nghìn request/phút, xử lý file upload, cron jobs. Nếu service cần chạy liên tục, giữ connection pool, hoặc cần hơn 15 phút xử lý, hãy cân nhắc ECS Fargate hoặc App Runner. Quy tắc ngón tay cái: nếu bạn nghĩ theo "request" → Lambda; nếu nghĩ theo "process" → Container.
2. Kiến trúc Serverless REST API — Pattern chuẩn
Pattern phổ biến nhất và cũng là điểm khởi đầu lý tưởng: API Gateway → Lambda → DynamoDB. Kiến trúc này zero-server, auto-scaling, và nằm hoàn toàn trong Free Tier cho ứng dụng nhỏ-trung.
sequenceDiagram
participant C as Client
participant AG as API Gateway
participant L as Lambda
participant DB as DynamoDB
participant CW as CloudWatch
C->>AG: POST /api/orders
AG->>AG: Validate request (JSON Schema)
AG->>L: Invoke function
L->>L: Business logic + validation
L->>DB: PutItem (conditional)
DB-->>L: Success / ConditionalCheckFailed
L-->>AG: 201 Created + response body
AG-->>C: HTTPS response
L->>CW: Metrics + structured logs
Luồng xử lý REST API serverless — từ request đến database
2.1 API Gateway — Lớp cửa trước thông minh
API Gateway không chỉ là reverse proxy đơn thuần. Nó cung cấp request validation bằng JSON Schema (reject request sai format trước khi Lambda chạy — tiết kiệm compute), usage plans + API keys cho rate limiting, caching tích hợp giảm tải cho Lambda, và custom authorizers (Lambda hoặc Cognito) cho authentication. Năm 2026, HTTP API (v2) là lựa chọn mặc định — rẻ hơn 71% so với REST API (v1) và có latency thấp hơn.
| Tính năng | HTTP API (v2) | REST API (v1) | Lambda URL |
|---|---|---|---|
| Giá | $1.00/triệu request | $3.50/triệu request | Miễn phí (tính vào Lambda) |
| Latency | ~10ms overhead | ~29ms overhead | ~5ms overhead |
| Auth | JWT, Lambda authorizer | IAM, Cognito, Lambda, API Key | IAM only |
| Caching | Không | Có (0.5GB - 237GB) | Không |
| Rate Limiting | Không (dùng WAF) | Usage Plans + API Keys | Không |
| Use case | API chung, webhook | API phức tạp, cần caching | Single-function, internal |
2.2 DynamoDB — Database serverless đồng hành hoàn hảo
DynamoDB là lựa chọn tự nhiên cho Lambda vì cùng triết lý: pay-per-use, zero management, auto-scaling. Với on-demand mode, bạn trả theo từng read/write request — không cần estimate capacity trước. Free Tier cho phép 25GB storage + 200 triệu request/tháng (Always Free, không giới hạn 12 tháng).
Single-Table Design — Khi DynamoDB phát huy sức mạnh
Không như SQL database, DynamoDB hoạt động tốt nhất với Single-Table Design — gom nhiều entity vào cùng một table, phân biệt bằng partition key pattern. Ví dụ: PK=USER#123, SK=ORDER#2026-04-17 cho phép query tất cả order của user trong một lần scan. Pattern này giảm số lượng Lambda → DynamoDB round-trip từ N xuống 1, cực kỳ quan trọng khi mỗi millisecond đều tính tiền.
3. SnapStart — Giết chết Cold Start trên .NET
Cold start từng là nỗi đau lớn nhất của Lambda — đặc biệt với runtime .NET, nơi thời gian khởi tạo có thể lên đến 2-3 giây. AWS Lambda SnapStart giải quyết triệt để vấn đề này bằng cách chụp snapshot của Firecracker microVM ngay sau khi function khởi tạo xong, rồi resume từ snapshot đó cho các invocation sau — thay vì boot lại từ đầu.
graph LR
subgraph "Không có SnapStart"
A1["Publish Version"] --> B1["Cold Start: Init Runtime"]
B1 --> C1["Load Dependencies"]
C1 --> D1["JIT Compile"]
D1 --> E1["Handle Request"]
style B1 fill:#ff9800,stroke:#e65100,color:#fff
style C1 fill:#ff9800,stroke:#e65100,color:#fff
style D1 fill:#ff9800,stroke:#e65100,color:#fff
end
subgraph "Có SnapStart"
A2["Publish Version"] --> B2["Init + Snapshot"]
B2 --> C2["Resume từ Snapshot"]
C2 --> E2["Handle Request"]
style B2 fill:#4CAF50,stroke:#2E7D32,color:#fff
style C2 fill:#4CAF50,stroke:#2E7D32,color:#fff
end
style E1 fill:#e94560,stroke:#fff,color:#fff
style E2 fill:#e94560,stroke:#fff,color:#fff
SnapStart bỏ qua Init/JIT — resume trực tiếp từ snapshot đã cache
3.1 Hiệu năng thực tế
Benchmark từ AWS với .NET 8 + Native AOT cho thấy kết quả ấn tượng:
| Metric (P90) | Không SnapStart | SnapStart Enabled | SnapStart Optimized |
|---|---|---|---|
| Restore/Init Duration | 809ms | 510ms | 516ms |
| Function Duration | 870ms | 500ms | 182ms |
| Tổng latency (P90) | 1,680ms | 1,010ms | 698ms |
| Cải thiện | — | 40% | 58% |
3.2 Cấu hình SnapStart cho ASP.NET Core
Với ASP.NET Core trên Lambda, cấu hình SnapStart chỉ cần vài dòng. Quan trọng nhất là warmup request — gửi request giả trước khi snapshot để JIT compile sẵn các hot path:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddAWSLambdaHosting(LambdaEventSource.HttpApi);
// SnapStart: gửi warmup request trước khi snapshot
builder.Services.AddAWSLambdaBeforeSnapshotRequest(
new HttpRequestMessage(HttpMethod.Get, "/health"));
var app = builder.Build();
app.MapControllers();
app.Run();{
"AWSTemplateFormatVersion": "2010-09-09",
"Transform": "AWS::Serverless-2016-10-31",
"Resources": {
"ApiFunction": {
"Type": "AWS::Serverless::Function",
"Properties": {
"Handler": "bootstrap",
"Runtime": "dotnet8",
"MemorySize": 512,
"SnapStart": {
"ApplyOn": "PublishedVersions"
},
"AutoPublishAlias": "live",
"Events": {
"Api": {
"Type": "HttpApi",
"Properties": { "Path": "/{proxy+}", "Method": "ANY" }
}
}
}
}
}
}Lưu ý quan trọng khi dùng SnapStart
Snapshot là frozen state — các network connection, random seed, và timestamp sẽ bị "đóng băng". Sau khi restore, bạn PHẢI refresh lại database connection, regenerate random values, và reset time-dependent logic. Dùng RegisterAfterRestore callback để xử lý. Ngoài ra, SnapStart không hỗ trợ Provisioned Concurrency, EFS mount, và ephemeral storage > 512MB.
4. Event-Driven Patterns — Sức mạnh thực sự của Serverless
REST API chỉ là phần nổi. Lambda thực sự toả sáng khi được dùng trong kiến trúc event-driven — nơi các service giao tiếp bất đồng bộ qua events thay vì gọi trực tiếp. Mô hình này cho phép loose coupling, fault isolation, và khả năng scale từng component độc lập.
4.1 Fan-out Pattern với SNS + SQS
graph LR
A["Order Service"] -->|Publish| B["SNS Topic: OrderCreated"]
B -->|Subscribe| C["SQS: Email Queue"]
B -->|Subscribe| D["SQS: Inventory Queue"]
B -->|Subscribe| E["SQS: Analytics Queue"]
C --> F["Lambda: Send Email"]
D --> G["Lambda: Update Stock"]
E --> H["Lambda: Write to Analytics"]
style A fill:#e94560,stroke:#fff,color:#fff
style B fill:#2c3e50,stroke:#fff,color:#fff
style C fill:#f8f9fa,stroke:#e94560,color:#2c3e50
style D fill:#f8f9fa,stroke:#e94560,color:#2c3e50
style E fill:#f8f9fa,stroke:#e94560,color:#2c3e50
style F fill:#f8f9fa,stroke:#4CAF50,color:#2c3e50
style G fill:#f8f9fa,stroke:#4CAF50,color:#2c3e50
style H fill:#f8f9fa,stroke:#4CAF50,color:#2c3e50
Fan-out pattern — một event trigger nhiều consumer độc lập
Khi Order Service tạo đơn hàng, nó publish một event duy nhất vào SNS. Ba SQS queue subscribe topic này, mỗi queue trigger một Lambda function riêng biệt. Email chậm? Inventory vẫn update bình thường. Analytics lỗi? Order vẫn thành công. Đây là bản chất của fault isolation trong event-driven architecture.
4.2 Saga Pattern với Step Functions
Cho các workflow phức tạp cần coordination giữa nhiều service (đặt vé máy bay → book hotel → thuê xe), AWS Step Functions là orchestrator serverless lý tưởng. Step Functions quản lý state, retry, error handling, và compensation (rollback) — tất cả bằng JSON definition, không cần code orchestration.
graph TD
A["Start: Book Trip"] --> B["Lambda: Reserve Flight"]
B -->|Success| C["Lambda: Book Hotel"]
B -->|Fail| Z["End: Failed"]
C -->|Success| D["Lambda: Rent Car"]
C -->|Fail| E["Lambda: Cancel Flight"]
E --> Z
D -->|Success| F["End: Trip Booked ✅"]
D -->|Fail| G["Lambda: Cancel Hotel"]
G --> E
style A fill:#2c3e50,stroke:#fff,color:#fff
style F fill:#4CAF50,stroke:#2E7D32,color:#fff
style Z fill:#ff9800,stroke:#e65100,color:#fff
style B fill:#f8f9fa,stroke:#e94560,color:#2c3e50
style C fill:#f8f9fa,stroke:#e94560,color:#2c3e50
style D fill:#f8f9fa,stroke:#e94560,color:#2c3e50
style E fill:#e94560,stroke:#fff,color:#fff
style G fill:#e94560,stroke:#fff,color:#fff
Saga pattern — mỗi bước có compensation path để rollback khi lỗi
4.3 Event Sourcing với DynamoDB Streams + Lambda
DynamoDB Streams capture mọi thay đổi trong table dưới dạng ordered stream. Lambda function subscribe stream này để project read models, sync data sang Elasticsearch, hoặc trigger downstream workflows. Pattern này biến DynamoDB thành nguồn sự kiện (event log) mà không cần thêm message broker.
// Lambda handler xử lý DynamoDB Stream events
export const handler = async (event: DynamoDBStreamEvent) => {
for (const record of event.Records) {
if (record.eventName === 'INSERT' || record.eventName === 'MODIFY') {
const newImage = record.dynamodb?.NewImage;
const entityType = newImage?.PK?.S?.split('#')[0];
switch (entityType) {
case 'ORDER':
await syncOrderToElasticsearch(newImage);
await updateDashboardMetrics(newImage);
break;
case 'USER':
await invalidateUserCache(newImage);
break;
}
}
}
};5. Best Practices cho Lambda Production
5.1 Idempotency — Quy tắc vàng
Lambda có thể được invoke nhiều hơn một lần cho cùng một event (at-least-once delivery). Nếu function của bạn charge tiền khách hàng, gửi email, hay update inventory — phải đảm bảo chạy lại cho kết quả giống hệt lần đầu.
# Idempotency với DynamoDB conditional write
import boto3
from datetime import datetime
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('Orders')
def handler(event, context):
order_id = event['orderId']
idempotency_key = event['idempotencyKey']
try:
table.put_item(
Item={
'PK': f'ORDER#{order_id}',
'SK': 'METADATA',
'idempotencyKey': idempotency_key,
'status': 'PROCESSING',
'createdAt': datetime.utcnow().isoformat()
},
ConditionExpression='attribute_not_exists(idempotencyKey)'
)
# Xử lý order...
process_order(order_id)
except dynamodb.meta.client.exceptions.ConditionalCheckFailedException:
# Đã xử lý rồi — return kết quả cũ
return get_existing_order(order_id)5.2 Memory = CPU — Công thức tối ưu
Lambda phân bổ CPU tỉ lệ thuận với memory theo công thức: vCPU = memory_mb / 1,769. Tức là 1,769 MB memory = 1 full vCPU. Dưới 1,769 MB, function chỉ nhận một phần vCPU, khiến multi-threaded code không phát huy hiệu quả. Trên 1,769 MB, Lambda cấp thêm vCPU — code parallel (như .NET async/await hoặc Python asyncio) sẽ nhanh hơn đáng kể.
Mẹo: Dùng AWS Lambda Power Tuning
Đừng đoán memory — dùng AWS Lambda Power Tuning (open-source Step Functions app) để benchmark function ở nhiều mức memory khác nhau. Tool này chạy function 100+ lần ở mỗi mức (128MB → 3008MB), sau đó vẽ biểu đồ cost vs. duration. Thường thì tăng memory giảm tổng chi phí vì function chạy nhanh hơn tỉ lệ thuận với tiền memory tăng thêm.
5.3 Structured Logging + Tracing
CloudWatch Logs là mặc định, nhưng log không cấu trúc thì vô dụng khi debug production. Luôn dùng structured logging (JSON format) và enable X-Ray tracing để có distributed trace xuyên suốt API Gateway → Lambda → DynamoDB:
// .NET: Structured logging với Powertools for AWS Lambda
using AWS.Lambda.Powertools.Logging;
using AWS.Lambda.Powertools.Tracing;
[Logging(LogEvent = true, Service = "OrderService")]
[Tracing(CaptureMode = TracingCaptureMode.ResponseAndError)]
public async Task<APIGatewayHttpApiV2ProxyResponse> Handler(
APIGatewayHttpApiV2ProxyRequest request, ILambdaContext context)
{
Logger.AppendKey("orderId", request.PathParameters["id"]);
Logger.LogInformation("Processing order request");
// X-Ray tự động trace DynamoDB calls
var order = await _orderRepository.GetByIdAsync(
request.PathParameters["id"]);
return new APIGatewayHttpApiV2ProxyResponse
{
StatusCode = 200,
Body = JsonSerializer.Serialize(order)
};
}6. Free Tier — Xây production không tốn tiền
Một trong những lợi thế lớn nhất của serverless trên AWS là Free Tier cực kỳ hào phóng. Với startup hoặc side project có lưu lượng thấp-trung, hoàn toàn có thể chạy production mà không tốn đồng nào:
| Service | Free Tier | Loại | Ghi chú |
|---|---|---|---|
| Lambda | 1M requests + 400K GB-s/tháng | Always Free | ~3.2 triệu request 128MB |
| API Gateway (HTTP) | 1M requests/tháng | 12 tháng | Dùng Lambda URL thay thế nếu hết |
| DynamoDB | 25GB + 200M requests/tháng | Always Free | Chỉ Provisioned mode |
| S3 | 5GB + 20K GET + 2K PUT/tháng | 12 tháng | Cho static assets, uploads |
| SQS | 1M requests/tháng | Always Free | Standard + FIFO queue |
| SNS | 1M publishes + 100K HTTP deliveries | Always Free | Fan-out pattern miễn phí |
| CloudWatch | 10 custom metrics + 5GB logs/tháng | Always Free | Lambda logs auto-ship vào đây |
| Step Functions | 4,000 state transitions/tháng | Always Free | Đủ cho workflow đơn giản |
Ước tính chi phí thực tế
Một REST API với 500K requests/tháng, mỗi request xử lý 200ms ở 256MB memory: Lambda = $0 (trong Free Tier), API Gateway HTTP = $0.50, DynamoDB on-demand = ~$0.63 (500K writes + 1M reads). Tổng: dưới $1.15/tháng cho một API hoàn chỉnh phục vụ hàng nghìn người dùng.
7. Kiến trúc tham khảo — SaaS Backend hoàn chỉnh
Dưới đây là kiến trúc serverless hoàn chỉnh cho một SaaS application cỡ trung, sử dụng tất cả các pattern đã nói:
graph TB
subgraph "Frontend"
A["CloudFront CDN"] --> B["S3: Static Assets"]
end
subgraph "API Layer"
C["API Gateway HTTP"] --> D["Lambda: Auth Middleware"]
D --> E["Lambda: CRUD API"]
D --> F["Lambda: File Upload"]
end
subgraph "Async Processing"
E -->|Event| G["SQS: Task Queue"]
G --> H["Lambda: Background Worker"]
F -->|Upload| I["S3: User Files"]
I -->|S3 Event| J["Lambda: Process File"]
end
subgraph "Data Layer"
E --> K["DynamoDB: Main Store"]
H --> K
K -->|Streams| L["Lambda: Stream Processor"]
L --> M["OpenSearch: Full-text Search"]
end
subgraph "Monitoring"
N["CloudWatch Logs"]
O["X-Ray Traces"]
P["CloudWatch Alarms → SNS → Slack"]
end
A --> C
style A fill:#2c3e50,stroke:#fff,color:#fff
style C fill:#e94560,stroke:#fff,color:#fff
style K fill:#4CAF50,stroke:#2E7D32,color:#fff
style G fill:#f8f9fa,stroke:#e94560,color:#2c3e50
style I fill:#f8f9fa,stroke:#e94560,color:#2c3e50
style M fill:#f8f9fa,stroke:#4CAF50,color:#2c3e50
Kiến trúc SaaS serverless hoàn chỉnh trên AWS — API, async processing, data layer và monitoring
8. Những sai lầm thường gặp
Qua kinh nghiệm triển khai serverless cho nhiều dự án, dưới đây là những anti-pattern phổ biến cần tránh:
❌ Lambda Monolith
Đóng gói toàn bộ application vào một Lambda function duy nhất xử lý mọi route. Package size phình to (chậm cold start), không thể scale/monitor từng endpoint riêng, và một bug trong route ít dùng có thể crash cả API. Tuy nhiên, với ASP.NET Core + SnapStart, đây lại là trade-off chấp nhận được cho team nhỏ — cân nhắc tùy context.
❌ Lambda gọi Lambda (synchronous)
Đừng bao giờ cho Lambda A gọi trực tiếp Lambda B qua invoke() rồi chờ response. Bạn trả tiền cho cả hai function cùng lúc — A đang idle chờ B xong. Thay vào đó, dùng Step Functions để orchestrate hoặc SQS/EventBridge để decouple.
❌ Không set timeout hợp lý
Default timeout Lambda là 3 giây. Nếu function gọi external API mà timeout 30 giây, bạn vẫn trả tiền cho cả 30 giây. Set timeout vừa đủ + buffer — ví dụ function thường chạy 500ms thì set 5s, không phải 15 phút.
9. So sánh với các nền tảng serverless khác
| Tiêu chí | AWS Lambda | Azure Functions | Cloudflare Workers | Google Cloud Functions |
|---|---|---|---|---|
| Max duration | 15 phút | Unlimited (Premium) | 30 phút (Dynamic) | 60 phút (2nd gen) |
| Cold start (.NET) | ~700ms (SnapStart) | ~800ms (Flex) | N/A (JS/Wasm only) | ~1.2s |
| Free tier | 1M req + 400K GB-s | 1M req + 400K GB-s | 100K req/ngày | 2M req + 400K GB-s |
| Edge locations | 30+ regions | 60+ regions | 330+ cities | 30+ regions |
| Container support | Có (10GB) | Có | Không | Có (2nd gen) |
| Ecosystem | Lớn nhất (200+ services) | Tích hợp sâu Azure/M365 | Edge-native, nhẹ | Tích hợp GCP AI/ML |
| Best for | Enterprise, full-stack | Doanh nghiệp dùng Azure | Edge, low-latency | AI/ML workloads |
10. Kết luận — Serverless-first, nhưng không dogmatic
AWS Lambda và hệ sinh thái serverless năm 2026 đã đủ trưởng thành cho hầu hết workload production. Với SnapStart giải quyết cold start, Step Functions xử lý workflow phức tạp, và Free Tier hào phóng cho phép xây dựng mà gần như không tốn chi phí — serverless nên là lựa chọn mặc định khi bắt đầu dự án mới. Chỉ chuyển sang container khi bạn thực sự cần: long-running processes, GPU, hoặc kiểm soát runtime sâu hơn.
Điều quan trọng là thiết kế đúng pattern ngay từ đầu: event-driven thay vì synchronous chain, idempotent handler thay vì fire-and-pray, structured logging thay vì console.log. Lambda là commodity — kiến trúc mới là competitive advantage.
Nguồn tham khảo:
GitHub Actions CI/CD cho .NET 2026 — OIDC, Egress Firewall và Immutable Actions cho Pipeline Production
Azure Container Apps — Chạy Container Production mà không cần Kubernetes
Disclaimer: The opinions expressed in this blog are solely my own and do not reflect the views or opinions of my employer or any affiliated organizations. The content provided is for informational and educational purposes only and should not be taken as professional advice. While I strive to provide accurate and up-to-date information, I make no warranties or guarantees about the completeness, reliability, or accuracy of the content. Readers are encouraged to verify the information and seek independent advice as needed. I disclaim any liability for decisions or actions taken based on the content of this blog.