Gửi và nhận CloudEvents bằng Amazon EventBridge

của David Boyne | TRÊN Ngày 14 tháng 3 năm 2024| trong Amazon EventBridge , Tích hợp ứng dụng , Serverless | Liên kết cố định |  Chia sẻ

Amazon EventBridge giúp nhà phát triển xây dựng kiến ​​trúc hướng sự kiện (EDA) bằng cách kết nối nhà xuất bản và người tiêu dùng được liên kết lỏng lẻo bằng cách sử dụng định tuyến , lọcchuyển đổi sự kiện . CloudEvents là một đặc tả nguồn mở để mô tả dữ liệu sự kiện theo cách phổ biến. Nhà phát triển có thể xuất bản CloudEvents trực tiếp lên EventBridge, lọc và định tuyến chúng, đồng thời sử dụng bộ chuyển đổi đầu vào và Đích API để gửi CloudEvents đến các dịch vụ AWS hạ nguồn và API của bên thứ ba.

Tổng quan

Thiết kế sự kiện là một khía cạnh quan trọng trong bất kỳ kiến ​​trúc hướng sự kiện nào. Các nhà phát triển xây dựng kiến ​​trúc hướng sự kiện thường bỏ qua quy trình thiết kế sự kiện khi xây dựng kiến ​​trúc của họ. Điều này dẫn đến các tác dụng phụ không mong muốn như tiết lộ chi tiết triển khai, thiếu tiêu chuẩn và phiên bản không tương thích.

Nếu không có tiêu chuẩn sự kiện, có thể khó tích hợp các sự kiện hoặc luồng tin nhắn giữa các hệ thống, nhà môi giới và tổ chức. Mỗi hệ thống phải hiểu cấu trúc sự kiện hoặc dựa vào các giải pháp được xây dựng tùy chỉnh để tạo phiên bản hoặc xác thực.

CloudEvents là thông số kỹ thuật để mô tả dữ liệu sự kiện ở các định dạng phổ biến nhằm cung cấp khả năng tương tác giữa các dịch vụ, nền tảng và hệ thống bằng cách sử dụng các dự án Cloud Native Computing Foundation (CNCF) . Vì CloudEvents là một dự án đã được CNCF hoàn thiện nên nhiều hệ thống và nhà môi giới bên thứ ba áp dụng thông số kỹ thuật này.

Việc sử dụng CloudEvents làm định dạng chuẩn để mô tả các sự kiện giúp quá trình tích hợp trở nên dễ dàng hơn và bạn có thể sử dụng công cụ nguồn mở để giúp xây dựng kiến ​​trúc hướng sự kiện và chứng minh mọi hoạt động tích hợp trong tương lai. EventBridge có thể định tuyến và lọc CloudEvents dựa trên siêu dữ liệu phổ biến mà không cần hiểu logic kinh doanh trong chính sự kiện đó.

CloudEvents hỗ trợ hai chế độ triển khai, chế độ có cấu trúc và chế độ nhị phân cũng như một loạt các giao thức bao gồm HTTP , MQTT , AMQPKafka . Khi xuất bản sự kiện lên bus EventBridge, bạn có thể cấu trúc các sự kiện dưới dạng CloudEvents và định tuyến chúng đến người dùng cuối. Bạn có thể sử dụng biến áp đầu vào để chuyển đổi bất kỳ sự kiện nào thành đặc tả CloudEvents. Các sự kiện cũng có thể được chuyển tiếp tới các API công khai, sử dụng đích API EventBridge, hỗ trợ cả mã hóa chế độ có cấu trúc và chế độ nhị phân, nâng cao khả năng tương tác với các hệ thống bên ngoài.

Chuẩn hóa sự kiện bằng Amazon EventBridge

Khi xuất bản sự kiện lên bus EventBridge, EventBridge sử dụng phong bì sự kiện riêng và thể hiện sự kiện dưới dạng đối tượng JSON. EventBridge yêu cầu bạn xác định các trường cấp cao nhất, chẳng hạn như detail-type và source. Bạn có thể sử dụng bất kỳ sự kiện/tải trọng nào trong trường hợp detail.

Sự kiện ví dụ này hiển thị một sự kiện OrderPlaced sự kiện từ sự kiện orders-service đó không có cấu trúc mà không có bất kỳ tiêu chuẩn sự kiện nào. Bên data trong sự kiện có chứa order_id, customer_id và order_total.

JSON

{

  “version”: “0”,

  “id”: “dbc1c73a-c51d-0c0e-ca61-ab9278974c57”,

  “account”: “1234567890”,

  “time”: “2023-05-23T11:38:46Z”,

  “region”: “us-east-1”,

  “detail-type”: “OrderPlaced”,

  “source”: “myapp.orders-service”,

  “resources”: [],

  “detail”: {

    “data”: {

      “order_id”: “c172a984-3ae5-43dc-8c3f-be080141845a”,

      “customer_id”: “dda98122-b511-4aaf-9465-77ca4a115ee6”,

      “order_total”: “120.00”

    }

  }

}

Nhà xuất bản cũng có thể chọn thêm trường  metadata trường bổ sung cùng với trường  data trường trong trường  detail trường đó để giúp xác định bộ tiêu chuẩn cho sự kiện của họ.

JSON

{

  “version”: “0”,

  “id”: “dbc1c73a-c51d-0c0e-ca61-ab9278974c58”,

  “account”: “1234567890”,

  “time”: “2023-05-23T12:38:46Z”,

  “region”: “us-east-1”,

  “detail-type”: “OrderPlaced”,

  “source”: “myapp.orders-service”,

  “resources”: [],

  “detail”: {

    “metadata”: {

      “idempotency_key”: “29d2b068-f9c7-42a0-91e3-5ba515de5dbe”,

      “correlation_id”: “dddd9340-135a-c8c6-95c2-41fb8f492222”,

      “domain”: “ORDERS”,

      “time”: “1707908605”

    },

    “data”: {

      “order_id”: “c172a984-3ae5-43dc-8c3f-be080141845a”,

      “customer_id”: “dda98122-b511-4aaf-9465-77ca4a115ee6”,

      “order_total”: “120.00”

    }

  }

}

Thông tin sự kiện bổ sung này giúp người tiêu dùng hạ nguồn, cải thiện việc gỡ lỗi và có thể quản lý tính tạm thời . Mặc dù cách tiếp cận này mang lại những lợi ích thiết thực nhưng nó lại trùng lặp các giải pháp đã được giải quyết bằng đặc tả CloudEvents.

Xuất bản CloudEvents bằng Amazon EventBridge

Khi xuất bản sự kiện lên EventBridge, bạn có thể sử dụng chế độ có cấu trúc CloudEvents . Thông báo ở chế độ có cấu trúc là nơi toàn bộ sự kiện (thuộc tính và dữ liệu) được mã hóa trong nội dung thông báo, theo định dạng sự kiện cụ thể. Thông báo ở chế độ nhị phân là nơi lưu trữ dữ liệu sự kiện trong nội dung thông báo và các thuộc tính sự kiện được lưu trữ như một phần của siêu dữ liệu thông báo.

CloudEvents có danh sách  các trường bắt buộc  nhưng cũng mang đến sự linh hoạt với   các thuộc tính và tiện  ích mở rộng tùy chọn . CloudEvents cũng cung cấp giải pháp triển khai tính tạm thời, yêu cầu sự kết hợp giữa id và nguồn phải xác định duy nhất một sự kiện. Sự kiện này có thể được sử dụng làm khóa tạm thời trong quá trình triển khai ở cấp dưới.

JSON

{

  “version”: “0”,

  “id”: “dbc1c73a-c51d-0c0e-ca61-ab9278974c58”,

  “account”: “1234567890”,

  “time”: “2023-05-23T12:38:46Z”,

  “region”: “us-east-1”,

  “detail-type”: “OrderPlaced”,

  “source”: “myapp.orders-service”,

  “resources”: [],

  “detail”: {

    “specversion”: “1.0”,

    “id”: “bba4379f-b764-4d90-9fb2-9f572b2b0b61”,

    “source”: “myapp.orders-service”,

    “type”: “OrderPlaced”,

    “data”: {

      “order_id”: “c172a984-3ae5-43dc-8c3f-be080141845a”,

      “customer_id”: “dda98122-b511-4aaf-9465-77ca4a115ee6”,

      “order_total”: “120.00”

    },

    “time”: “2024-01-01T17:31:00Z”,

    “dataschema”: “https://us-west-2.console.aws.amazon.com/events/home?region=us-west-2#/registries/discovered-schemas/schemas/myapp.orders-service%40OrderPlaced”,

    “correlationid”: “dddd9340-135a-c8c6-95c2-41fb8f492222”,

    “domain”: “ORDERS”

  }

}

Bằng cách kết hợp các trường bắt buộc, OrderPlaced sự kiện hiện đã tuân thủ CloudEvents. Sự kiện này cũng chứa các trường tùy chọn và mở rộng để biết thêm thông tin. Các trường tùy chọn như lược đồ dữ liệu có thể hữu ích cho người môi giới và người tiêu dùng để truy xuất đường dẫn URI tới lược đồ sự kiện đã xuất bản. Sự kiện ví dụ này tham chiếu lược đồ trong sổ đăng ký lược đồ EventBridge , do đó, người tiêu dùng ở cấp dưới có thể tìm nạp lược đồ để xác thực tải trọng.

Ánh xạ các sự kiện hiện có vào CloudEvents bằng cách sử dụng bộ biến đổi đầu vào

Khi bạn xác định mục tiêu trong EventBridge, các chuyển đổi đầu vào cho phép bạn sửa đổi sự kiện trước khi nó đến đích. Bộ biến đổi đầu vào được định cấu hình cho mỗi mục tiêu, cho phép bạn chuyển đổi các sự kiện khi người tiêu dùng ở hạ nguồn yêu cầu định dạng CloudEvents và bạn muốn tránh trùng lặp thông tin.

Bộ biến đổi đầu vào cho phép bạn ánh xạ các trường EventBridge, chẳng hạn như id, region, detail-type và source, vào các thuộc tính CloudEvents tương ứng.

Ví dụ này cho thấy cách chuyển đổi bất kỳ sự kiện EventBridge nào sang định dạng CloudEvents bằng cách sử dụng biến áp đầu vào để mục tiêu nhận được cấu trúc được yêu cầu.

JSON

{

  “version”: “0”,

  “id”: “dbc1c73a-c51d-0c0e-ca61-ab9278974c58”,

  “account”: “1234567890”,

  “time”: “2024-01-23T12:38:46Z”,

  “region”: “us-east-1”,

  “detail-type”: “OrderPlaced”,

  “source”: “myapp.orders-service”,

  “resources”: [],

  “detail”: {

    “order_id”: “c172a984-3ae5-43dc-8c3f-be080141845a”,

    “customer_id”: “dda98122-b511-4aaf-9465-77ca4a115ee6”,

    “order_total”: “120.00”

  }

}

Việc sử dụng trình chuyển đổi đầu vào và mẫu đầu vào này EventBridge sẽ chuyển đổi lược đồ sự kiện thành đặc tả CloudEvents cho người dùng cuối.

Biến áp đầu vào cho CloudEvents:

JSON

{

  “id”: “$.id”,

  “source”: “$.source”,

  “type”: “$.detail-type”,

  “time”: “$.time”,

  “data”: “$.detail”

}

Mẫu đầu vào cho CloudEvents:

JSON

{

  “specversion”: “1.0”,

  “id”: “<id>”,

  “source”: “<source>”,

  “type”: “<type>”,

  “time”: “<time>”,

  “data”: <data>

}

Ví dụ này cho thấy trọng tải sự kiện được nhận bởi các mục tiêu hạ nguồn, được ánh xạ tới đặc tả CloudEvents.

JSON

{

  “specversion”: “1.0”,

  “id”: “dbc1c73a-c51d-0c0e-ca61-ab9278974c58”,

  “source”: “myapp.orders-service”,

  “type”: “OrderPlaced”,

  “time”: “2024-01-23T12:38:46Z”,

  “data”: {

      “order_id”: “c172a984-3ae5-43dc-8c3f-be080141845a”,

      “customer_id”: “dda98122-b511-4aaf-9465-77ca4a115ee6”,

      “order_total”: “120.00”

    }

}

Để biết thêm thông tin về cách sử dụng bộ biến đổi đầu vào với CloudEvents, hãy xem mẫu này trên Serverless Land .

Chuyển đổi sự kiện thành CloudEvents bằng cách sử dụng đích API

Đích API EventBridge cho phép bạn kích hoạt điểm cuối HTTP dựa trên các quy tắc phù hợp để tích hợp với hệ thống của bên thứ ba bằng API công khai. Bạn có thể định tuyến sự kiện tới các API hỗ trợ định dạng CloudEvents bằng cách sử dụng các chuyển đổi đầu vào và tiêu đề HTTP tùy chỉnh để chuyển đổi sự kiện EventBridge thành CloudEvents. Đích API hiện hỗ trợ các tiêu đề tùy chỉnh content-type. Điều này cho phép bạn gửi CloudEvents có cấu trúc hoặc nhị phân tới người tiêu dùng ở hạ nguồn.

Gửi CloudEvent nhị phân bằng đích API

Khi gửi CloudEvents nhị phân qua HTTP, bạn phải sử dụng thông số liên kết HTTP và đặt các tiêu đề CloudEvents cần thiết . Các tiêu đề này cho người dùng cuối biết rằng tải trọng đến sử dụng định dạng CloudEvents. Nội dung của yêu cầu chính là sự kiện đó.

Các tiêu đề của CloudEvents có tiền tố là ce-. Bạn có thể tìm thấy danh sách các tiêu đề trong tài liệu liên kết giao thức HTTP .

Ví dụ này hiển thị Tiêu đề cho một sự kiện nhị phân:

HTTP

POST /order HTTP/1.1 

Host: webhook.example.com

ce-specversion: 1.0

ce-type: OrderPlaced

ce-source: myapp.orders-service

ce-id: bba4379f-b764-4d90-9fb2-9f572b2b0b61

ce-time: 2024-01-01T17:31:00Z

ce-dataschema: https://us-west-2.console.aws.amazon.com/events/home?region=us-west-2#/registries/discovered-schemas/schemas/myapp.orders-service%40OrderPlaced

correlationid: dddd9340-135a-c8c6-95c2-41fb8f492222

domain: ORDERS

Content-Type: application/json; charset=utf-8

Ví dụ này hiển thị nội dung của một sự kiện nhị phân:

JSON

{

  “order_id”: “c172a984-3ae5-43dc-8c3f-be080141845a”,

  “customer_id”: “dda98122-b511-4aaf-9465-77ca4a115ee6”,

  “order_total”: “120.00”

}

Để biết thêm thông tin khi sử dụng CloudEvents nhị phân với đích API, hãy khám phá mẫu này có sẵn trên Serverless Land .

Gửi CloudEvent có cấu trúc bằng cách sử dụng đích API

Để hỗ trợ chế độ có cấu trúc với CloudEvents, bạn phải chỉ định as content-type, application/cloudevents+json; charset=UTF-8 thông số này cho người dùng API biết rằng tải trọng của sự kiện tuân thủ đặc tả CloudEvents.

JSON

POST /order HTTP/1.1

Host: webhook.example.com

Content-Type: application/cloudevents+json; charset=utf-8

{

    “specversion”: “1.0”,

    “id”: “bba4379f-b764-4d90-9fb2-9f572b2b0b61”,

    “source”: “myapp.orders-service”,

    “type”: “OrderPlaced”,      

    “data”: {

      “order_id”: “c172a984-3ae5-43dc-8c3f-be080141845a”,

      “customer_id”: “dda98122-b511-4aaf-9465-77ca4a115ee6”,

      “order_total”: “120.00”

    },

    “time”: “2024-01-01T17:31:00Z”,

    “dataschema”: “https://us-west-2.console.aws.amazon.com/events/home?region=us-west-2#/registries/discovered-schemas/schemas/myapp.orders-service%40OrderPlaced&#8221;,

    “correlationid”: “dddd9340-135a-c8c6-95c2-41fb8f492222”,

    “domain”:”ORDERS”

}

Phần kết luận

Việc thiết kế cẩn thận các sự kiện đóng một vai trò quan trọng khi xây dựng kiến ​​trúc hướng sự kiện để tích hợp hiệu quả người sản xuất và người tiêu dùng. Đặc tả CloudEvents nguồn mở giúp các nhà phát triển chuẩn hóa các quy trình tích hợp, đơn giản hóa sự tương tác giữa các hệ thống nội bộ và các đối tác bên ngoài.

EventBridge cho phép bạn sử dụng cấu trúc tải trọng linh hoạt trong thuộc tính chi tiết của sự kiện để chuẩn hóa các sự kiện. Bạn có thể xuất bản CloudEvents có cấu trúc trực tiếp lên bus sự kiện tại  trường detail  và sử dụng các chuyển đổi tải trọng để cho phép người tiêu dùng ở hạ nguồn nhận được các sự kiện ở định dạng CloudEvents.

EventBridge đơn giản hóa việc tích hợp với các hệ thống của bên thứ ba bằng cách sử dụng đích API. Bằng cách sử dụng các tiêu đề tùy chỉnh mới content-type với bộ chuyển đổi đầu vào để sửa đổi cấu trúc sự kiện, bạn có thể gửi CloudEvents có cấu trúc hoặc nhị phân để tích hợp với các API công khai.

Để biết thêm tài nguyên học tập không có máy chủ, hãy truy cập  Serverless Land .

Leave a comment