Sử dụng Dapr cho kiến trúc phân tán

Dapr là một nền tảng được Microsoft phát triển nhằm cung cấp nhiều thành phần hỗ trợ cho việc xây dựng hệ thống phân tán và đơn giản hóa việc thiết kế ứng dụng. Hãy cùng tìm hiểu sơ lược về Dapr qua bài viết sau.

Upload image

Dapr là gì

Trong quá trình xây dựng hệ thống theo kiến trúc phân tán, các kiến trúc sư hệ thống và lập trình viên phải đối mặt với nhiều bài toán phức tạp như phương thức giao tiếp, quản lý log, quản lý transaction, bảo mật hệ thống.

Để giải quyết vấn đề này, Microsoft đã tạo ra Dapr (Distribute Application Runtime) gồm nhiều block được xây dựng sẵn giúp cho các lập trình viên có thể đơn giản hóa việc xây dựng ứng dụng, tập trung giải quyết các vấn đề về business.

Dapr được Micrsoft xây dựng bằng Golang theo hướng cloud-native, có thể chạy trên hệ thống đám mây hoặc hạ tầng bất kì cũng như không phụ thuộc vào ngôn ngữ phát triển ứng dụng.

Upload image

Dapr Architect (Nguồn: Dapr)

Hiện tại Dapr đã được phát triển đến phiên bản 1.10 và đã có SDK hỗ trợ hầu hết các ngôn ngữ lập trình phổ biến như: Java, .NET, Golang, Python, Javacript. Ngoài ra nếu ngôn ngữ lập trình trong ứng dụng chưa được hỗ trợ thì bạn vẫn có thể sử dụng Dapr thông qua các REST api đã được cung cấp sẵn. Xem thêm thông tin chi tiết về SDK của Dapr tại đây.

Sau đây, chúng ta sẽ cùng tìm hiểu kỹ hơn về kiến trúc hệ thống của Dapr nhé.

Kiến trúc chung của Dapr

Kiến trúc Sidecar

Dapr sử dung kiến trúc Sidecar (xe ba bánh) cho phép các service của bạn và Dapr có thể hoạt động độc lập với nhau.

Upload image

Dapr Sidecar (Nguồn: Dapr)

Nhờ kiến trúc Sidecar này, service của bạn sẽ chỉ tương tác với Dapr và không cần quan tâm đến môi trường thực thi. Ví dụ, khi dự án có nhu cầu đổi từ Kafka sang Azure Event Hub thì tất cả việc bạn cần làm là thay đổi phần cấu hình pubsub.yaml trên Dapr mà không cần thay đổi mã nguồn của service.

Hiệu suất

Đối với các hệ thống dựa trên kiến trúc Sidecar thì hiệu suất luôn là một vấn đề luôn được quan tâm hàng đầu. Sidecar quá nặng nề là nguyên nhân chủ yếu gây ra các vấn đề về hiệu suất cho các hệ thống phân tán đặc biệt là vấn đề nghẽn cổ chai.

Đối với Dapr, Microsoft đã sử dụng ngôn ngữ Golang cùng với việc cung cấp các API qua REST và gRPC giúp đảm bảo hiệu suất tối ưu cũng như dễ dàng trong việc tích hợp Dapr cùng các service của bạn.

Trong bài thử nghiệm hiệu suất với một hệ thống có sức mạnh trung bình gồm 4 CPU và 8GB bộ nhớ thì Dapr sử dụng khoảng 1% vCPU, 62Mb bộ nhớ và 5ms latency.

Các bạn có thể xem chi tiết bài thử nghiệm hiệu suất Dapr tại đây.

Các khối dựng sẵn của Dapr

Hiện tại, Dapr đang cung cấp 10 khối dựng sẵn như sau:

  • Service-to-service invocation
  • State management
  • Publish and subscribe
  • Bindings
  • Actors
  • Observability
  • Secrets
  • Configuration
  • Distributed lock
  • Workflows

Trong đó 3 blocks Configuration, Distributed lock và Workflows vẫn còn trong giai đoạn phát triển alpha, chưa thích hợp cho việc áp dụng vào hệ thống sử dụng thực tế. Sau đây là bảng thông tin chi tiết các khối:

Tên khốiĐịa ChỉMiêu tả
Service-to-service invocation/v1.0/invokeCho phép các ứng dụng giao tiếp với nhau qua các kết nối đầu cuối thường dùng bằng giao thức http hoặc grpc. Các kết nối có sẵn bao gồm nhiều loại như servcie discorvery (tự động phát hiện dịch vụ), distributed tracing, xử lý lỗi...
State management/v1.0/stateQuản lý trạng thái của ứng dụng trong 1 phiên làm việc bằng cách lưu trữ các key-value và truy vấn qua API được cung cấp sẵn
Publish and subscribe/v1.0/publish
/v1.0/subscribe
Cho phép các ứng dụng giao tiếp bất đồng bộ bằng kiến trúc Pub/Sub
Bindings/v1.0/bindingsCho phép ứng dụng giao tiếp hai chiều với các dịch vụ hoặc hệ thống bên ngoài thông qua Dapr API.
Actors/v1.0/actorsCho phép ứng dụng được thực thi như một tác nhân (actor) độc lập, và có thể được thu hồi khi không sử dụng
ObservabilityN/ACho phép theo dõi ứng dụng thông qua các thông số đo đạc, theo dấu, lưu trữ của ứng dụng
Secrets/v1.0/secretsCho phép ứng dụng truy cập các thông tin ẩn (secrets) của hệ thống bên ngoài qua Dapr API ví dụ như thông tin truy cập cơ sở dữ liệu
Configuration/v1.0-alpha1/configurationCho phép ứng dụng tự quản lý cấu hình qua Dapr API cũng như cho phép các ứng dụng tương tác với nhau khi có cấu hình thay đổi
Distributed lock/v1.0-alpha1/lockCho phép ứng dụng khóa các tài nguyên dùng chung để tránh xung đột trong việc sử dụng các tài nguyên
Workflows/v1.0-alpha1/workflowCho phép xây dựng các luồng xử lý (workflow) có thể bao gồm nhiều bước để kết hợp giữa ứng dụng với nhau

Trong phần sau, mình sẽ hướng dẫn cài đặt và sử dụng Dapr đơn giản với block State Management.

Cài đặt và sử dụng Dapr

Cài đặt Dapr CLI

  • Trên Windows Dapr có thể được cài đặt đơn giản bằng lệnh winget như sau:

        winget install Dapr.CLI
    
  • Trên OSX thì bạn dùng brew để cài Dapr như sau:

      brew install dapr/tap/dapr-cli
    
  • Nếu sử dụng Linux hoặc các OS khác, các bạn có thể xem hướng dẫn cài đặt tại đây.

  • Sau khi cài đặt dùng lệnh dapr để kiểm tra lại.

Khởi tạo Dapr

  • Yêu cần cần cài đặt Docker trước khi khởi tạo Dapr
  • Sau khi đã cài đặt Docker, dùng lệnh dapr init để khởi tạo môi trường Dapr
  • Kiểm tra lại Dapr bằng lệnh dapr version
  • Kiểm tra lại Docker bằng lệnh docker ps

Upload image

Docker list (Nguồn: Dapr)

Các thành phần được khởi tạo bao gồm:

- Redis được sử dụng để quản lý trạng thái và message.

- Zipkin được dùng để thu thập và lưu trữ các vết (trace) trong hệ thống.

  • Kiểm tra lại thư mục cài đặt bằng lệnh ls $HOME/.dapr

    Upload image

    Dapr Home (Nguồn: Dapr)

Bắt đầu sử dụng Dapr API

  • Sau khi cài đặt và thiết lập thành công Dapr, mình sẽ sử dụng State Mangement API để làm 1 luồng lưu và lấy thông tin từ Dapr như sau:

    • Khởi chạy Dapr bằng lệnh sau

       dapr run --app-id myapp --dapr-http-port 3500
      
    • Lưu lại state bằng cách sử dụng State Management API

      curl -X POST -H "Content-Type: application/json" -d '[{ "key": "name", "value": "Ealge"}]' http://localhost:3500/v1.0/state/statestore
      
    • Lấy lại state vừa lưu

        curl http://localhost:3500/v1.0/state/statestore/name 
      

      giá trị nhận được là "Eagle"

    • Kiểm tra lại giá trị vừa tạo trong Redis container

        docker exec -it dapr_redis redis-cli
      
    • Lấy list keys bằng lệnh keys * sẽ nhận được danh sách keys gồm có "myapp||name"

    • Lấy giá trị của key vừa nhận được bằng lệnh hgetall myapp||name kết quả trả về như sau:

Upload image

Dapr State (Nguồn: Dapr)

  • Sau khi làm xong, xoá state vừa tạo

      curl -v -X DELETE -H "Content-Type: application/json" http://localhost:3500/v1.0/state/statestore/name
    
  • Tắt Dapr

     dapr stop myapp
    
  • Như vậy bạn đã hoàn thành sử dụng Dapr State Management qua các REST API được cung cấp sẵn cũng như hiểu được cách thức lưu trữ trạng thái của Dapr.

Tổng kết

Dapr là một nền tảng cung cấp nhiều thành phần hữu ích cho việc xây dựng một hệ thống phân tán. Trong phần này mình đã giới thiệu cho mọi người sơ lược về Dapr cũng như cách sử dụng các API có sẵn. Trong các phần tiếp theo, mình sẽ đi sâu vào các thành phần của Dapr cũng như phương pháp áp dụng Dapr vào các ứng dụng thực tế.

Tham khảo thêm

Atekco - Home for Authentic Technical Consultants