Sử dụng AWS DynamoDB trong Ứng dụng Node.js
Bài học chính
DynamoDB là một giải pháp cơ sở dữ liệu NoSQL đặc biệt mạnh mẽ và hiệu quả do Amazon Web Services (AWS) cung cấp. Giải pháp này có khả năng quản lý khối lượng lớn thông tin đa dạng trong khi vẫn duy trì mức hiệu suất, khả năng phục hồi và độ tin cậy tối ưu.
Để bắt đầu sử dụng dịch vụ cơ sở dữ liệu NoSQL của Amazon, còn gọi là DynamoDB, trong môi trường Node.js, cần phải lấy mô-đun client-dynamodb từ AWS SDK và thiết lập cài đặt xác thực phù hợp để truy cập vào nền tảng.
DynamoDB cung cấp một cách tiếp cận đơn giản để tạo bảng, thao tác dữ liệu thông qua các hoạt động khác nhau như ghi, đọc, cập nhật và xóa bản ghi, tất cả đều sử dụng các tham số do người dùng xác định. Tính năng này thúc đẩy khả năng thích ứng và khả năng mở rộng trong thiết kế ứng dụng, nâng cao hiệu quả tổng thể.
Việc sử dụng một loạt các ngôn ngữ lập trình mạnh mẽ kết hợp với cơ sở dữ liệu mạnh mẽ là điều cần thiết cho phần lớn việc tạo ứng dụng hiện đại.
Amazon Web Services cung cấp giải pháp đổi mới có tên DynamoDB, có tiềm năng chuyển đổi việc quản lý dữ liệu bằng cách cho phép tạo nhanh cơ sở dữ liệu có khả năng xử lý hiệu quả các tập dữ liệu lớn và đa dạng.
DynamoDB là gì?
Amazon Web Services cung cấp các giải pháp đa dạng đáp ứng nhiều yêu cầu cơ sở dữ liệu khác nhau, bao gồm Amazon Relational Database Service (RDS) cho cơ sở dữ liệu quan hệ truyền thống và Amazon DocumentDB, hỗ trợ cơ sở dữ liệu tài liệu tương tự như MongoDB. Ngoài ra, DynamoDB là một ví dụ về cơ sở dữ liệu không quan hệ hoặc cơ sở dữ liệu NoSQL lưu trữ dữ liệu bằng hệ thống lưu trữ khóa-giá trị.
DynamoDB có khả năng quản lý hiệu quả khối lượng thông tin đáng kể được phân tán trên mạng phân tán trong khi vẫn duy trì mức hiệu suất, độ bền và độ tin cậy vượt trội. Hệ thống trình bày một khung có thể thích ứng cho phép lưu trữ và truy xuất đơn giản cả dữ liệu có cấu trúc và không cấu trúc.
DynamoDB là một giải pháp cơ sở dữ liệu linh hoạt có thể được sử dụng trên nhiều miền. Nó có thể được truy cập thông qua cả Bảng điều khiển quản lý AWS và Giao diện dòng lệnh AWS (CLI), cũng như được tích hợp trong các ứng dụng web tận dụng Bộ công cụ phát triển phần mềm (SDK) AWS.
Bắt đầu với DynamoDB trong Node.js
Node.js cung cấp nhiều tùy chọn đa dạng để xây dựng giao diện lập trình ứng dụng phụ trợ (API) và mang đến cho người dùng sự linh hoạt trong việc chọn cơ sở dữ liệu ưa thích của họ để tích hợp trong bối cảnh này. Ngoài ra, Node.js hỗ trợ nhiều dịch vụ bên ngoài, chẳng hạn như DynamoDB của Amazon Web Services, cung cấp cho các nhà phát triển nhiều lựa chọn để đáp ứng các yêu cầu cụ thể của họ.
Để sử dụng dịch vụ Amazon Web Services (AWS) trong ứng dụng Node, tất cả những gì cần thiết là gói SDK ứng dụng khách phù hợp dành riêng cho dịch vụ cụ thể đó. Ví dụ: để tương tác với DynamoDB, người ta phải lấy và cài đặt mô-đun client-dynamodb
nằm trong aws-sdk
.
Để thực thi lệnh trong thư mục dự án đã chỉ định, vui lòng làm theo các bước sau: 1. Điều hướng đến thư mục dự án mong muốn bằng thiết bị đầu cuối hoặc dấu nhắc lệnh.2. Nhập lệnh thích hợp để cài đặt gói cần thiết và nhấn enter.3. Quá trình cài đặt sẽ bắt đầu và sau khi hoàn tất, bạn nên xác minh rằng gói đã được cài đặt thành công bằng cách kiểm tra sự hiện diện của gói trong hệ thống tệp của dự án.
npm install @aws-sdk/client-dynamodb
Để sử dụng bảng DynamoDB trong dự án Node.js bằng gói aws-sdk/client-dynamodb
, bạn cần chỉ định vị trí địa lý của bảng bằng cách kết hợp vùng của bảng vào cài đặt cấu hình của máy khách trước bất kỳ tương tác nào. Bản cập nhật cấu hình này phải được thực hiện trong quá trình khởi tạo máy khách DynamoDB.
Nếu trước đây bạn đã cài đặt và sử dụng AWS CLI trên thiết bị máy tính của mình thì rất có thể bạn đã thiết lập thông tin xác thực AWS trong cài đặt môi trường của mình. Trong trường hợp như vậy, bộ công cụ phát triển phần mềm (SDK) liên quan sẽ truy xuất liền mạch các giá trị này từ môi trường xung quanh nói trên mà không cần bạn thực hiện thêm bất kỳ hành động nào.
Nếu bạn chưa tạo người dùng IAM trong Bảng điều khiển Amazon Web Services (AWS), bạn có thể làm như vậy bằng cách điều hướng đến dịch vụ AWS Identity and Access Management (IAM). Sau khi thiết lập tài khoản người dùng mới này, bạn sẽ được cung cấp mã định danh khóa truy cập duy nhất và khóa bí mật tương ứng, đóng vai trò là thông tin xác thực cá nhân của bạn để truy cập các tài nguyên khác nhau trong hệ sinh thái AWS.
Để kết hợp các khóa xác thực này vào không gian làm việc của bạn, bạn có thể thực hiện các hướng dẫn dòng lệnh sau trên hệ điều hành của mình:
Trên Unix, Linux hoặc macOS:
export AWS_ACCESS_KEY_ID='your access key ID'
export AWS_SECRET_ACCESS_KEY='you secret access key'
Trên Windows (CMD):
set AWS_ACCESS_KEY_ID='your access key ID'
set AWS_SECRET_ACCESS_KEY='you secret access key'
Trên Windows (PowerShell):
$env:AWS_ACCESS_KEY_ID='your access key ID'
$env:AWS_SECRET_ACCESS_KEY='you secret access key'
Trong dự án Node.js của bạn, hãy thiết lập một tệp mới có tên “dynamodb.js”. Trong tệp này, hãy sử dụng các dòng mã sau để khởi tạo phiên bản của máy khách DynamoDB của Amazon Web Services (AWS):
const { DynamoDB } = require('@aws-sdk/client-dynamodb')
const region = "us-east-1" // your preferred region
const client = new DynamoDB({ region })
AWS đảm bảo rằng thông tin bảo mật nhạy cảm được bảo vệ thỏa đáng bằng cách ngăn chặn việc tiết lộ dữ liệu đó trong chính mã đó. Do đó, khi cố gắng thiết lập kết nối máy khách như đã trình bày trước đó, các khóa truy cập và khóa bí mật cần thiết sẽ được truy xuất từ nguồn môi trường thay vì được nhúng trực tiếp vào mã.
Ứng dụng khách được thành lập gần đây hỗ trợ vô số chức năng như tạo bảng và các hoạt động nhập/xuất dữ liệu.
DynamoDB hoạt động trên kiến trúc không có lược đồ, tương tự như các cơ sở dữ liệu NoSQL khác, cho phép bổ sung liền mạch các thuộc tính hoặc trường mới vào bảng hiện có mà không phát sinh chi phí đáng kể. Do đó, khi thiết lập bảng DynamoDB, cần chỉ định các thuộc tính cụ thể sẽ hoạt động như khóa chính để hỗ trợ quản lý và truy xuất dữ liệu hiệu quả.
Thật vậy, chúng ta hãy đi sâu vào một ví dụ về mã xây dựng một bảng mới có tên “Khách hàng” trong lĩnh vực dịch vụ DynamoDB của Amazon:
const createCustomerTable = async () => {
const params = {
TableName: "Customer",
AttributeDefinitions: [
{
AttributeName: "Email",
AttributeType: "S"
},
],
KeySchema: [
{
AttributeName: "Email",
KeyType: "HASH"
}
],
ProvisionedThroughput: {
ReadCapacityUnits: 5,
WriteCapacityUnits: 5
}
};
client.createTable(params, (err, data) => {
if (err) {
console.log(err);
} else {
console.log(data);
}
});
}
createCustomerTable();
Trường AttributionDefinitions dùng để chỉ định các đặc điểm chính của cấu trúc bảng bằng cách xác định các thuộc tính thiết yếu của nó cùng với các kiểu dữ liệu tương ứng của chúng. Trong trường hợp cụ thể này, thuộc tính Email được chỉ định là có kiểu dữ liệu dựa trên chuỗi được biểu thị bằng chữ viết tắt “S”. Các loại thuộc tính sẵn có khác bao gồm các giá trị số được biểu thị bằng “N” và dữ liệu nhị phân được đặc trưng bởi “B”.
Để truy xuất và sắp xếp dữ liệu trong bảng DynamoDB một cách hiệu quả, điều cần thiết là phải thiết lập một lược đồ khóa chính chỉ định một hoặc nhiều thuộc tính làm mã định danh duy nhất cho mỗi mục. Trong trường hợp này, vì chúng tôi đã chỉ định “Email” làm khóa chính nên nó phải được đưa vào KeySchema với KeyType được chỉ định là “HASH”. Điều này cho phép DynamoDB xác định và định vị các bản ghi cụ thể một cách hiệu quả dựa trên địa chỉ email của chúng.
Một tùy chọn thay thế khác cho thuộc tính KeyType là loại Phạm vi, đóng vai trò như một cơ chế sắp xếp khi được áp dụng cho các giá trị băm không duy nhất trong bảng cơ sở dữ liệu. Trong trường hợp nhiều bản ghi có giá trị băm giống nhau, việc sử dụng khóa phạm vi sẽ cho phép nhóm các bản ghi này dựa trên thông tin phân biệt bổ sung, chẳng hạn như ngày tháng hoặc màu sắc. Bằng cách sử dụng phương pháp này, người ta có thể tổ chức dữ liệu một cách có cấu trúc hơn một cách hiệu quả đồng thời tránh được những xung đột tiềm ẩn có thể phát sinh khi chỉ sử dụng khóa băm.
Khía cạnh thiết yếu thứ ba trong mã nói trên liên quan đến Thông lượng cung cấp, thiết lập tốc độ hoạt động đọc và ghi được phép cho bảng DynamoDB được chỉ định trên cơ sở mỗi giây.
Khi thực thi đoạn mã nói trên, người ta có thể mong đợi nhận được kết quả đầu ra dưới dạng:
Khi điều hướng đến bảng thông tin bảng DynamoDB trong giao diện web của Bảng điều khiển quản lý AWS, người ta có thể quan sát thấy bảng đang trong quá trình cung cấp hoặc đã được tạo thành công và hiện có trạng thái “hoạt động” hoặc “được cung cấp”.
Khi xác định các giá trị thích hợp cho ReadCapacityUnits và WriteCapacityUnits, điều quan trọng là phải đánh giá cẩn thận các yêu cầu cụ thể của ứng dụng của bạn để tránh các vấn đề tiềm ẩn về hiệu suất hoặc các khoản phí tăng cao trên tài khoản của bạn.
Khi bảng đã được thiết lập ở trạng thái hoạt động, bạn có thể thực hiện nhiều thao tác khác nhau liên quan đến việc tạo, đọc, cập nhật và xóa dữ liệu trong bảng nói trên.
Các ví dụ được cung cấp minh họa quá trình viết và lấy thông tin từ
⭐ Thêm dữ liệu vào bảng. Để ghi dữ liệu vào bảng, bạn cần phương thức putItem của máy khách. Mã bên dưới thêm khách hàng mới vào bảng Khách hàng trong DynamoDB.
const createCustomer = async (customer) => {
const params = {
TableName: "Customer",
Item: customer
}
client.putItem(params, (err, data) => {
if (err) {
console.error(err)
} else {
console.log(data)
}
})
}
const customerData = {
Name: { "S": "Timilehin O." },
Email: { "S": "[email protected]" },
Age: { "N": "18"},
Country: { "S": "Nigeria" }
}
createCustomer(customerData)
Đối tượng params chứa TableName là bảng bạn đang ghi vào và trường Item chứa dữ liệu bạn đang thêm cùng với các loại cụ thể của chúng. Hãy lưu ý các trường mới ban đầu không có trong bảng, đây là cách DynamoDB hoạt động linh hoạt. Bạn có thể xem dữ liệu trong cơ sở dữ liệu của mình trong bảng điều khiển như thế này:
⭐ Đọc dữ liệu từ bảng. DynamoDB cho phép bạn đọc dữ liệu theo nhiều cách khác nhau. Chức năng quét của SDK đọc toàn bộ bảng, trong khi getItem chỉ đọc dữ liệu cụ thể. Chẳng hạn, mã bên dưới có được tất cả khách hàng:
const getAllCustomers = async () => {
const params = {
TableName: "Customer"
}
const customers = await client.scan(params)
console.log(customers)
}
Trong khi đoạn mã sau lấy giá trị email của người dùng:
const getCustomerByEmail = async (email) => {
const params = {
TableName: "Customer",
Key: {
Email: { "S": email } // the type is always required
}
}
const customer = await client.getItem(params)
console.log(customer)
}
getCustomerByEmail("[email protected]")
⭐ Cập nhật dữ liệu vào bảng. Để cập nhật dữ liệu hiện có trong bảng, hãy sử dụng chức năng updateItem của SDK. Đoạn mã sau đây minh họa cách cập nhật một bản ghi cụ thể:
const updateCustomerLocation = async (email, age) => {
const params = {
TableName: "Customer",
Key: {
Email: { "S": email }
},
UpdateExpression: "SET Age = :newAge",
ExpressionAttributeValues: {
':newAge': { "N": age }
},
ReturnValues: "ALL_NEW"
}
const updatedCustomer = await client.updateItem(params)
console.log(updatedCustomer.Attributes)
}
Bạn cũng có thể chọn làm cho hàm của mình trở nên động bằng cách xây dựng các biểu thức cập nhật từ dữ liệu cập nhật của mình. Tính linh hoạt của DynamoDB cho phép bạn xử lý mọi thao tác theo nhu cầu của mình.
⭐ Xóa dữ liệu khỏi bảng. Để xóa một bản ghi khỏi DynamoDB, bạn cần có hàm deleteItem và khóa của bản ghi cụ thể. Đây là cách thực hiện nó:
const deleteCustomer = async (email) => {
const params = {
TableName: "Customer",
Key: {
Email: { "S": email }
}
}
client.deleteItem(params, (err, data) => {
if (err) {
console.error(err)
} else {
console.log("Customer deleted successfully")
}
})
}
deleteCustomer("[email protected]")
Xây dựng ứng dụng hiệu quả với DynamoDB
Amazon Web Services vẫn rất thành công và cung cấp nền tảng thân thiện với người dùng để phát triển các dịch vụ kỹ thuật số hiệu quả, đáng tin cậy đồng thời đảm bảo áp dụng các biện pháp bảo mật mạnh mẽ. Giải pháp DynamoDB thể hiện mình là một lựa chọn lý tưởng cho những ai đang tìm kiếm trải nghiệm cơ sở dữ liệu hợp lý, yêu cầu quản lý tối thiểu cơ sở hạ tầng hoặc giao thức bảo vệ cơ bản.
Bạn đã có được kiến thức và công cụ cần thiết để bắt đầu sử dụng DynamoDB trong dự án Node.js, cho phép bạn đưa ra quyết định sáng suốt về việc triển khai DynamoDB trong những nỗ lực trong tương lai.