Tìm hiểu về DynamoDB Transactional Request? Khác gì với Batch*API và request thông thường trong Dynamodb

Bài này Kevin chia sẻ về Transactional Request sử dụng trong DynamoDB. Đây là một tính năng mới được giới thiệu ở re:invent 2018 có nghĩa là cũng khá mới. DynamoDB lần đầu giới thiệu vào năm 2012 trải qua rất nhiều lần phát triển evolution. AWS luôn tự re:invent các công nghệ và dịch vụ của mình. Lần đầu tiên ra mắt DynamoDB không có các tính năng cao cấp như DynamoDB Streams, quét song song (parallel scans), hay secondary index mở rộng khả năng tìm kiếm.

DynamoDB Transactional Request được giới thiệu ở re:invent 2018. Đây là một tính năng rất hay ho cho các nhà phát triển và thiết kế phần mềm đòi hỏi tính khắt khe của tính thống nhất của dữ liệu lưu trữ trong dynamodb table.

Với DynamoDB transactional, bạn có thể định nghĩa một tập các lệnh đọc hoặc ghi (read or write) vào các tables của DynamoDB trong cùng AWS Region. AWS gọi điều này là “batch of items”. Điểm đặc biệt khi định nghĩa các action trong cùng một transaction có tính chất kéo theo, là phải thành công hết hoặc chỉ cần 1 cái fail sẽ failed hết. Điều này giúp tính toàn vẹn consistency của dữ liệu khi có một tập hành động đọc hoặc ghi vào nhiều tables cùng lúc (nhưng vẫn phải cùng AWS Region).

Việc này cực kỳ hữu ích trong các ứng dụng scale lớn phát triển khi dùng dynamodb, giúp đơn giản hóa các workflow bao gồm nhiều requests trên nhiều items.

Sử dụng dynamodb Transactional APIs

Để sử dụng tính năng dynamodb transactional AWS cung cấp hai hàm sử dụng là TransactWriteItems và TransactGetItems. Cả hai transactional API đều có giới hạn là 25 items trong một lần gọi.

AWS Dynamodb có một API khác cũng khá dễ nhầm lẫn với Transactional APIs đó là Batch APIs đó là: BatchGetItems (giới hạn 100 items per time), và BatchWriteItems (giới hạn 25 items per time) . Có 2 sự khác biệt giữa Batch* APIs và Transact* APIs:

  • Chi phí của Transact* APIs gấp 2 lần capacity so với bình thường.
    • Ví dụ một lệnh Write 2 items, mỗi item kích thước 1KB với TransactWriteAPI sẽ tốn 4 RCU (gấp đôi write request thông thường).
  • Với Transact*API phải thành công hết mới thành công, hoặc fail cả. Đây cũng chính là lợi ích chính khi thiết kế phần mềm dùng Transact*API.

Lý do dynamodb transactional request bị failed?

Do lợi ích đọc hoặc ghi theo nhóm, thành công là phải thành công hết hoặc failed. Nên ta cũng điểm qua một số lý do failed phổ biến để việc thiết kế ứng dụng được đúng đắn hơn.

  1. Vi phạm condition trong yêu cầu Write dẫn đến fail toàn bộ transaction.
  2. Transaction conflict: bạn yêu cầu đọc một item, trong cùng lúc đó có TransactWriteAPI vào đúng item đó. Ta có thể sử dụng CloudWatch Metrics để theo dõi các confliction này.
  3. Hết năng lực đọc ghi của table đó.

%d bloggers like this: