+1

Local DynamoDB - Cài đặt AWS DynamoDB ngay trên máy cá nhân của bạn

Lời đầu

DynamoDb là một dịch vụ serverless NoSQL database dạng key-value độc quyền của AWS với khả năng truy xuất dữ liệu nhanh chóng, linh hoạt, được thiết kế để chạy các ứng dụng hiệu suất cao trên mọi quy mô. Các ưu điểm nổi bật của DynamoDB có thể kể đến:

  • Bộ API đơn giản: gồm các action Get, Put, Query, Scan trên các bảng đơn lẻ
  • Fully managed by AWS: bạn chỉ cần định nghĩa khóa (key) và lưu lượng (provisioned throughput) cần sử dụng, tất cả các tác vụ quản trị khác đã được AWS xử lý.
  • Hỗ trợ tối đa hàng triệu request trên giây, khả năng tự động scale up để xử lý workload khủng

Ngoài ra, DynamoDb còn nằm trong danh sách các dịch vụ sử dụng miễn phí trong gói Free Tier của AWS với lưu lượng giới hạn: 25GB of storage, 25 provisioned WCU/RCU tương đương với khoảng 200 triệu request mỗi tháng. Con số này đã khá đủ cho việc phát triển và kiểm thử phần mềm. Tuy nhiên, nếu bạn muốn sử dụng DynamoDb trên máy local để tránh việc phụ thuộc vào kết nối Internet thì DynamoDB Local chính là lựa chọn tối ưu của bạn.

DynamoDB Local

Giới thiệu

AWS đưa ra bản cài DynamoDB dưới dạng Docker image dynamodb-local giúp người dùng có thể dễ dàng cài đặt chỉ với một câu lệnh:

docker run -p 8000:8000 amazon/dynamodb-local

Bạn cũng có thể cài đặt với docker-compose để triển khai cùng các ứng dụng khác:

version: '3.8'
services:
 dynamodb-local:
   command: "-jar DynamoDBLocal.jar -sharedDb -dbPath ./data"
   image: "amazon/dynamodb-local:latest"
   container_name: dynamodb-local
   ports:
     - "8000:8000"
   volumes:
     - "./docker/dynamodb:/home/dynamodblocal/data"
   working_dir: /home/dynamodblocal

DynamoDB Local cung cấp bộ APIs tương tự như DynamoDB web service, do đó người dùng chỉ cần thay đổi endpoint-url khi tương tác.

Ví dụ, để tạo table trên DynamoDB Local với AWS CLI , ta có thể sử dụng câu lệnh sau:

aws dynamodb create-table  \
--table-name orders_table \
--attribute-definitions AttributeName=orderId,AttributeType=S \
--key-schema AttributeName=orderId,KeyType=HASH \
--billing-mode PAY_PER_REQUEST 
--endpoint-url http://localhost:8000

Ở đây, --endpoint-url được trỏ tới container chạy dynamoDB local.

Người dùng cũng có thể tương tác với DynamoDb Local thông qua các bộ SDKs (Software Development Kits). Ví dụ với AWS SDK cho Python, ta có thể import dữ liệu vào table vừa tạo ở bước trên với đoạn code sau:

import boto3, time, datetime
from botocore.config import Config
# cấu hình endpoint_url trỏ tới http://localhost:8000
dynamodb = boto3.resource('dynamodb',config=Config(retries={'mode':'adaptive','total_max_attempts': 10}), endpoint_url='http://localhost:8000')
start_time=time.time()
try:
    for k in range(0,1000):
        r=dynamodb.Table('orders_table').put_item(Item={'orderId':f"o-{k:08}",'seconds':int(time.time()-start_time),'timestamp':datetime.datetime.now().isoformat()})
except Exception as e:
    print(str(e))

end_time=time.time()
print(f"Last: %s\n\n===> Total: %d seconds, %d keys %d items/second\n"%(r,(end_time-start_time),k,k/(end_time-start_time)))

Truy vấn dữ liệu vừa tạo với AWS CLI:

aws dynamodb --endpoint-url http://localhost:8000 \
scan --table-name orders_table \
--select=COUNT \
--return-consumed-capacity TOTAL

Điểm khác biệt so với AWS DynamoDB service

Để đổi lại sự tiện lợi khi cài đặt trên máy cá nhân, phiên bản DynamoDB Local có một vài đặc điểm khác biệt so với bản web service, bao gồm:

  • DynamoDb Local "ignore" các cấu hình giới hạn lưu lượng (Provisioned throughput), giới hạn duy nhất là hiệu năng máy tính của bạn
  • Lệnh "scan" được thực hiện tuần tự, không hỗ trợ "parallel scans" do đó tốc độ scan khá chậm
  • DynamoDB duy trì giới hạn 1MB cho mỗi result set trả về. Tuy nhiên đối với bản web service, dung lượng này chỉ tính dựa trên tổng dung lượng của khóa và các thuộc tính được chọn, trong khi bản local sẽ tính tổng dung lượng cả item.
  • DynamoDB Local không có tính năng partition
  • Tên table trong DynamoDB local là case insensitive. Như trong ví dụ phía trên, nếu bạn tạo thêm một table với tên Orders_Table sẽ nhận được thông báo lỗi:

image.png

NoSQL on SQLite?

Hãy chú ý đến log lỗi phía trên, bạn sẽ thấy DynamoDB Local được xây dựng trên cơ sở dữ liệu SQLite với ngôn ngữ Java.

Nếu cài đặt dynamoDB Local với option: -sharedDb sử dụng docker-compose như phía trên, file database có tên shared-local-instance.db sẽ được tạo trong thư mục mount, cụ thể là ./docker/dynamodb.

Đây thực chất chính là database file cho SQLite mà người dùng có thể sử dụng tool Database Client như Dbeaver để kết nối trực tiếp. image.png

Cách thức này sẽ giúp bạn debug và kiểm tra dữ liệu nhanh hơn so với việc sử dụng DynamoDB Local APIs.

Vấn đề là tại sao AWS lại chọn cơ sở dữ liệu quan hệ như SQLite để phát triển DynamoDB Local? Câu hỏi này mình sẽ cố gắng giải đáp trong các bài viết tiếp theo.

Lời kết

Bài viết này đã giới thiệu qua cho người đọc về DynamoDb và cách thức sử dụng DynamoDb Local trên máy cá nhân. Nếu bạn thấy kiến thức này bổ ích, đừng quên upvote để tác giả có thêm động lực viết bài nhé!


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí