Tìm hiểu về Azure Cosmos DB – Phần 2

Một tính năng không còn xa lạ với hầu hết các dịch vụ của Microsoft Azure – scale-out, Azure Cosmos DB có khả năng mở rộng dung lượng lưu trữ cũng như khả năng chịu tải tại 1 thời điểm (throughput) một cách linh hoạt dựa trên đơn vị Request Unit (RU)

Request unit

RU là đơn vị chuẩn hóa của Azure Cosmos DB nhằm đo số lượng tài nguyên như CPU, bộ nhớ RAM, số IOPS cần đến để xử lý các thao tác với database như thực hiện query đọc dữ liệu, ghi dữ liệu hay cập nhật dữ liệu trong database. Có thể coi RU là một đơn vị “tiền tệ” trong giao dịch của các hoạt động với database trên Cosmos DB.

Khi khởi tạo các container (collection trong document API, graph trong graph API và table trong table API) trong Cosmos DB, bạn cần phải khai báo trước 1 lượng throughput ban đầu cụ thể cho container đó như là một lượng RU dự trữ. Bạn có thể tham khảo công cụ ước lượng số RU cần theo một số tiêu chí đầu vào như số item, số lượng các thao tác CRUD trong 1 giây của bài toán của bạn tại đây. Ngoài RU, công cụ này cũng cho biết được số lượng dung lượng cần để lưu trữ là bao nhiêu.

Azure Cosmos DB cho phép bạn xây dựng cấu hình thoughput của container theo block 100 RU/s (100 RU trong 1 giây), đây là con số tối thiểu cho mỗi lần bạn tăng hoặc giảm cấu hình thoughput của Cosmos DB. Một điểm hay của Cosmos DB đó là cho phép bạn kết hợp cấu hình thoughput giữa 2 đơn vị RU/s và RU/m (RU trong 1 phút). Với mỗi 100 RU/s được thêm vào throughput, bạn sẽ nhận được 1000 RU/m, tức 10 lần số lượng RU/s. Việc kết hợp 2 đơn vị này cho phép tiết kiệm chi phí lên tới 75% so với chỉ sử dụng cấu hình RU/s, cùng xem một ví dụ sau:

Đây là một biểu đồ biểu diễn số lượng RU thiêu thụ của 1 Azure Cosmos DB với cấu hình throughput ban đầu có hạn ngạch (quota) là 10,000 RU/s và tùy chọn sử dụng song song với RU/m có quota là 100,000 RU/m.

  • Ở trong khoảng từ giây đầu tiên đến giây thứ 3, tổng số lượng RU tiêu thu ở mức dưới 10,000 RU, do vậy số RU ở 2 giây đầu này sẽ rút từ “kho” RU/s.
  • Ở giây thứ 3, số lượng RU tăng vọt với 11,010 RU được thực hiện, con số này vượt quá quota 10,000 của RU/s tổng cộng 1010 RU. Tuy nhiên do có sử dụng song song RU/m, 1010 RU này được rút từ “kho” RU/m và tại thời điểm đó, quota của kho RU/m là 98,990 RU cho 57 giây còn lại cho 1 block thời gian 1 phút của RU/m.
  • Trong khoảng thời gian từ giây thứ 3 tới giây thứ 29, trong khoảng thời gian này có một vài thời điểm có biến động số lượng RU thực hiện trong 1 giây vượt quá 10,000 và được rút từ kho RU/m, làm giảm quota của RU/m xuống còn 92,323.
  • Tại giây thứ 29, một lượng lớn RU được thực hiện, gấp hơn 4 lần quota của RU/s, với 46,920 RU được thực hiện, kéo quota của RU/m xuống 55,403.
  • Tại giây thứ 61, quota của RU/m được reset về 100,000.

Qua ví dụ trên bạn có thể thấy được rằng RU/m đã giúp Azure Cosmos DB xử lý được những thời điểm có lượng RU vượt quá quota của thiết lập RU/s ban đầu. Câu hỏi đặt ra tại sao không thiết lập quote của RU/s cao lên, 47,000 RU chẳng hạn (số RU tối đa trong 1 giây ở ví dụ trên)? Bạn hoàn toàn có thể thiết lập như vậy tuy nhiên có 2 vấn đề:

  • Thiết lập dự trữ 1 lượng lớn RU/s trong khi số lượng thiêu thụ trung bình thực tế lại nhỏ hơn nhiều số dự trữ và số lượng RU thực hiện tại 1 giây đạt hoặc gần đạt số quota của RU/s xảy ra không nhiều.
  • Thiết lập quota của RU/s cao lên đồng nghĩa với tổng chỉ phí cho Azure Cosmos DB tăng lên. Tính đến thời điểm viết bài viết này, chi phí cho mỗi block 100 RU/s là $0.008/giờ và cho mỗi block 1000 RU/m là $0.002688/giờ (tham khảo giá chính xác tại đây), cùng làm 1 phép tính đơn giản:

Không sử dụng RU/m, cấu hình với throughput tối đa 47,000 RU/s:

Số lượng RU/s Giá mỗi block 100 RU/s Tổng chi phí cho 1 tháng sử dụng Azure Cosmos DB tương đương 744 giờ
47,000 $0.008 $279.74

Sử dụng RU/m, cấu hình với throughput tối đa 10,000 RU/s với 100,000 RU/m:

Số lượng RU/s Giá mỗi block 100 RU/s Số lượng RU/m Giá mỗi block 1000 RU/m (làm tròn) Tổng chi phí cho 1 tháng sử dụng Azure Cosmos DB tương đương 744 giờ
10,000 $0.008 10,000 $0.003 $79.52

Có thể thấy chi phí sử dụng RU/m rẻ hơn rất nhiều (khoảng 73%) so với không sử dụng tuy nhiên vẫn giải quyết được bài toán xử lý cho 47,000 RU trong 1 giây ở 1 số thời điểm “peek”.

Điều gì xảy ra nếu vượt quá throughput?

Trong trường hợp số lượng quota RU/s và RU/m bị rút hết, Cosmos DB sẽ đóng request lại và trả về mã lỗi 429 - RequestRateTooLargeException kèm theo số millisecond là thời gian cần phải chờ để có thể thử lại trong header x-ms-retry-after-ms.

Một header ví dụ của trường hợp vượt quá throughput với thời gian chờ là 58 ms:

Azure Cosmos DB Emulator

Để bắt đầu với Azure Cosmos DB bạn có thể tạo mới dịch vụ Cosmos DB trên Azure portal. Tuy nhiên, bạn cũng có thể trải nghiệm & phát triển ứng dụng với Azure Cosmos DB ngay trên máy local của mình thông qua bộ Azure Cosmos DB Emulator.

Azure Cosmos DB Emulator là bộ giả lập môi trường Azure Cosmos DB ngay trong máy local. Với Azure Cosmos DB Emulator thì bạn có thể phát triển ứng dụng với Azure Cosmos DB mà không cần có subscription của Microsoft Azure cũng như không phải lo lắng vấn đề thu phí sử dụng trong quá trình phát triển.

Lưu ý: Máy local của bạn cần phải có tối thiểu 2 GB RAM và 10 GB ổ đĩa trống để có thể sử dụng được Azure Cosmos DB Emulator.

Tìm hiểu thêm về Azure Cosmos DB Emulator tại đây.

Kết luận

Nằm trong bộ dịch vụ NoSQL PaaS của Microsoft Azure, Cosmos DB mang tới cho các nhà phát triển một giải pháp lưu trữ NoSQL database hỗ trợ nhiều data model cùng khả năng phân phối dữ liệu ở phạm vi toàn cầu.

Azure Cosmos DB phù hợp cho các bài toán có ứng dụng phân phối ở phạm vi toàn cầu cần đảm bảo độ trễ thấp khi truy suất dữ liệu, hay các bài toán về IoT với các yêu cầu về một database có khả năng chịu tải lớn phục vụ cho real-time analytics, hỗ trợ scale linh hoạt cũng như hỗ trợ thực hiện các adhoc query với hiệu suất cao.

Trên là những giới thiệu nhanh qua về Cosmos DB và một số đặc điểm thú vị của dịch vụ này. Thực ra còn một số điểm thú vị khác nữa tuy nhiên mình sẽ để dành chia sẻ ở một bài viết khác :). Hy vọng bài viết này một phần nào mang đến cho bạn một cái nhìn cũng khá chi tiết về dịch vụ Azure Cosmos DB mới này!

Update 11/9/2017: Microsoft vừa cho ra mắt chương trình Try Azure Cosmos DB for free, mang đến cho lập trình viên cơ hội trải nghiệm các tính năng của Azure Cosmos DB hoàn toàn miễn phí trong 24 tiếng. Sau 24 tiếng, bạn có thể đăng ký để gia hạn thêm thời gian để tiếp tục sử dụng. Thông tin chi tiết về chương trình trên bạn có thể tham khảo thêm tại đây.

Phạm Dũng

Anh Phạm Dũng là chuyên gia các giải pháp phát triển công nghệ Microsoft, hiện đang làm tại Mỹ. Anh Dũng có 5 năm kinh nghiệm phát triển phần mềm, đặc biệt là trên các platform và sản phẩm của Microsoft. Đến với AzureVN.NET, anh Dũng hi vọng sẽ chia sẻ về các kinh nghiệm, thông tin về Microsoft Azure và hướng tiếp cận để phát triển trên nền tảng Azure.

lion-pham has 11 posts and counting.See all posts by lion-pham

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.