Gửi và nhận CloudEvents với Amazon EventBridge

của David Boyne | ngày 14 tháng 3 năm 2024 | trong Amazon EventBridge, Application Integration, Serverless | Permalink |  Share

Amazon EventBridge giúp các developers xây dựng event-driven architectures (EDA) kết nối các publisher và consumer sử dụng các event routing, filtering, và transformation. CloudEvents là một mã nguồn mở để mô tả event data một cách phổ biến. Developers có thể publish CloudEvents trực tiếp đến EventBridge lọc và định tuyến chúng, sử dụng bộ chuyển đổi đầu vào và API Destinations để gửi CloudEvents đến các dịch vụ AWS hạ tầng và APIs của các bên thứ ba.

Tổng quát

Event design là một khía cạnh quan trọng trong bất kỳ event-driven architecture nào. Nhà phát triển Developers xây dựng event-driven architectures thường bỏ qua quá 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 những ảnh hưởng 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.

Không có tiêu chuẩn sự kiện có thể khó để tích hợp events hoặc streams của messages giữa các hệ thống, brokers và các 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 xây dựng tùy chỉnh để tạo phiên bản hoặc xác thực.

CloudEvents thông số kỹ thuật mô tả event data dưới những định dạng phổ biến nhằm ddeer cung cấp khả năng tương tác giữa các service, platform và các hệ thống sử dụng dự án Cloud Native Computing Foundation (CNCF). Vì CloudEvents là một CNCF tốt nghiệp đồ án của CNCF graduated project, 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.nhiều brokers và hệ thống của bên thứ ba áp dụng thông số kỹ thuật này.

Sử dụng CloudEvents như một định dạng tiêu chuẩn để mô tả events giúp việc tích hợp dễ dàng hơn và bạn có thể sử dụng những công cụ mã nguồn mở để giúp đỡ xây dựng event-driven architectures và chứng minh bất cứ sự tích hợp nào trong tương lai. EventBridge có thể định tuyến và lọc CloudEvents dựa trên những siêu dữ liệu phổ biến, không cần phải hiểu những business logic trong chính các event.

CloudEvents hỗ trợ hai chế độ triển khai chế độ có cấu trúc và chế độ nhị phân

structured mode and binary mode, và một loạt các giao thức bao gồm HTTP, MQTT, AMQP, và Kafka. Khi xuất hiện sự kiện publish events đến EventBridge bus, bạn có thể cấu trúc sự kiện events như CloudEvents và định tuyến chúng đến người dùng. Bạn có thể sử dụng bộ chuyển đổi đầu vào để chuyển đổi bất kỳ event nào trong CloudEvents. Events cũng có thể được chuyển tiếp tới những public API, sử dụng đích EventBridge API hỗ trợ cả cơ chế mã hóa có cấu trúc và 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 sử dụng Amazon EventBridge

Khi publish events đến EventBridge bus, EventBridge sử dụng phòng bí sự kiện event envelope của nó và trình bày các events dưới dạng JSON. EventBridge yêu cầu bạn định nghĩa những top-level fields như detail-type và source. Bạn có thể sử dụng bất kỳ event/payload nào trong detail field. 

 Event ví dụ này cho thấy một OrderPlaced event từ orders-service không có cấu trúc mà không có bất kỳ tiêu chuẩn event nào. data bên trong event chứa order_id, customer_id và order_total.

{

  “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”

    }

  }

}

Publishers cũng có thể chọn những phần bổ sung cho  metadata field cùng với data field bên trong detail field để giúp định nghĩa một bộ tiêu chuẩn cho event của họ

{

  “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 các consumer cả thiện được khả năng debug và có thể quản lý idempotency.Trong khi cách tiếp cận này đưa đến nhiều lợi ích thực tiễn, nó sao chép các giải pháp đã được giải quyết bằng đặc tả CloudEvents

Publishing CloudEvents sử dụng Amazon EventBridge

Khi publish event đến EventBridge, bạn có thể sử dụng CloudEvents structured mode. Thông báo ở Một structured-mode message là nơi mà toàn bộ sự kiện event (thuộc tính và dữ liệu) được mã hóa trong nội dung thông báo message body, theo những định dạng sự kiện event nhất định. Thông báo ở Một binary-mode message là nơi mà sự kiện dữ liệu event data được lưu trữ trong nội dung thông báomessage body và các thuộc tính của event được như trữ như một phần của siêu dữ liệu message metadata.

CloudEvents có một danh sách các yêu cầu flelds nhưng cung cấp sự linh hoạt với thuộc tính optional and extensions. CloudEvents cũng cung cấp một giải pháp triển khai mang tính tạm thời, yêu cầu sự phối hợp của id và source phải xác định duy nhất cho mỗi sự kiện, có thể được sử dụng như một key tạm thời trong triển khai.

{

  “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, sự kiện OrderPlaced 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ư dataschema 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 mẫu này tham chiếu lược đồ trong EventBridge schema registry, 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.

Mapping những dữ liệu trong CloudEvents sử dụng bộ chuyển đổi đầu vào

Khi bạn định nghĩa một mục tiêu trong EventBridge, bộ chuyển đổi đầu vào cho phép bạn sửa đổi event trước khi nó đến đích. Bộ chuyển đổi đầu vào được cấu hình cho mỗi mục tiêu, cho phép bạn chuyển đổi những event khi consumer của bạn yêu cầu định dạng CloudEvents và bạn muốn ngăn ngừa việc lặp thông tin.

Bộ chuyển đổi đầu vào cho phép bạn map EventBridge fields như id, region, detail-type, và source, bên trong những thuộc tính CloudEvents tương ứng.

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

{

  “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 bộ 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.

Bộ chuyển đổi đầu vào cho CloudEvents

{

  “id”: “$.id”,

  “source”: “$.source”,

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

  “time”: “$.time”,

  “data”: “$.detail”

}

Mẫu đầu vào cho CloudEvents

{

  “specversion”: “1.0”,

  “id”: “<id>”,

  “source”: “<source>”,

  “type”: “<type>”,

  “time”: “<time>”,

  “data”: <data>

}

Ví dụ này cho thấy event payload đã nhân được bởi mục tiêu được map tới CloudEvents

{

  “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”

    }

}

Đẻ có thêm thông tin về cách sử dụng bộ chuyển đổi đầu vào với CloudEvents, xem ở this pattern on Serverless Land.

Chuyển đổi events bên trong CloudEvents sử dụng API đích

EventBridge API destinations cho phép bạn trigger HTTP endpoints dựa trên những rules phù hợp với để tích hợp với hệ thống của bên thứ ba sử dụng public APIs. Bạn có thể định tuyến events tới APIs hỗ trợ định dạng CloudEvents bằng cách sử dụng bộ chuyển đổi đầu vào và tùy chỉnh HTTP headers để chuyển đổi EventBridge events thành CloudEvents. API destinations now supports tùy chỉnh content-type headers. Điều này cho phép bạn gửi cấu Cloudevents có cấu trúc hoặc nhị phân đến consumer.

Chuyển đổi sự kiện Gửi CloudEvents nhị phân sử sự dụng đích API đích

Khi gửi CloudEvents nhị phân thông qua HTTP, bạn phải sử sự dụng HTTP binding specification và đặt những tham số CloudEvents headers cần thiết. Những headers này sẽ nói với consumer rằng payload được gửi tới sử dụng định dạng CloudEvents nào. Nội dung của request chính là sự kiện đó

CloudEvents headers có tiền tố là ce-. Bạn có thể tìm thấy danh sách các header trong tài liệu HTTP protocol binding 

Ví dụ này cho thấy Headers cho event binary:

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 event binary: 

{

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

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

  “order_total”: “120.00”

}

Để có thêm thông tin khi sử dụng binary CloudEvents với đích API đích, xem ở explore this pattern available on Serverless Land.

Gửi structured CloudEvents cách sử dụng đích using API đích

Để hỗ trợ structured mode với CloudEvents, bạn phải chỉ định content-type như application/cloudevents+json; charset=UTF-8, thông báo 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.

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”

Kết luận

Việc thiết kế cẩn thận các events đóng một vai trò quan trọng khi xây dựng event-driven architectures để tích hợp hiệu quả producers và consumers. Đặc tả CloudEvents mã nguồn mở giúp các developer 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 payload linh hoạt bên trong thuộc tính chi tiết của event để chuẩn hóa các event. Bạn có thể publish structured CloudEvents trực tiếp lên event bus trong detail field và sử dụng bộ chuyển đổi payload để cho phép các consumer nhận event bên trong các định dánh CloudEvents.

EventBridge đơn giản hóa việc tích hợp với hệ thống của bên thứ ba sử dụng đích API đích. Sử dụng tùy chỉnh mới content-type headers với bộ chuyển đổi đầu vào để sửa đổi cấu trúc event, bạn có thể gửi structured hoặc binary CloudEvents để tích hợp với public APIs.

Để tìm hiểu thêm về serverless, hãy truy cập Serverless Land.

Link bài viết

Leave a comment