Logo Zephyrnet

Phát triển lược đồ JSON trong Luồng dữ liệu Amazon MSK và Amazon Kinesis với Sổ đăng ký lược đồ keo AWS

Ngày:

Dữ liệu đang được sản xuất, phát trực tuyến và tiêu thụ với tốc độ rất lớn và tốc độ đó được dự đoán sẽ tăng theo cấp số nhân trong tương lai. Đặc biệt, JSON là định dạng dữ liệu được sử dụng rộng rãi nhất trên các công nghệ phát trực tuyến và khối lượng công việc. Khi các ứng dụng, trang web và máy móc ngày càng áp dụng các công nghệ truyền dữ liệu như Apache Kafka và Luồng dữ liệu Amazon Kinesis, đóng vai trò như một lớp truyền tải có tính khả dụng cao giúp tách người sản xuất dữ liệu khỏi người tiêu dùng dữ liệu, nó có thể ngày càng trở nên thách thức hơn đối với các nhóm trong việc điều phối và phát triển các Lược đồ JSON. Việc thêm hoặc xóa một trường hoặc thay đổi kiểu dữ liệu trên một hoặc nhiều trường hiện có có thể gây ra các vấn đề về chất lượng dữ liệu và các lỗi ứng dụng hạ lưu nếu không xử lý dữ liệu cẩn thận. Các nhóm dựa vào các công cụ tùy chỉnh, mã phức tạp, quy trình tẻ nhạt hoặc tài liệu không đáng tin cậy để bảo vệ khỏi những thay đổi giản đồ này. Điều này đặt ra sự phụ thuộc rất nhiều vào sự giám sát của con người, điều này có thể làm cho các quy trình quản lý thay đổi dễ xảy ra sai sót. Một giải pháp phổ biến là đăng ký lược đồ cho phép người sản xuất và người tiêu dùng dữ liệu thực hiện xác nhận các thay đổi lược đồ theo cách phối hợp. Điều này cho phép sự phát triển không có rủi ro khi nhu cầu kinh doanh thay đổi theo thời gian.

Sản phẩm Đăng ký lược đồ keo AWS, một tính năng không máy chủ của Keo AWS, giờ đây cho phép bạn xác thực và phát triển dữ liệu phát trực tuyến một cách đáng tin cậy dựa trên các Lược đồ JSON. Schema Registry là một tính năng miễn phí có thể cải thiện đáng kể chất lượng dữ liệu và năng suất của nhà phát triển. Với nó, bạn có thể loại bỏ mã hóa phòng thủ và phối hợp giữa các nhóm, giảm các lỗi ứng dụng xuống dòng và sử dụng sổ đăng ký được tích hợp trên nhiều dịch vụ AWS. Mỗi lược đồ có thể được tạo phiên bản trong phạm vi bảo vệ của chế độ tương thích, cung cấp cho các nhà phát triển sự linh hoạt để phát triển các Lược đồ JSON một cách đáng tin cậy. Ngoài ra, Schema Registry có thể tuần tự hóa dữ liệu thành định dạng nén, giúp bạn tiết kiệm chi phí lưu trữ và truyền dữ liệu.

Bài đăng này chỉ cho bạn cách sử dụng Đăng ký lược đồ cho các Lược đồ JSON và cung cấp các ví dụ về cách sử dụng nó với cả Kinesis Data Streams và Apache Kafka hoặc Truyền trực tuyến được quản lý của Amazon cho Apache Kafka (Amazon MSK).

Tổng quan về giải pháp

Trong bài đăng này, chúng tôi hướng dẫn bạn một giải pháp để lưu trữ, xác thực và phát triển Lược đồ JSON trong Sổ đăng ký lược đồ keo AWS. Lược đồ được sử dụng bởi Kafka Apache và các ứng dụng Kinesis Data Streams trong khi sản xuất và tiêu thụ Đối tượng JSON. Chúng tôi cũng cho bạn biết điều gì sẽ xảy ra khi một phiên bản lược đồ mới được tạo với một trường mới.

Sơ đồ sau minh họa quy trình giải pháp của chúng tôi:

Các bước để thực hiện giải pháp này như sau:

  1. Tạo một sổ đăng ký mới và đăng ký một lược đồ bằng cách sử dụng Hình thành đám mây AWS bản mẫu.
  2. Tạo phiên bản mới của giản đồ bằng bảng điều khiển AWS Glue tương thích ngược với phiên bản trước.
  3. Xây dựng một ứng dụng nhà sản xuất để thực hiện những việc sau:
    1. Tạo các đối tượng JSON tuân theo một trong các phiên bản lược đồ.
    2. Tuần tự các đối tượng JSON thành một mảng byte.
    3. Lấy ID phiên bản lược đồ tương ứng từ Cơ quan đăng ký lược đồ và mã hóa mảng byte với cùng một.
    4. Gửi mảng byte được mã hóa thông qua luồng dữ liệu Kinesis hoặc chủ đề Apache Kafka.
  4. Xây dựng một ứng dụng dành cho người tiêu dùng để thực hiện những việc sau:
    1. Nhận mảng byte được mã hóa thông qua luồng dữ liệu Kinesis hoặc chủ đề Apache Kafka.
    2. Giải mã ID phiên bản lược đồ và lấy lược đồ tương ứng từ Cơ quan đăng ký lược đồ.
    3. Hủy số liệu hóa mảng byte thành đối tượng JSON ban đầu.
    4. Sử dụng đối tượng JSON nếu cần.

Mô tả của lược đồ được sử dụng

Đối với bài đăng này, chúng tôi bắt đầu với lược đồ sau. Lược đồ là một đối tượng báo cáo thời tiết chứa ba phần dữ liệu chính: location, temperaturetimestamp. Cả ba đều là các trường bắt buộc, nhưng lược đồ cho phép các trường bổ sung (được biểu thị bằng additionalProperties cờ) chẳng hạn như windSpeed or precipitation nếu nhà sản xuất muốn bao gồm chúng. Các location trường là một đối tượng có hai trường chuỗi: citystate. Cả hai đều là trường bắt buộc và lược đồ không cho phép bất kỳ trường bổ sung nào trong đối tượng này.

{ "$id": "https://example.com/weather-report.schema.json", "$schema": "http://json-schema.org/draft-07/schema#", "title": "WeatherReport", "type": "object", "properties": { "location": { "type": "object", "properties": { "city": { "type": "string", "description": "Name of the city where the weather is being reported." }, "state": { "type": "string", "description": "Name of the state where the weather is being reported." } }, "additionalProperties": false, "required": [ "city", "state" ] }, "temperature": { "type": "integer", "description": "Temperature in Farenheit." }, "timestamp": { "description": "Timestamp in epoch format at which the weather was noted.", "type": "integer" } }, "additionalProperties": true, "required": [ "location", "temperature", "timestamp" ]
}

Sử dụng lược đồ trên, một đối tượng JSON hợp lệ sẽ trông giống như sau:

{ "location": { "city": "Phoenix", "state": "Arizona" }, "temperature": 115, "windSpeed": 50, "timestamp": 1627335205
}

Triển khai với AWS CloudFormation

Để bắt đầu nhanh, bạn có thể triển khai ngăn xếp CloudFormation được cung cấp. Mẫu CloudFormation tạo các tài nguyên sau trong tài khoản của bạn:

  • Đăng ký - Sổ đăng ký là một vùng chứa các lược đồ. Cơ quan đăng ký cho phép bạn sắp xếp các lược đồ của mình, cũng như quản lý quyền kiểm soát truy cập cho các ứng dụng của bạn. Sổ đăng ký có Tên tài nguyên Amazon (ARN) để cho phép bạn tổ chức và đặt các quyền truy cập khác nhau đối với các hoạt động giản đồ trong sổ đăng ký.
  • Schema - Một lược đồ xác định cấu trúc và định dạng của một bản ghi dữ liệu. Lược đồ là một đặc tả được tạo phiên bản để xuất bản, tiêu thụ hoặc lưu trữ dữ liệu đáng tin cậy. Mỗi lược đồ có thể có nhiều phiên bản. Việc tạo phiên bản được điều chỉnh bởi quy tắc tương thích được áp dụng trên một giản đồ. Yêu cầu đăng ký phiên bản lược đồ mới được Cơ quan đăng ký lược đồ kiểm tra theo quy tắc này trước khi chúng có thể thành công.

Để tạo thủ công các tài nguyên này mà không sử dụng AWS CloudFormation, hãy tham khảo Tạo sổ đăng kýTạo một lược đồ.

Điều kiện tiên quyết

Đảm bảo hoàn thành các bước sau làm điều kiện tiên quyết:

  1. Tạo tài khoản AWS. Đối với bài đăng này, bạn định cấu hình các tài nguyên AWS cần thiết trong us-east-1 or us-west-2 Khu vực. Nếu bạn chưa đăng ký, hãy hoàn thành các tác vụ sau:
    1. Tạo một tài khoản. Để được hướng dẫn, hãy xem Đăng ký AWS.
    2. tạo một Quản lý truy cập và nhận dạng AWS (IAM) người dùng. Để được hướng dẫn, hãy xem Tạo Người dùng IAM trong tài khoản AWS của bạn.
  2. Chọn Khởi chạy Stack để khởi chạy ngăn xếp CloudFormation:

Xem lại lược đồ mới được đăng ký

Hãy xem lại đăng kýkế hoạch trên bảng điều khiển AWS Glue.

  1. Đăng nhập vào bảng điều khiển AWS Glue và chọn Khu vực thích hợp.
  2. Theo Danh mục dữ liệu, chọn Đăng ký lược đồ.
  3. Chọn GsrBlogRegistry đăng ký lược đồ.
  4. Chọn GsrBlogSchema lược đồ.
  5. Chọn Phiên bản 1.

Chúng ta có thể xem chi tiết phiên bản JSON Schema và định nghĩa của nó. Lưu ý rằng chế độ tương thích được chọn là Khả năng tương thích ngược. Chúng ta sẽ thấy mục đích của việc đó trong phần tiếp theo.

Phát triển lược đồ bằng cách tạo một phiên bản tương thích ngược mới

Trong phần này, chúng tôi lấy những gì được tạo cho đến nay và thêm một phiên bản giản đồ mới để chứng minh cách chúng tôi có thể phát triển lược đồ của mình trong khi vẫn giữ nguyên vẹn tính toàn vẹn.

Để thêm phiên bản giản đồ mới, hãy hoàn thành các bước sau, tiếp tục từ phần trước:

  1. trên Chi tiết phiên bản lược đồ trang, chọn Đăng ký phiên bản mới.
  2. Bên trong properties đối tượng trong location đối tượng (sau state trường), thêm mới country trường như sau:
    "country": { "type": "string", "description": "Name of the country where the weather is being reported." }

Bởi vì chế độ tương thích được chọn cho lược đồ là tương thích ngược, điều quan trọng là chúng tôi không đặt trường mới này thành trường bắt buộc. Nếu chúng tôi làm điều đó, Schema Registry không thành công phiên bản mới này.

  1. Chọn Đăng ký phiên bản.

Bây giờ chúng tôi có một phiên bản mới của giản đồ cho phép nhà sản xuất bao gồm trường quốc gia tùy chọn trong đối tượng vị trí nếu họ muốn.

Sử dụng Sổ đăng ký lược đồ keo AWS

Trong phần này, chúng ta sẽ hướng dẫn các bước sử dụng Schema Registry với Kinesis Data Streams hoặc Apache Kafka.

Điều kiện tiên quyết

Đảm bảo hoàn thành các bước sau làm điều kiện tiên quyết:

  1. Định cấu hình thông tin đăng nhập AWS của bạn trong máy cục bộ của bạn.
  2. đặt Maven trên máy cục bộ.
  3. Tải xuống mã ứng dụng từ GitHub còn lại.
  4. Xây dựng gói:
    mvn clean package

Sử dụng Cơ quan đăng ký lược đồ với Luồng dữ liệu Kinesis

Chạy mã trình sản xuất Kinesis để tạo thông báo JSON được liên kết với ID lược đồ được chỉ định bởi Cơ quan đăng ký lược đồ:

mvn exec:java -Dexec.mainClass="com.amazonaws.services.gsr.samples.json.kinesis.RunKinesisProducer" -Dexec.args="<<KINESIS_DATA_STREAM_NAME>>"

Lệnh này trả về kết quả đầu ra sau:

Putting 1 record into <<KINESIS_DATA_STREAM_NAME>>
Sent message 0
Putting 1 record into <<KINESIS_DATA_STREAM_NAME>>
Sent message 1
Putting 1 record into <<KINESIS_DATA_STREAM_NAME>>
Sent message 2
Successfully produced 3 messages to a stream called <<KINESIS_DATA_STREAM_NAME>>

Chạy mã người tiêu dùng Kinesis để nhận thông báo JSON với ID giản đồ, lấy lược đồ từ Cơ quan đăng ký lược đồ và xác thực:

mvn exec:java -Dexec.mainClass="com.amazonaws.services.gsr.samples.json.kinesis.RunKinesisConsumer" -Dexec.args="<<KINESIS_DATA_STREAM_NAME>>"

Lệnh này trả về kết quả đầu ra sau với các bản ghi JSON đã nhận và giải mã:

Number of Records received: 1
[JsonDataWithSchema(schema={"$schema":"http://json-schema.org/draft-07/schema#","additionalProperties":true,"title":"WeatherReport","type":"object","properties":{"temperature":{"description":"Temperature in Farenheit.","type":"integer"},"location":{"additionalProperties":false,"type":"object","properties":{"city":{"description":"Name of the city where the weather is being reported.","type":"string"},"state":{"description":"Name of the state where the weather is being reported.","type":"string"}},"required":["city","state"]},"timestamp":{"description":"Timestamp in epoch format at which the weather was noted.","type":"integer"}},"required":["location","temperature","timestamp"],"$id":"https://example.com/weather-report.schema.json"}, payload={"temperature":89,"location":{"city":"Orlando","state":"Florida"},"timestamp":1627335205})]

Sử dụng đăng ký lược đồ với Apache Kafka

Trong thư mục gốc của thư mục repo GitHub đã tải xuống, hãy tạo tệp cấu hình với các tham số kết nối cho cụm Kafka:

# Kafka
bootstrap.servers=localhost:9092

Chạy mã trình sản xuất Kafka để tạo các thông báo JSON được liên kết với ID lược đồ do Cơ quan đăng ký lược đồ chỉ định:

mvn exec:java -Dexec.mainClass="com.amazonaws.services.gsr.samples.json.kafka.RunKafkaProducer" -Dexec.args="<<CONFIG_FILE_NAME>><< TOPIC_NAME>>"

Lệnh này trả về kết quả đầu ra sau:

Sent message 0
Sent message 1
Sent message 2
Successfully produced 3 messages to a topic called <<TOPIC_NAME>>

Chạy mã người tiêu dùng Kafka để sử dụng các thông báo JSON với ID giản đồ, lấy lược đồ từ Cơ quan đăng ký lược đồ và xác thực:

mvn exec:java -Dexec.mainClass="com.amazonaws.services.gsr.samples.json.kafka.RunKafkaConsumer" -Dexec.args="<<CONFIG_FILE_NAME>> <<TOPIC_NAME>>"

Lệnh này trả về kết quả đầu ra sau với các bản ghi JSON đã nhận và giải mã:

Received message: key = message-0, value = JsonDataWithSchema(schema={"$schema":"http://json-schema.org/draft-07/schema#","additionalProperties":true,"title":"WeatherReport","type":"object","properties":{"temperature":{"description":"Temperature in Farenheit.","type":"integer"},"location":{"additionalProperties":false,"type":"object","properties":{"city":{"description":"Name of the city where the weather is being reported.","type":"string"},"state":{"description":"Name of the state where the weather is being reported.","type":"string"}},"required":["city","state"]},"timestamp":{"description":"Timestamp in epoch format at which the weather was noted.","type":"integer"}},"required":["location","temperature","timestamp"],"$id":"https://example.com/weather-report.schema.json"}, payload={"temperature":115,"location":{"city":"Phoenix","state":"Arizona"},"windSpeed":50,"timestamp":1627335205})

Làm sạch

Bây giờ đến bước cuối cùng, dọn dẹp tài nguyên. Xóa ngăn xếp CloudFormation để xóa mọi tài nguyên bạn đã tạo như một phần của hướng dẫn này.

Các tính năng của Schema Registry

Hãy thảo luận về các tính năng mà Schema Registry cung cấp:

  • Khám phá giản đồ - Khi nhà sản xuất đăng ký thay đổi giản đồ, siêu dữ liệu có thể được áp dụng dưới dạng cặp khóa-giá trị để cung cấp thông tin có thể tìm kiếm cho quản trị viên hoặc nhà phát triển. Siêu dữ liệu này có thể chỉ ra nguồn gốc của dữ liệu (source=MSK_west), tên của nhóm để liên hệ (owner=DataEngineering) hoặc các thẻ AWS (environment=Production). Bạn có thể mã hóa một trường trong dữ liệu của mình trên ứng dụng sản xuất và sử dụng siêu dữ liệu để chỉ định cho khách hàng tiêu dùng tiềm năng vân tay khóa công khai nào sẽ sử dụng để giải mã.
  • Khả năng tương thích của giản đồ - Việc lập phiên bản của mỗi lược đồ được điều chỉnh bởi một chế độ tương thích. Nếu một phiên bản lược đồ mới được yêu cầu đăng ký phá vỡ chế độ tương thích được chỉ định, yêu cầu không thành công và một ngoại lệ được đưa ra. Kiểm tra tính tương thích cho phép các nhà phát triển xây dựng các ứng dụng hạ lưu có một tập hợp các kịch bản giới hạn để xây dựng các ứng dụng, giúp chuẩn bị cho những thay đổi mà không gặp vấn đề gì. Các chế độ thường được sử dụng là FORWARD, BACKWARD và FULL. Để biết thêm thông tin về các định nghĩa chế độ, hãy xem Lập phiên bản và khả năng tương thích của lược đồ.
  • Xác thực giản đồ - Trình tuần tự đăng ký lược đồ hoạt động để xác nhận rằng dữ liệu được tạo ra tương thích với lược đồ được chỉ định. Nếu không, nhà sản xuất dữ liệu nhận được một ngoại lệ từ bộ tuần tự. Điều này đảm bảo rằng các thay đổi có khả năng phá vỡ được tìm thấy sớm hơn trong các chu kỳ phát triển và cũng có thể giúp ngăn chặn các thay đổi giản đồ không chủ ý do lỗi của con người.
  • Tự động đăng ký các lược đồ - Nếu được định cấu hình để làm như vậy, nhà sản xuất dữ liệu có thể tự động đăng ký các thay đổi giản đồ khi chúng chạy trong luồng dữ liệu. Điều này đặc biệt hữu ích cho các trường hợp sử dụng trong đó nguồn dữ liệu được tạo ra bởi quy trình thu thập dữ liệu thay đổi (CDC) từ cơ sở dữ liệu.
  • Hỗ trợ IAM - Do hỗ trợ IAM tích hợp, chỉ những nhà sản xuất được ủy quyền mới có thể thay đổi một số lược đồ nhất định. Hơn nữa, chỉ những người tiêu dùng được phép đọc lược đồ mới có thể làm như vậy. Các thay đổi lược đồ thường được thực hiện một cách có chủ ý và cẩn thận, vì vậy điều quan trọng là sử dụng IAM để kiểm soát ai thực hiện những thay đổi này. Ngoài ra, kiểm soát truy cập vào lược đồ rất quan trọng trong các tình huống mà bạn có thể có thông tin nhạy cảm được đưa vào chính định nghĩa lược đồ. Trong các ví dụ trước, Vai trò IAM được suy ra thông qua AWS SDK cho Java, vì vậy chúng được kế thừa từ Đám mây điện toán đàn hồi Amazon Vai trò của phiên bản (Amazon EC2) mà ứng dụng chạy trên đó, nếu sử dụng Amazon EC2. Bạn cũng có thể áp dụng vai trò IAM cho bất kỳ dịch vụ AWS nào khác có thể chứa mã này, chẳng hạn như vùng chứa hoặc AWS Lambda chức năng.
  • Bộ khử không khí thứ cấp - Nếu bạn đã đăng ký các lược đồ trong sổ đăng ký lược đồ khác, có một tùy chọn để chỉ định bộ giải mã phụ khi thực hiện tra cứu lược đồ. Điều này cho phép di chuyển từ các đăng ký lược đồ khác mà không cần phải bắt đầu lại. Bất kỳ ID lược đồ nào chưa được biết đến trong Sổ đăng ký lược đồ đều được tra cứu trong sổ đăng ký gắn với bộ giải mã thứ cấp.
  • Nén - Sử dụng sổ đăng ký lược đồ có thể giảm tải dữ liệu do không cần gửi và nhận các lược đồ với mỗi thông báo. Các thư viện đăng ký lược đồ cũng cung cấp một tùy chọn để nén zlib, có thể giảm yêu cầu dữ liệu hơn nữa bằng cách nén tải trọng của thông báo. Điều này thay đổi tùy theo trường hợp sử dụng, nhưng việc nén có thể làm giảm kích thước của thư đáng kể.
  • Nhiều định dạng dữ liệu - Cơ quan đăng ký lược đồ hiện hỗ trợ Định dạng dữ liệu AVRO (v1.10.2), Định dạng dữ liệu JSON với định dạng JSON Schema cho lược đồ (thông số kỹ thuật Draft-04, Draft-06 và Draft-07) và hỗ trợ ngôn ngữ Java, với các định dạng dữ liệu và ngôn ngữ khác sắp ra mắt.

Kết luận

Trong bài đăng này, chúng tôi đã thảo luận về những lợi ích của việc sử dụng AWS Glue Schema Registry để đăng ký, xác thực và phát triển các Lược đồ JSON cho các luồng dữ liệu khi nhu cầu kinh doanh thay đổi. Chúng tôi cũng cung cấp các ví dụ về cách sử dụng Cơ quan đăng ký lược đồ.

Tìm hiểu thêm về Tích hợp với Đăng ký lược đồ keo AWS.


Lưu ý

Aditya Challa là Kiến trúc sư giải pháp cao cấp tại Amazon Web Services. Aditya thích giúp đỡ khách hàng trong các hành trình AWS của họ vì anh ấy biết rằng các hành trình luôn tốt hơn khi có sự đồng hành của họ. Anh ấy là một người yêu thích du lịch, lịch sử, các kỳ quan kỹ thuật và học hỏi điều gì đó mới mỗi ngày.

tại chỗ_img

Tin tức mới nhất

tại chỗ_img

Trò chuyện trực tiếp với chúng tôi (chat)

Chào bạn! Làm thế nào để tôi giúp bạn?