Kỳ vọng của khách hàng và nhu cầu ứng dụng tương ứng chưa bao giờ cao hơn thế. Người dùng mong đợi các ứng dụng phải nhanh, đáng tin cậy và khả dụng. Hơn nữa, dữ liệu là vua và người dùng muốn có thể chia nhỏ dữ liệu tổng hợp khi cần để tìm thông tin chi tiết. Người dùng không muốn đợi các kỹ sư dữ liệu cung cấp chỉ mục mới hoặc xây dựng chuỗi ETL mới. Họ muốn truy cập tự do vào dữ liệu mới nhất hiện có. Nhưng việc xử lý tất cả các nhu cầu ứng dụng của bạn là một nhiệm vụ khó khăn đối với bất kỳ cơ sở dữ liệu nào. Đối với cơ sở dữ liệu, việc tối ưu hóa cho các hoạt động thường xuyên, độ trễ thấp trên từng bản ghi riêng lẻ khác với việc tối ưu hóa cho các hoạt động tổng hợp ít thường xuyên hơn hoặc lọc nhiều trên nhiều bản ghi. Nhiều khi, chúng tôi cố gắng xử lý cả hai mẫu với cùng một cơ sở dữ liệu và giải quyết vấn đề hiệu suất không nhất quán khi ứng dụng của chúng tôi mở rộng quy mô. Chúng ta nghĩ rằng mình đang tối ưu hóa để đạt được nỗ lực hoặc chi phí tối thiểu, trong khi thực tế chúng ta đang làm điều ngược lại. Việc chạy phân tích trên cơ sở dữ liệu OLTP thường yêu cầu chúng tôi cung cấp quá mức cơ sở dữ liệu để tính đến lưu lượng truy cập cao nhất. Điều này sẽ tốn rất nhiều tiền và thường không mang lại trải nghiệm hài lòng cho người dùng cuối. Trong hướng dẫn này, chúng ta sẽ xem cách giải quyết nhu cầu cao của người dùng bằng cả hai mẫu truy cập này. Chúng tôi sẽ xây dựng một ứng dụng tài chính trong đó người dùng ghi lại các giao dịch và xem các giao dịch gần đây, đồng thời muốn lọc hoặc tổng hợp phức tạp các giao dịch trước đây của họ. Phương pháp tiếp cận kết hợp Để đáp ứng nhu cầu ứng dụng của chúng tôi, chúng tôi sẽ sử dụng với . DynamoDB sẽ xử lý các mẫu truy cập giao dịch cốt lõi của chúng tôi -- ghi lại các giao dịch đồng thời cung cấp nguồn cấp dữ liệu về các giao dịch gần đây để người dùng duyệt qua. Rockset sẽ bổ sung cho DynamoDB để xử lý các mẫu truy cập "thú vị" và nặng về dữ liệu của chúng tôi. Chúng tôi sẽ cho phép người dùng lọc theo thời gian, người bán, danh mục hoặc các trường khác để tìm các giao dịch có liên quan hoặc thực hiện các phép tổng hợp mạnh mẽ để xem xu hướng chi tiêu theo thời gian. Amazon DynamoDB Rockset Khi nghiên cứu các mô hình này, chúng ta sẽ thấy mỗi hệ thống này phù hợp với công việc hiện tại như thế nào. DynamoDB vượt trội trong các hoạt động OLTP cốt lõi -- đọc hoặc ghi một mục riêng lẻ hoặc tìm nạp nhiều mục tuần tự dựa trên các bộ lọc đã biết. Do cách phân vùng dữ liệu dựa trên khóa chính, DynamoDB có thể cung cấp hiệu suất nhất quán cho các loại truy vấn này ở mọi quy mô. Ngược lại, Rockset vượt trội trong việc nhập liên tục một lượng lớn dữ liệu và sử dụng nhiều chiến lược lập chỉ mục trên dữ liệu đó để cung cấp khả năng lọc có tính chọn lọc cao, tổng hợp thời gian thực hoặc thời gian truy vấn và các mẫu khác mà DynamoDB không thể xử lý dễ dàng. Khi xem xét ví dụ này, chúng ta sẽ tìm hiểu cả các khái niệm cơ bản làm cơ sở cho hai hệ thống cũng như các bước thực tế để hoàn thành mục tiêu của mình. Bạn có thể theo dõi ứng dụng bằng cách sử dụng . repo GitHub Triển khai các tính năng cốt lõi với DynamoDB Chúng tôi sẽ bắt đầu hướng dẫn này bằng cách triển khai các tính năng cốt lõi của ứng dụng của chúng tôi. Đây là điểm khởi đầu chung cho bất kỳ ứng dụng nào, khi bạn xây dựng các thao tác "CRUDL" tiêu chuẩn để cung cấp khả năng thao tác các bản ghi riêng lẻ và liệt kê một tập hợp các bản ghi liên quan. Đối với một ứng dụng thương mại điện tử, đây sẽ là chức năng đặt hàng và xem các đơn hàng trước đó. Đối với ứng dụng mạng xã hội, việc này sẽ là tạo bài đăng, thêm bạn bè hoặc xem những người bạn theo dõi. Chức năng này thường được triển khai bởi cơ sở dữ liệu chuyên về , nhấn mạnh nhiều hoạt động đồng thời trên một số lượng nhỏ hàng. quy trình xử lý giao dịch trực tuyến (OLTP) Trong ví dụ này, chúng tôi đang xây dựng một ứng dụng tài chính doanh nghiệp nơi người dùng có thể thực hiện và nhận thanh toán cũng như xem lịch sử giao dịch của họ. Ví dụ này sẽ được cố ý đơn giản hóa cho hướng dẫn này, nhưng bạn có thể nghĩ ra ba mẫu truy cập cốt lõi cho ứng dụng của chúng tôi: , sẽ lưu trữ hồ sơ thanh toán mà doanh nghiệp đã thực hiện hoặc nhận được; Ghi lại giao dịch , điều này sẽ cho phép người dùng xem các khoản thanh toán gần đây nhất mà doanh nghiệp đã thực hiện và nhận; Và Xem các giao dịch theo phạm vi ngày , điều này sẽ cho phép người dùng đi sâu vào chi tiết cụ thể của một giao dịch. Xem giao dịch riêng lẻ Mỗi mẫu truy cập này đều là một mẫu truy cập quan trọng, có số lượng lớn. Chúng tôi sẽ liên tục ghi lại các giao dịch của người dùng và nguồn cấp dữ liệu giao dịch sẽ là chế độ xem đầu tiên khi họ mở ứng dụng. Hơn nữa, mỗi mẫu truy cập này sẽ sử dụng các tham số nhất quán, đã biết để tìm nạp (các) bản ghi liên quan. Chúng tôi sẽ sử dụng DynamoDB để xử lý các mẫu truy cập này. DynamoDB là cơ sở dữ liệu NoSQL do AWS cung cấp. Đó là cơ sở dữ liệu được quản lý hoàn toàn và ngày càng phổ biến trong cả ứng dụng quy mô cao và ứng dụng không có máy chủ. Một trong những tính năng độc đáo nhất của DynamoDB là cách nó cung cấp hiệu suất ổn định ở mọi quy mô. Cho dù bảng của bạn là 1 megabyte hay 1 petabyte, bạn sẽ thấy thời gian phản hồi giống nhau cho các hoạt động của mình. Đây là chất lượng mong muốn cho các trường hợp sử dụng OLTP cốt lõi giống như những trường hợp chúng tôi đang triển khai ở đây. Đây là một thành tựu kỹ thuật tuyệt vời và có giá trị, nhưng điều quan trọng là phải hiểu rằng nó đạt được bằng cách chọn lọc các loại truy vấn sẽ hoạt động tốt. DynamoDB có thể cung cấp hiệu suất nhất quán này thông qua hai quyết định thiết kế cốt lõi. Đầu tiên, mỗi bản ghi trong bảng DynamoDB của bạn phải bao gồm một khóa chính. Khóa chính này được tạo thành từ khóa phân vùng cũng như khóa sắp xếp tùy chọn. Quyết định thiết kế khóa thứ hai cho DynamoDB là API thực thi nghiêm ngặt việc sử dụng khóa chính - sẽ nói thêm về điều này sau. Trong hình ảnh bên dưới, chúng tôi có một số dữ liệu giao dịch mẫu trong ứng dụng FinTech của mình. Bảng của chúng tôi sử dụng khóa phân vùng của tên tổ chức trong ứng dụng của chúng tôi, cộng với khóa sắp xếp dựa trên cung cấp các đặc điểm duy nhất của UUID cộng với khả năng sắp xếp theo thời gian tạo cho phép chúng tôi thực hiện các truy vấn dựa trên thời gian. ULID Các bản ghi trong bảng của chúng tôi bao gồm các thuộc tính khác, như tên người bán, danh mục và số tiền, hữu ích trong ứng dụng của chúng tôi nhưng không quan trọng bằng kiến trúc cơ bản của DynamoDB. Phần quan trọng nằm ở khóa chính và cụ thể là khóa phân vùng. Tóm lại, DynamoDB sẽ chia dữ liệu của bạn thành nhiều phân vùng lưu trữ, mỗi phân vùng chứa một tập hợp con dữ liệu trong bảng của bạn. DynamoDB sử dụng thành phần khóa phân vùng của khóa chính để gán một bản ghi nhất định cho một phân vùng lưu trữ cụ thể. Khi lượng dữ liệu trong bảng hoặc lưu lượng truy cập vào bảng của bạn tăng lên, DynamoDB sẽ thêm các phân vùng như một cách để mở rộng quy mô cơ sở dữ liệu của bạn theo chiều ngang. Như đã đề cập ở trên, quyết định thiết kế khóa thứ hai cho DynamoDB là API thực thi nghiêm ngặt việc sử dụng khóa chính. Hầu như tất cả các hành động API trong DynamoDB đều yêu cầu ít nhất khóa phân vùng của khóa chính của bạn. Nhờ đó, DynamoDB có thể nhanh chóng định tuyến mọi yêu cầu đến phân vùng lưu trữ thích hợp, bất kể số lượng phân vùng và tổng kích thước của bảng. Với hai sự cân bằng này, chắc chắn sẽ có những hạn chế trong cách bạn sử dụng DynamoDB. Bạn phải lập kế hoạch và thiết kế cẩn thận trước cho các mẫu truy cập của mình vì khóa chính của bạn phải liên quan đến các mẫu truy cập của bạn. Việc thay đổi kiểu truy cập của bạn sau này có thể khó khăn và có thể yêu cầu một số bước di chuyển thủ công. Khi trường hợp sử dụng của bạn nằm trong phạm vi năng lực cốt lõi của DynamoDB, bạn sẽ thu được lợi ích. Bạn sẽ nhận được hiệu suất nhất quán, có thể dự đoán được bất kể quy mô và bạn sẽ không thấy ứng dụng của mình xuống cấp lâu dài theo thời gian. Hơn nữa, bạn sẽ có được trải nghiệm được quản lý hoàn toàn với gánh nặng vận hành thấp, cho phép bạn tập trung vào những gì quan trọng đối với doanh nghiệp. Các hoạt động cốt lõi trong ví dụ của chúng tôi hoàn toàn phù hợp với mô hình này. Khi truy xuất nguồn cấp dữ liệu giao dịch cho một tổ chức, chúng tôi sẽ có sẵn ID tổ chức trong ứng dụng của mình. ID này sẽ cho phép chúng tôi sử dụng thao tác DynamoDB để tìm nạp một tập hợp bản ghi liền kề có cùng khóa phân vùng. Để truy xuất thông tin chi tiết bổ sung về một giao dịch cụ thể, chúng tôi sẽ có sẵn cả ID tổ chức và ID giao dịch để thực hiện yêu cầu DynamoDB nhằm tìm nạp mục mong muốn. Truy vấn GetItem Bạn có thể thấy các thao tác này hoạt động với . Làm theo hướng dẫn để triển khai ứng dụng và tạo dữ liệu mẫu cho ứng dụng đó. Sau đó, thực hiện các yêu cầu HTTP tới dịch vụ đã triển khai để tìm nạp nguồn cấp dữ liệu giao dịch cho từng người dùng. Các hoạt động này sẽ hoạt động nhanh chóng, hiệu quả bất kể số lượng yêu cầu đồng thời hay kích thước bảng DynamoDB của bạn. ứng dụng mẫu Bổ sung DynamoDB bằng Rockset Cho đến nay, chúng tôi đã sử dụng DynamoDB để xử lý các mẫu truy cập cốt lõi của mình. DynamoDB rất phù hợp với các mẫu này vì khả năng phân vùng dựa trên khóa của nó sẽ mang lại hiệu suất ổn định ở mọi quy mô. Tuy nhiên, DynamoDB không giỏi xử lý các mẫu hình truy cập khác. DynamoDB không cho phép bạn truy vấn hiệu quả theo các thuộc tính không phải khóa chính. Bạn có thể sử dụng để lập chỉ mục lại dữ liệu của mình theo các thuộc tính bổ sung, nhưng vẫn có thể có vấn đề nếu bạn có nhiều thuộc tính khác nhau có thể được sử dụng để lập chỉ mục dữ liệu của mình. chỉ mục phụ của DynamoDB Ngoài ra, DynamoDB không cung cấp bất kỳ chức năng tổng hợp nào ngay lập tức. Bạn có thể tính toán các tập hợp của riêng mình bằng cách sử dụng DynamoDB, nhưng nó có thể bị giảm tính linh hoạt hoặc mức tiêu thụ đọc không được tối ưu hóa so với giải pháp được thiết kế để tổng hợp từ trước. Để xử lý các mẫu này, chúng tôi sẽ . bổ sung Rockset cho DynamoDB Rockset được coi là tốt nhất như một bộ chỉ mục phụ trên dữ liệu của bạn. Rockset chỉ sử dụng các chỉ mục này tại thời điểm truy vấn và không chiếu lại bất kỳ tải nào vào DynamoDB trong quá trình đọc. Thay vì cập nhật giao dịch riêng lẻ từ ứng dụng khách của bạn, Rockset được thiết kế để nhập trực tuyến, liên tục từ kho dữ liệu chính của bạn. Nó có các trình kết nối trực tiếp cho một số kho dữ liệu chính, bao gồm DynamoDB, MongoDB, Kafka và nhiều cơ sở dữ liệu quan hệ. Khi Rockset nhập dữ liệu từ cơ sở dữ liệu chính của bạn, nó sẽ lập chỉ mục dữ liệu của bạn trong , mượn các khái niệm từ: chỉ mục hàng, chỉ mục đảo ngược và chỉ mục cột. Các chỉ mục bổ sung, chẳng hạn như phạm vi, loại và không gian địa lý được tạo tự động dựa trên loại dữ liệu được nhập. Chúng tôi sẽ thảo luận chi tiết cụ thể về các chỉ mục này bên dưới, nhưng Chỉ mục hội tụ này cho phép các mẫu truy cập linh hoạt hơn vào dữ liệu của bạn. Chỉ mục hội tụ Đây là khái niệm cốt lõi đằng sau Rockset -- nó là chỉ mục phụ trên dữ liệu của bạn bằng cách sử dụng đường dẫn nhập gần như theo thời gian thực, được quản lý hoàn toàn từ kho dữ liệu chính của bạn. Các nhóm từ lâu đã trích xuất dữ liệu từ DynamoDB để chèn vào một hệ thống khác nhằm xử lý các trường hợp sử dụng bổ sung. Trước khi chúng ta đi vào chi tiết cụ thể về cách Rockset nhập dữ liệu từ bảng của bạn, hãy thảo luận ngắn gọn về sự khác biệt của Rockset so với các tùy chọn khác trong không gian này. Có một số khác biệt cốt lõi giữa Rockset và các phương pháp tiếp cận khác. Thứ nhất, Rockset được quản lý hoàn toàn. Bạn không những không cần phải quản lý cơ sở hạ tầng cơ sở dữ liệu mà còn không cần duy trì quy trình để trích xuất, chuyển đổi và tải dữ liệu vào Rockset. Với nhiều giải pháp khác, bạn chịu trách nhiệm về mã "keo dán" giữa các hệ thống của mình. Các hệ thống này rất quan trọng nhưng dễ bị lỗi vì bạn phải phòng thủ trước mọi thay đổi trong cấu trúc dữ liệu. Những thay đổi ở thượng nguồn có thể gây ra tổn thất ở hạ nguồn cho những người duy trì các hệ thống này. Thứ hai, Rockset có thể xử lý dữ liệu thời gian thực theo cách có thể thay đổi được. Với nhiều hệ thống khác, bạn sẽ có được cái này hay cái kia. Bạn có thể chọn thực hiện xuất định kỳ và tải hàng loạt dữ liệu của mình, nhưng điều này dẫn đến dữ liệu cũ giữa các lần tải. Ngoài ra, bạn có thể truyền dữ liệu vào kho dữ liệu của mình theo kiểu chỉ bổ sung, nhưng bạn không thể thực hiện cập nhật tại chỗ khi thay đổi dữ liệu. Rockset có thể xử lý các cập nhật trên các mục hiện có một cách nhanh chóng và hiệu quả khi nó chèn dữ liệu mới và do đó có thể cung cấp cho bạn cái nhìn thời gian thực về dữ liệu đang thay đổi của bạn. Thứ ba, Rockset tự động tạo các chỉ mục. Các giải pháp 'được quản lý hoàn toàn' khác vẫn yêu cầu bạn định cấu hình các chỉ mục khi bạn cần chúng để hỗ trợ các truy vấn mới. Công cụ truy vấn của Rockset được thiết kế để sử dụng một bộ chỉ mục nhằm hỗ trợ bất kỳ và tất cả các truy vấn. Khi bạn thêm ngày càng nhiều truy vấn vào hệ thống của mình, bạn không cần thêm các chỉ mục bổ sung, điều này chiếm ngày càng nhiều không gian và tài nguyên tính toán. Điều này cũng có nghĩa là các truy vấn đặc biệt cũng có thể tận dụng tối đa các chỉ mục, giúp chúng hoạt động nhanh chóng mà không cần đợi quản trị viên thêm chỉ mục riêng để hỗ trợ chúng. Cách Rockset nhập dữ liệu từ DynamoDB Bây giờ chúng ta đã biết kiến thức cơ bản về Rockset là gì và nó giúp ích như thế nào, hãy kết nối bảng DynamoDB với Rockset. Khi làm như vậy, chúng ta sẽ tìm hiểu cách hoạt động của quá trình nhập Rockset và nó khác với các tùy chọn khác như thế nào. Rockset có các trình kết nối chuyên dụng cho một số nguồn dữ liệu và việc triển khai trình kết nối cụ thể phụ thuộc vào thông tin cụ thể của nguồn dữ liệu ngược dòng. Để kết nối với DynamoDB, Rockset dựa vào . Luồng DynamoDB là tính năng thu thập dữ liệu thay đổi từ DynamoDB, trong đó thông tin chi tiết về từng thao tác ghi vào bảng DynamoDB được ghi lại trong luồng. Người tiêu dùng của luồng có thể xử lý những thay đổi này theo cùng thứ tự chúng xảy ra với bảng để cập nhật các hệ thống hạ nguồn. Luồng DynamoDB Luồng DynamoDB là công cụ tuyệt vời để Rockset cập nhật bảng DynamoDB gần như theo thời gian thực, nhưng đó không phải là toàn bộ câu chuyện. Luồng DynamoDB chỉ chứa các bản ghi về thao tác ghi xảy ra sau khi Luồng được bật trên bảng. Hơn nữa, . Các thao tác xảy ra trước khi luồng được bật hoặc hơn 24 giờ trước sẽ không xuất hiện trong luồng. Luồng DynamoDB chỉ lưu giữ các bản ghi trong 24 giờ Nhưng Rockset không chỉ cần dữ liệu gần đây nhất mà còn cần tất cả dữ liệu trong cơ sở dữ liệu của bạn để trả lời chính xác các truy vấn của bạn. Để xử lý vấn đề này, nó thực hiện xuất hàng loạt ban đầu (sử dụng Quét DynamoDB hoặc , tùy thuộc vào kích thước bảng của bạn) để lấy trạng thái ban đầu của bảng. xuất sang S3 Như vậy, quá trình kết nối DynamoDB của Rockset gồm 2 phần: Quá trình ban đầu để xuất bảng đầy đủ của bạn để đưa vào Rockset; khởi động Một quy trình , tiếp theo để sử dụng các bản cập nhật từ Dòng DynamoDB của bạn và cập nhật dữ liệu trong Rockset. liên tục Lưu ý rằng cả hai quy trình này đều được Rockset quản lý hoàn toàn và minh bạch đối với bạn với tư cách là người dùng. Bạn sẽ không chịu trách nhiệm duy trì các quy trình này và phản hồi cảnh báo nếu có lỗi. Hơn nữa, nếu bạn chọn phương thức xuất S3 cho quy trình nhập ban đầu thì cả hai quy trình nhập Rockset sẽ không tiêu thụ đơn vị dung lượng đọc từ bảng chính của bạn. Do đó, Rockset sẽ không lấy mức tiêu thụ từ các trường hợp sử dụng ứng dụng của bạn hoặc ảnh hưởng đến khả năng sẵn sàng sản xuất. Ứng dụng: Kết nối DynamoDB với Rockset Trước khi chuyển sang sử dụng Rockset trong ứng dụng của chúng ta, hãy kết nối Rockset với bảng DynamoDB. Đầu tiên, chúng ta cần tạo một sự tích hợp mới giữa Rockset và bảng của chúng ta. Chúng tôi sẽ hướng dẫn các bước cấp cao bên dưới nhưng bạn có thể tìm thấy nếu cần. hướng dẫn từng bước chi tiết hơn trong kho ứng dụng Trong bảng điều khiển Rockset, điều hướng đến để bắt đầu quá trình này. trình hướng dẫn tích hợp mới Trong trình hướng dẫn tích hợp, chọn làm loại tích hợp của bạn. Sau đó nhấn để chuyển sang bước tiếp theo. Amazon DynamoDB Start Trình hướng dẫn tích hợp DynamoDB có hướng dẫn từng bước để ủy quyền cho Rockset truy cập vào bảng DynamoDB của bạn. Điều này yêu cầu tạo chính sách IAM, vai trò IAM và bộ chứa S3 để xuất bảng của bạn. Bạn có thể làm theo các hướng dẫn đó để tạo tài nguyên theo cách thủ công nếu muốn. Trong thế giới không có máy chủ, chúng tôi ưu tiên tạo ra mọi thứ thông qua nhiều nhất có thể và điều đó bao gồm các tài nguyên hỗ trợ này. cơ sở hạ tầng dưới dạng mã Kho lưu trữ ví dụ bao gồm cơ sở hạ tầng dưới dạng mã cần thiết để tạo tài nguyên tích hợp Rockset. Để sử dụng những giá trị này, trước tiên hãy tìm các giá trị ID tài khoản Rockset và ID bên ngoài ở cuối trình hướng dẫn tích hợp Rockset. Sao chép và dán các giá trị này vào khối của tệp serverless.yml. Sau đó, để tạo các tài nguyên này. các phần có liên quan của custom bỏ ghi chú các tài nguyên trên dòng 71 đến 122 của serverless.yml Triển khai lại ứng dụng của bạn để tạo các tài nguyên mới này. Trong kết quả đầu ra từ quá trình triển khai, hãy sao chép và dán tên bộ chứa S3 cũng như ARN vai trò IAM vào những vị trí thích hợp trong bảng điều khiển Rockset. Sau đó, nhấp vào nút Lưu tích hợp để lưu tích hợp của bạn. Sau khi tạo xong tiện ích tích hợp, bạn sẽ cần tạo từ tiện ích tích hợp. Điều hướng đến trong bảng điều khiển Rockset và làm theo các bước để sử dụng tiện ích tích hợp của bạn nhằm tạo bộ sưu tập. Bạn cũng có thể tìm thấy trong kho ứng dụng. bộ sưu tập Rockset trình hướng dẫn tạo bộ sưu tập hướng dẫn từng bước để tạo bộ sưu tập Nhìn chung, khi bạn đã hoàn tất kết nối này, trên một tập hợp phiên bản có kích thước phù hợp, các thao tác chèn, cập nhật hoặc xóa dữ liệu trong DynamoDB sẽ được phản ánh trong chỉ mục của Rockset và có sẵn để truy vấn trong vòng chưa đầy 2 giây. Sử dụng Rockset để lọc phức tạp Bây giờ chúng ta đã kết nối Rockset với bảng DynamoDB, hãy xem cách Rockset có thể kích hoạt các mẫu truy cập mới trên dữ liệu hiện có của chúng ta. Hãy nhớ lại trong phần tính năng cốt lõi của chúng tôi rằng DynamoDB tập trung chủ yếu vào các khóa chính của bạn. Bạn phải sử dụng khóa chính để truy cập dữ liệu của mình một cách hiệu quả. Theo đó, chúng tôi đã cấu trúc bảng của mình để sử dụng tên tổ chức và thời gian giao dịch trong khóa chính của mình. Cấu trúc này phù hợp với các mẫu truy cập cốt lõi của chúng tôi, nhưng chúng tôi có thể muốn cung cấp một cách linh hoạt hơn để người dùng duyệt qua các giao dịch của họ. Có một số thuộc tính hữu ích -- danh mục, tên người bán, số tiền, v.v. -- có thể hữu ích trong việc lọc. Chúng tôi có thể sử dụng các chỉ mục phụ của DynamoDB để cho phép lọc trên nhiều thuộc tính hơn, nhưng cách đó vẫn chưa phù hợp ở đây. Cấu trúc khóa chính của DynamoDB không dễ dàng cho phép truy vấn linh hoạt liên quan đến sự kết hợp của nhiều thuộc tính tùy chọn. Bạn có thể có chỉ mục phụ để lọc theo tên và ngày của người bán, nhưng bạn sẽ cần một chỉ mục phụ khác nếu muốn cho phép lọc theo tên, ngày và số lượng của người bán. Mẫu truy cập lọc theo danh mục sẽ yêu cầu chỉ mục phụ thứ ba. Thay vì giải quyết sự phức tạp đó, chúng ta sẽ dựa vào Rockset ở đây. Trước đây chúng ta đã thấy rằng Rockset sử dụng Chỉ mục hội tụ để lập chỉ mục dữ liệu của bạn theo nhiều cách. Một trong những cách đó là lập chỉ mục đảo ngược. Với chỉ mục đảo ngược, Rockset lập chỉ mục trực tiếp cho từng thuộc tính. Hãy chú ý cách tổ chức chỉ mục này. Mỗi tên và giá trị thuộc tính được sử dụng làm khóa của chỉ mục và giá trị là danh sách ID tài liệu bao gồm tên và giá trị thuộc tính tương ứng. Các khóa được xây dựng sao cho thứ tự sắp xếp tự nhiên của chúng có thể hỗ trợ các truy vấn phạm vi một cách hiệu quả. Chỉ mục đảo ngược rất phù hợp cho các truy vấn có điều kiện lọc chọn lọc. Hãy tưởng tượng chúng tôi muốn cho phép người dùng lọc các giao dịch của họ để tìm những giao dịch phù hợp với tiêu chí nhất định. Ai đó trong tổ chức Vandelay Industries quan tâm đến việc gần đây họ đã đặt hàng Chipotle bao nhiêu lần. Bạn có thể tìm thấy điều này với một truy vấn như sau: SELECT * FROM transactions WHERE organization = 'Vandelay Industries' AND merchant_name = 'Chipotle' Vì chúng tôi đang thực hiện các bộ lọc có chọn lọc theo tên khách hàng và người bán nên chúng tôi có thể sử dụng chỉ mục đảo ngược để nhanh chóng tìm thấy các tài liệu phù hợp. Rockset sẽ tra cứu cả cặp tên thuộc tính và giá trị trong chỉ mục đảo ngược để tìm danh sách các tài liệu phù hợp. Khi có hai danh sách này, nó có thể hợp nhất chúng để tìm tập bản ghi phù hợp với cả hai bộ điều kiện và trả kết quả lại cho máy khách. Giống như tính năng lập chỉ mục dựa trên phân vùng của DynamoDB có hiệu quả đối với các hoạt động sử dụng khóa phân vùng, chỉ mục đảo ngược của Rockset cung cấp cho bạn khả năng tra cứu hiệu quả trên bất kỳ trường nào trong tập dữ liệu của bạn, ngay cả trên các thuộc tính của đối tượng được nhúng hoặc trên các giá trị bên trong mảng được nhúng. Ứng dụng: Sử dụng API Rockset trong ứng dụng của bạn Bây giờ chúng ta đã biết cách Rockset có thể thực thi các truy vấn chọn lọc đối với tập dữ liệu của mình một cách hiệu quả, hãy cùng tìm hiểu các khía cạnh thực tế của việc tích hợp các truy vấn Rockset vào ứng dụng của chúng ta. Rockset hiển thị các dịch vụ RESTful được bảo vệ bằng mã thông báo ủy quyền. SDK cũng có sẵn cho các ngôn ngữ lập trình phổ biến. Điều này khiến nó trở nên rất phù hợp để tích hợp với các ứng dụng serverless vì bạn không cần thiết lập cấu hình mạng riêng phức tạp để truy cập cơ sở dữ liệu của mình. Để tương tác với API Rockset trong ứng dụng của chúng tôi, chúng tôi sẽ cần khóa API Rockset. Bạn có thể tạo một cái trong của bảng điều khiển Rockset. Sau khi thực hiện xong, hãy sao chép giá trị của nó vào tệp serverless.yml và triển khai lại để cung cấp giá trị đó cho ứng dụng của bạn. phần khóa API Lưu ý bên lề: Để đơn giản, chúng tôi đang sử dụng khóa API này làm biến môi trường. Trong ứng dụng thực, bạn nên sử dụng thứ gì đó như hoặc để lưu trữ bí mật của mình và tránh các biến môi trường. Parameter Store AWS Secrets Manager Hãy xem của chúng tôi để biết cách chúng tôi tương tác với Rockset API. Việc khởi tạo lớp lấy một đối tượng máy khách Rockset sẽ được sử dụng để thực hiện các cuộc gọi đến Rockset. lớp TransactionService Trong , chúng tôi có truy vấn sau để tương tác với Rockset: phương thức filterTransactions trong lớp dịch vụ của chúng tôi const response = await this._rocksetClient.queries.query({ sql: { query: ` SELECT * FROM Transactions WHERE organization = :organization AND category = :category AND amount BETWEEN :minAmount AND :maxAmount ORDER BY transactionTime DESC LIMIT 20`, parameters: [ { name: "organization", type: "string", value: organization, }, { name: "category", type: "string", value: category, }, { name: "minAmount", type: "float", value: minAmount, }, { name: "maxAmount", type: "float", value: maxAmount, }, ], }, }); Có hai điều cần lưu ý về sự tương tác này. Đầu tiên, chúng tôi đang sử dụng các tham số được đặt tên trong truy vấn của mình khi xử lý thông tin đầu vào từ người dùng. Đây là cách làm phổ biến với cơ sở dữ liệu SQL để tránh các cuộc tấn công tiêm nhiễm SQL. Thứ hai, mã SQL được trộn lẫn với mã ứng dụng của chúng tôi và có thể khó theo dõi theo thời gian. Mặc dù cách này có thể hiệu quả nhưng vẫn có cách tốt hơn. Khi áp dụng trường hợp sử dụng tiếp theo, chúng ta sẽ xem xét cách sử dụng Rockset Query Lambdas trong ứng dụng của mình. Sử dụng Rockset để tổng hợp Đến thời điểm này, chúng tôi đã xem xét các chiến lược lập chỉ mục của DynamoDB và Rockset khi thảo luận về cách cơ sở dữ liệu có thể tìm thấy một bản ghi riêng lẻ hoặc tập hợp các bản ghi khớp với một vị từ bộ lọc cụ thể. Ví dụ: chúng tôi thấy rằng DynamoDB thúc đẩy bạn sử dụng khóa chính để tìm bản ghi, trong khi chỉ mục đảo ngược của Rockset có thể tìm thấy bản ghi một cách hiệu quả bằng cách sử dụng các điều kiện lọc có tính chọn lọc cao. Trong phần cuối cùng này, chúng ta sẽ chuyển hướng một chút để tập trung vào bố cục dữ liệu thay vì lập chỉ mục trực tiếp. Khi nghĩ về bố cục dữ liệu, chúng ta sẽ đối chiếu hai cách tiếp cận: dựa trên hàng và dựa trên cột. Cơ sở dữ liệu dựa trên hàng, giống như tên ngụ ý, sắp xếp dữ liệu của chúng trên đĩa theo hàng. Hầu hết các cơ sở dữ liệu quan hệ, như PostgreSQL và MySQL, đều là cơ sở dữ liệu dựa trên hàng. Nhiều cơ sở dữ liệu NoSQL cũng vậy, như DynamoDB, ngay cả khi các bản ghi của chúng không phải là "hàng" về mặt kỹ thuật theo nghĩa cơ sở dữ liệu quan hệ. Cơ sở dữ liệu dựa trên hàng rất phù hợp với các mẫu truy cập mà chúng ta đã xem xét cho đến nay. Khi tìm nạp một giao dịch riêng lẻ theo ID của nó hoặc một tập hợp các giao dịch theo một số điều kiện lọc, chúng tôi thường muốn tất cả các trường quay trở lại cho mỗi giao dịch. Bởi vì tất cả các trường của bản ghi được lưu trữ cùng nhau nên thường chỉ cần một lần đọc để trả về bản ghi. (Lưu ý: sắp có một số sắc thái về điều này). Tổng hợp là một câu chuyện hoàn toàn khác. Với truy vấn tổng hợp, chúng tôi muốn tính toán tổng hợp -- tổng số tất cả giao dịch, tổng của tổng số giao dịch hoặc chi tiêu trung bình theo tháng cho một tập hợp giao dịch. Quay trở lại với người dùng từ tổ chức Vandelay Industries, hãy tưởng tượng họ muốn xem xét ba tháng qua và tìm tổng chi tiêu theo danh mục cho mỗi tháng. Phiên bản đơn giản của truy vấn đó sẽ trông như sau: SELECT category, EXTRACT(month FROM transactionTime) AS month, sum(amount) AS amount FROM transactions WHERE organization = 'Vandelay Industries' AND transactionTime > CURRENT_TIMESTAMP() - INTERVAL 3 MONTH GROUP BY category, month ORDER BY category, month DESC Đối với truy vấn này, có thể có một số lượng lớn bản ghi cần được đọc để tính kết quả. Tuy nhiên, hãy lưu ý rằng chúng ta không cần nhiều trường cho mỗi bản ghi. Chúng tôi chỉ cần bốn -- danh mục, Thời gian giao dịch, tổ chức và số tiền -- để xác định kết quả này. Do đó, chúng ta không chỉ cần đọc nhiều bản ghi hơn để đáp ứng truy vấn này mà bố cục dựa trên hàng của chúng ta cũng sẽ đọc một loạt các trường không cần thiết đối với kết quả của chúng ta. Ngược lại, bố cục dựa trên cột lưu trữ dữ liệu trên đĩa theo cột. Chỉ mục hội tụ của Rockset sử dụng chỉ mục cột để lưu trữ dữ liệu theo bố cục dựa trên cột. Trong bố cục dựa trên cột, dữ liệu được lưu trữ cùng nhau theo cột. Một bản ghi riêng lẻ được chia nhỏ thành các cột cấu thành để lập chỉ mục. Nếu truy vấn của tôi cần thực hiện tổng hợp để tính tổng thuộc tính "số tiền" cho một số lượng lớn bản ghi, Rockset có thể làm như vậy bằng cách chỉ cần quét phần "số tiền" của chỉ mục cột. Điều này làm giảm đáng kể lượng dữ liệu được đọc và xử lý so với bố cục theo hàng. Lưu ý rằng, theo mặc định, chỉ mục cột của Rockset sẽ không sắp xếp thứ tự các thuộc tính trong một cột. Vì chúng tôi có các trường hợp sử dụng hướng tới người dùng sẽ hoạt động trên dữ liệu của một khách hàng cụ thể nên chúng tôi muốn sắp xếp chỉ mục cột theo khách hàng để giảm lượng dữ liệu cần quét trong khi sử dụng chỉ mục cột. Rockset cung cấp để trợ giúp việc này. Với phân cụm, chúng tôi có thể chỉ ra rằng chúng tôi muốn chỉ mục cột của mình được phân cụm theo thuộc tính "tổ chức". Điều này sẽ nhóm tất cả các giá trị cột theo tổ chức trong các chỉ mục cột. Do đó, khi Vandelay Industries thực hiện tổng hợp dữ liệu của họ, bộ xử lý truy vấn của Rockset có thể bỏ qua các phần của chỉ mục cột đối với các khách hàng khác. khả năng phân cụm dữ liệu trên chỉ mục cột của bạn Chỉ mục dựa trên hàng của Rockset giúp xử lý như thế nào Trước khi chuyển sang sử dụng chỉ mục cột trong ứng dụng của mình, tôi muốn nói về một khía cạnh khác của Chỉ số hội tụ của Rockset. Trước đó, tôi đã đề cập rằng bố cục dựa trên hàng được sử dụng khi truy xuất bản ghi đầy đủ và chỉ ra rằng cả DynamoDB và truy vấn chỉ mục đảo ngược Rockset của chúng tôi đều đang sử dụng các bố cục này. Điều đó chỉ đúng một phần. Chỉ mục đảo ngược có một số điểm tương đồng với chỉ mục dựa trên cột, vì nó lưu trữ tên và giá trị cột cùng nhau để tra cứu hiệu quả theo bất kỳ thuộc tính nào. Mỗi mục nhập chỉ mục bao gồm một con trỏ tới ID của các bản ghi bao gồm kết hợp tên và giá trị cột đã cho. Khi ID hoặc ID có liên quan được phát hiện từ chỉ mục đảo ngược, Rockset có thể truy xuất toàn bộ bản ghi bằng chỉ mục hàng. Rockset sử dụng mã hóa từ điển và các kỹ thuật nén nâng cao khác để giảm thiểu kích thước lưu trữ dữ liệu. Vì vậy, bây giờ chúng ta đã thấy Chỉ số hội tụ của Rockset khớp với nhau như thế nào: được sử dụng để quét nhanh số lượng lớn các giá trị trong một cột cụ thể để tìm tập hợp; Chỉ mục dựa trên cột được sử dụng cho các bộ lọc chọn lọc trên bất kỳ tên và giá trị cột nào; Chỉ mục đảo ngược được sử dụng để tìm nạp bất kỳ thuộc tính bổ sung nào có thể được tham chiếu trong mệnh đề chiếu. Chỉ mục dựa trên hàng Dưới lớp vỏ bọc, công cụ lập chỉ mục và truy vấn mạnh mẽ của Rockset đang theo dõi số liệu thống kê về dữ liệu của bạn và tạo ra các kế hoạch tối ưu để thực hiện truy vấn của bạn một cách hiệu quả. Ứng dụng: Sử dụng Rockset Query Lambdas trong ứng dụng của bạn Hãy triển khai truy vấn tổng hợp Rockset sử dụng chỉ mục cột. Đối với truy vấn trước đó, chúng tôi đã viết truy vấn SQL trực tiếp vào API Rockset. Mặc dù đây là điều nên làm đối với một số giao diện người dùng có khả năng tùy biến cao, nhưng vẫn có tùy chọn tốt hơn khi mã SQL tĩnh hơn. Chúng tôi muốn tránh việc duy trì mã SQL lộn xộn ở giữa logic ứng dụng của mình. Để giải quyết vấn đề này, Rockset có một tính năng gọi là Query Lambdas. Truy vấn Lambda là các truy vấn được đặt tên, phiên bản, tham số hóa được đăng ký trong bảng điều khiển Rockset. Sau khi định cấu hình Query Lambda trong Rockset, bạn sẽ nhận được điểm cuối có thể mở rộng, được quản lý hoàn toàn cho Query Lambda mà bạn có thể gọi bằng các tham số do Rockset thực thi. Hơn nữa, bạn thậm chí sẽ nhận được số liệu thống kê giám sát cho từng Lambda truy vấn, nhờ đó, bạn có thể theo dõi cách Lambda truy vấn của mình hoạt động khi bạn thực hiện thay đổi. Bạn có thể nhưng hãy thiết lập Query Lambda đầu tiên để xử lý truy vấn tổng hợp của chúng ta. . tìm hiểu thêm về Query Lambdas tại đây Bạn có thể tìm thấy hướng dẫn đầy đủ trong kho ứng dụng Điều hướng đến của bảng điều khiển Rockset. Dán truy vấn sau vào trình chỉnh sửa: phần Trình soạn thảo truy vấn SELECT category, EXTRACT( month FROM transactionTime ) as month, EXTRACT( year FROM transactionTime ) as year, TRUNCATE(sum(amount), 2) AS amount FROM Transactions WHERE organization = :organization AND transactionTime > CURRENT_TIMESTAMP() - INTERVAL 3 MONTH GROUP BY category, month, year ORDER BY category, month, year DESC Truy vấn này sẽ nhóm các giao dịch trong ba tháng qua cho một tổ chức nhất định thành các nhóm dựa trên danh mục nhất định và tháng giao dịch. Sau đó, nó sẽ tổng hợp các giá trị cho một danh mục theo tháng để tìm ra tổng số tiền chi tiêu trong mỗi tháng. Lưu ý rằng nó bao gồm một tham số cho thuộc tính "tổ chức", như được biểu thị bằng cú pháp ":tổ chức" trong truy vấn. Điều này cho biết một giá trị tổ chức phải được chuyển qua để thực hiện truy vấn. Lưu truy vấn dưới dạng Truy vấn Lambda trong bảng điều khiển Rockset. Sau đó, hãy xem . Nó gọi Truy vấn Lambda theo tên và chuyển thuộc tính "tổ chức" do người dùng cung cấp. mã FetchTransactionsByCategoryAndMonth trong lớp TransactionService của chúng ta Đây là mã đơn giản hơn nhiều để xử lý trong ứng dụng của chúng tôi. Hơn nữa, Rockset còn cung cấp khả năng kiểm soát phiên bản và giám sát truy vấn cụ thể cho từng Truy vấn Lambda. Điều này giúp bạn dễ dàng duy trì các truy vấn của mình theo thời gian và hiểu được những thay đổi trong cú pháp truy vấn ảnh hưởng như thế nào đến hiệu suất. Phần kết luận Trong bài đăng này, chúng ta đã biết cách sử dụng DynamoDB và Rockset cùng nhau để xây dựng trải nghiệm ứng dụng nhanh chóng, thú vị cho người dùng. Khi làm như vậy, chúng tôi đã học được cả nền tảng khái niệm và các bước thực tế để triển khai ứng dụng của mình. Đầu tiên, chúng tôi sử dụng DynamoDB để xử lý chức năng cốt lõi của ứng dụng. Điều này bao gồm các kiểu truy cập như truy xuất nguồn cấp dữ liệu giao dịch cho một khách hàng cụ thể hoặc xem một giao dịch riêng lẻ. Nhờ chiến lược phân vùng dựa trên khóa chính của DynamoDB nên nó có thể mang lại hiệu suất nhất quán ở mọi quy mô. Nhưng thiết kế của DynamoDB cũng hạn chế tính linh hoạt của nó. Nó không thể xử lý các truy vấn chọn lọc trên các trường hoặc tập hợp tùy ý trên một số lượng lớn bản ghi. Để xử lý các mẫu này, chúng tôi đã sử dụng Rockset. Rockset cung cấp chỉ mục phụ được quản lý hoàn toàn để hỗ trợ các ứng dụng nặng về dữ liệu. Chúng tôi đã thấy cách Rockset duy trì một đường dẫn nhập liên tục từ kho dữ liệu chính của bạn để lập chỉ mục dữ liệu của bạn trong Chỉ mục hội tụ, kết hợp lập chỉ mục đảo ngược, cột và hàng. Khi xem qua các mẫu của mình, chúng tôi đã thấy cách mỗi kỹ thuật lập chỉ mục của Rockset phối hợp với nhau để xử lý trải nghiệm thú vị của người dùng. Cuối cùng, chúng ta đã thực hiện các bước thực tế để kết nối Rockset với bảng DynamoDB và tương tác với Rockset trong ứng dụng của mình. Cũng xuất hiện . ở đây