DynamoDB Streams Là Gì?
DynamoDB Streams là một tính năng tùy chọn của Amazon DynamoDB, cho phép bạn ghi lại tất cả các thay đổi dữ liệu (thêm, sửa, xóa) trong một bảng DynamoDB theo thứ tự thời gian thực. Những thay đổi này được lưu trữ dưới dạng một stream (luồng dữ liệu) và có thể được xử lý bởi các ứng dụng hoặc dịch vụ khác trong hệ sinh thái AWS.
Mỗi khi một mục (item) trong bảng DynamoDB được thay đổi, DynamoDB Streams sẽ tạo ra một bản ghi (record) chứa thông tin về sự thay đổi đó. Các bản ghi này được lưu trữ trong vòng 24 giờ và có thể được truy cập thông qua API hoặc tích hợp với các dịch vụ như AWS Lambda, Amazon Kinesis, hoặc ứng dụng tùy chỉnh.
Đặc Điểm Chính của DynamoDB Streams
- Thời gian thực: Streams cung cấp dữ liệu gần như ngay lập tức khi có thay đổi trong bảng.
- Tuần tự: Các bản ghi trong stream được sắp xếp theo thứ tự thời gian xảy ra sự kiện.
- Tùy chọn linh hoạt: Bạn có thể chọn loại dữ liệu nào được ghi vào stream (chỉ khóa, dữ liệu cũ, dữ liệu mới, hoặc cả hai).
- Tích hợp dễ dàng: Hoạt động tốt với Lambda, Kinesis, hoặc các ứng dụng tùy chỉnh.
Cách DynamoDB Streams Hoạt Động
Khi bạn bật DynamoDB Streams cho một bảng, mỗi thao tác thay đổi dữ liệu (Create, Update, Delete) sẽ tạo ra một bản ghi trong stream. Các bản ghi này được tổ chức thành shards (phân đoạn), tương tự như cách Kinesis Streams hoạt động. Mỗi shard chứa một chuỗi các bản ghi, và ứng dụng của bạn có thể đọc từ các shard này để xử lý dữ liệu.
Các Loại Dữ Liệu Trong Stream (Stream View Types)
Khi cấu hình DynamoDB Streams, bạn cần chọn Stream View Type – loại dữ liệu mà stream sẽ ghi lại. Có 4 tùy chọn:
- KEYS_ONLY: Chỉ ghi lại các khóa chính (primary key) của mục bị thay đổi.
- NEW_IMAGE: Ghi lại toàn bộ dữ liệu của mục sau khi thay đổi.
- OLD_IMAGE: Ghi lại toàn bộ dữ liệu của mục trước khi thay đổi.
- NEW_AND_OLD_IMAGES: Ghi lại cả dữ liệu trước và sau khi thay đổi.
Tùy thuộc vào nhu cầu ứng dụng, bạn có thể chọn loại phù hợp để tối ưu hóa hiệu suất và giảm chi phí.
Quy Trình Hoạt Động
- Bật Streams: Bạn bật DynamoDB Streams khi tạo bảng hoặc thông qua cập nhật cấu hình bảng.
- Thay đổi dữ liệu: Mỗi khi có thao tác PutItem, UpdateItem, hoặc DeleteItem, một bản ghi được thêm vào stream.
- Xử lý Streams: Ứng dụng hoặc dịch vụ (như Lambda) đọc các bản ghi từ stream và thực hiện hành động cần thiết.
- Hết hạn: Bản ghi trong stream sẽ tự động bị xóa sau 24 giờ.
Trường Hợp Sử Dụng Thực Tế
DynamoDB Streams là một công cụ mạnh mẽ với nhiều ứng dụng thực tế. Dưới đây là một số ví dụ:
1. Đồng Bộ Hóa Dữ Liệu
- Ví dụ: Đồng bộ hóa dữ liệu từ DynamoDB sang một cơ sở dữ liệu khác (như Amazon RDS hoặc Elasticsearch) để phục vụ các truy vấn phức tạp.
- Cách làm: Sử dụng Lambda để đọc stream và ghi dữ liệu mới vào hệ thống đích.
2. Xử Lý Sự Kiện Thời Gian Thực
- Ví dụ: Gửi thông báo (notification) cho người dùng khi trạng thái đơn hàng của họ thay đổi (ví dụ: từ “Đang xử lý” sang “Đã giao”).
- Cách làm: Kích hoạt Lambda từ stream để gửi thông báo qua Amazon SNS hoặc SES.
3. Phân Tích Dữ Liệu
- Ví dụ: Theo dõi hành vi người dùng bằng cách ghi lại các thay đổi trong bảng DynamoDB và gửi dữ liệu đến Amazon Kinesis Data Analytics.
- Cách làm: Kết nối stream với Kinesis để phân tích dữ liệu theo thời gian thực.
4. Kích Hoạt Quy Trình Kinh Doanh
- Ví dụ: Khi một khách hàng thêm sản phẩm vào giỏ hàng, tự động kiểm tra kho hàng và cập nhật trạng thái.
- Cách làm: Sử dụng stream để kích hoạt Lambda và thực hiện kiểm tra logic.
Tích Hợp Với AWS Lambda
Một trong những cách phổ biến nhất để sử dụng DynamoDB Streams là tích hợp với AWS Lambda. Khi bạn kết nối một stream với Lambda:
- Mỗi khi có bản ghi mới trong stream, Lambda sẽ được kích hoạt.
- Lambda đọc các bản ghi (thường dưới dạng batch) và xử lý chúng theo logic bạn định nghĩa.
Ví dụ Cấu Hình
- Tạo bảng DynamoDB và bật Streams với
NEW_AND_OLD_IMAGES
. - Tạo một hàm Lambda với mã xử lý (ví dụ: Python hoặc Node.js).
- Kết nối stream với Lambda thông qua giao diện AWS Management Console hoặc AWS CLI.
- Kiểm tra log trong CloudWatch để đảm bảo Lambda hoạt động đúng.
Mã Ví Dụ (Python)
def lambda_handler(event, context):
for record in event['Records']:
print("Event type:", record['eventName'])
if record['eventName'] == 'INSERT':
new_item = record['dynamodb']['NewImage']
print("New item added:", new_item)
return {
'statusCode': 200,
'body': 'Processed successfully'
}
Một Số Lưu Ý Quan Trọng
- Chi phí: DynamoDB Streams không tính phí riêng, nhưng bạn sẽ bị tính phí dựa trên số lần đọc stream (Stream Read Request Units) và các dịch vụ tích hợp như Lambda.
- Giới hạn 24 giờ: Dữ liệu trong stream chỉ tồn tại trong 24 giờ, vì vậy bạn cần xử lý kịp thời.
- Thứ tự: Streams đảm bảo thứ tự trong cùng một shard, nhưng không đảm bảo thứ tự giữa các shard khác nhau.
- Tính khả dụng: Streams được thiết kế để có độ trễ thấp, nhưng trong trường hợp tải cao, có thể xảy ra độ trễ nhỏ.