Avro를 사용하여 Apache Kafka 애플리케이션에 대한 스키마 유효성 검사(Java)

이 빠른 시작 가이드에서는 Event Hubs용 Azure Schema Registry를 사용하여 Apache Kafka 애플리케이션에서 이벤트의 유효성을 검사하는 방법을 살펴봅니다.

이 사용 사례에서 Kafka 생산자 애플리케이션은 Azure Schema Registry에 저장된 Avro 스키마를 사용하여 이벤트를 직렬화하고 Azure Event Hubs의 Kafka 토픽/이벤트 허브에 게시합니다. Kafka 소비자는 Event Hubs에서 사용하는 이벤트를 역직렬화합니다. 이를 위해 이벤트의 스키마 ID와 Azure Schema Registry에 저장된 Avro 스키마를 사용합니다.

Diagram showing schema serialization/de-serialization for Kafka applications using Avro schema.

필수 조건

Azure Event Hubs를 처음 사용하는 경우 이 빠른 시작을 수행하기 전에 Event Hubs 개요를 참조하세요.

이 빠른 시작을 완료하려면 다음 필수 구성 요소가 필요합니다.

이벤트 허브 만들기

빠른 시작: Event Hubs 네임스페이스 및 이벤트 허브 만들기의 지침에 따라 Event Hubs 네임스페이스와 이벤트 허브를 만듭니다. 그런 다음, 연결 문자열 가져오기의 지침에 따라 Event Hubs 네임스페이스에 대한 연결 문자열을 가져옵니다.

현재 빠른 시작에서 사용할 다음 설정을 적어둡니다.

  • Event Hubs 네임스페이스에 대한 연결 문자열
  • 이벤트 허브의 이름입니다.

스키마 만들기

스키마 레지스트리를 사용하여 스키마 만들기의 지침에 따라 스키마 그룹 및 스키마를 만듭니다.

  1. 스키마 레지스트리 포털을 사용하여 contoso-sg라는 스키마 그룹을 만듭니다. Avro는 직렬화 형식으로 사용하고 호환성 모드에서는 사용하지 않습니다.

  2. 해당 스키마 그룹에서 다음 스키마 콘텐츠를 사용하여 스키마 이름:Microsoft.Azure.Data.SchemaRegistry.example.Order으로 새 Avro 스키마를 만듭니다.

    {
      "namespace": "Microsoft.Azure.Data.SchemaRegistry.example",
      "type": "record",
      "name": "Order",
      "fields": [
        {
          "name": "id",
          "type": "string"
        },
        {
          "name": "amount",
          "type": "double"
        },
        {
          "name": "description",
          "type": "string"
        }
      ]
    } 
    

스키마 레지스트리에 액세스할 애플리케이션 등록

Microsoft Entra ID를 사용하면 Azure Portal에서 Microsoft Entra 테넌트에 클라이언트 애플리케이션을 등록하여 Kafka 생산자 및 소비자 애플리케이션에 Azure Schema Registry 리소스에 액세스할 수 있는 권한을 부여할 수 있습니다.

example-app라는 Microsoft Entra 애플리케이션을 등록하려면 Microsoft Entra 테넌트에 애플리케이션 등록을 참조하세요.

  • tenant.id - 애플리케이션의 테넌트 ID 설정
  • client.id - 애플리케이션의 클라이언트 ID 설정
  • client.secret - 인증을 위해 클라이언트 암호 설정

관리 ID를 사용하는 경우 다음이 필요합니다.

  • use.managed.identity.credential - MSI 자격 증명을 사용해야 하며 MSI 사용 VM에 사용해야 했음을 나타냄
  • managed.identity.clientId - 지정된 경우 지정된 클라이언트 ID를 사용하여 MSI 자격 증명을 빌드합니다.
  • managed.identity.resourceId - 지정된 경우 지정된 리소스 ID로 MSI 자격 증명을 빌드합니다.

스키마 레지스트리 읽기 권한자 역할에 사용자 추가

네임스페이스 수준에서 스키마 레지스트리 읽기 권한자 역할에 사용자 계정을 추가합니다. 스키마 레지스트리 기여자 역할을 사용할 수도 있지만 이 빠른 시작에서는 이것이 필요하지 않습니다.

  1. Event Hubs 네임스페이스 페이지의 왼쪽 메뉴에서 액세스 제어(IAM)를 선택합니다.
  2. 액세스 제어(IAM) 페이지의 메뉴에서 + 추가 ->역할 할당 추가를 선택합니다.
  3. 할당 유형 페이지에서 다음을 선택합니다.
  4. 역할 페이지에서 스키마 레지스트리 읽기 권한자(미리 보기)를 선택한 다음, 페이지 아래쪽에서 다음을 선택합니다.
  5. + 구성원 선택 링크를 사용하여 이전 단계에서 생성한 example-app 애플리케이션을 역할에 추가한 후 다음을 선택합니다.
  6. 검토 + 할당 페이지에서 검토 + 할당을 선택합니다.

Kafka 애플리케이션의 클라이언트 애플리케이션 구성 업데이트

Kafka 생산자 및 소비자 애플리케이션의 클라이언트 구성을 만든 Microsoft Entra 애플리케이션과 관련된 구성 및 스키마 레지스트리 정보로 업데이트해야 합니다.

Kafka 생산자 구성을 업데이트하려면 azure-schema-registry-for-kafka/tree/master/java/avro/samples/kafka-producer로 이동합니다.

  1. Event Hubs에 대한 Kafka 빠른 시작 가이드에 따라 src/main/resources/app.properties에서 Kafka 애플리케이션의 구성을 업데이트합니다.

  2. 위에서 만든 스키마 레지스트리 관련 구성 및 Microsoft Entra 애플리케이션을 사용하여 src/main/resources/app.properties에서 생산자에 대한 구성 세부 정보를 다음과 같이 업데이트합니다.

    schema.group=contoso-sg
    schema.registry.url=https://<NAMESPACENAME>.servicebus.windows.net
    
     tenant.id=<>
     client.id=<>
     client.secret=<>
    
  3. 동일한 지침에 따라 azure-schema-registry-for-kafka/tree/master/java/avro/samples/kafka-consumer 구성도 업데이트합니다.

  4. Kafka 생산자 및 소비자 애플리케이션 모두에 대해 다음 Avro 스키마가 사용됩니다.

    {
      "namespace": "com.azure.schemaregistry.samples",
      "type": "record",
      "name": "Order",
      "fields": [
        {
          "name": "id",
          "type": "string"
        },
        {
          "name": "amount",
          "type": "double"
        },
        {
          "name": "description",
          "type": "string"
        }
      ]
    }
    

Avro 스키마 유효성 검사와 함께 Kafka 생산자 사용

Kafka 생산자 애플리케이션을 실행하려면 azure-schema-registry-for-kafka/tree/master/java/avro/samples/kafka-producer로 이동합니다.

  1. Avro 특정 레코드 또는 제네릭 레코드를 생성할 수 있도록 생산자 애플리케이션을 실행할 수 있습니다. 특정 레코드 모드의 경우 먼저 다음 maven 명령을 사용하여 생산자 스키마에 대해 클래스를 생성해야 합니다.

    mvn generate-sources
    
  2. 그런 다음, 다음 명령을 사용하여 생산자 애플리케이션을 실행할 수 있습니다.

    mvn clean package
    mvn -e clean compile exec:java -Dexec.mainClass="com.azure.schemaregistry.samples.producer.App"
    
  3. 생산자 애플리케이션을 성공적으로 실행하면 생산자 시나리오를 선택하라는 메시지가 표시됩니다. 이 빠른 시작에서는 1 - Avro SpecificRecords 생성 옵션을 선택할 수 있습니다.

    Enter case number:
    1 - produce Avro SpecificRecords
    2 - produce Avro GenericRecords
    
  4. 데이터 직렬화 및 게시에 성공하면 생산자 애플리케이션에 다음 콘솔 로그가 표시됩니다.

    INFO com.azure.schemaregistry.samples.producer.KafkaAvroSpecificRecord - Sent Order {"id": "ID-0", "amount": 10.0, "description": "Sample order 0"}
    INFO com.azure.schemaregistry.samples.producer.KafkaAvroSpecificRecord - Sent Order {"id": "ID-1", "amount": 11.0, "description": "Sample order 1"}
    INFO com.azure.schemaregistry.samples.producer.KafkaAvroSpecificRecord - Sent Order {"id": "ID-2", "amount": 12.0, "description": "Sample order 2"}
    

Avro 스키마 유효성 검사와 함께 Kafka 소비자 사용

Kafka 소비자 애플리케이션을 실행하려면 azure-schema-registry-for-kafka/tree/master/java/avro/samples/kafka-consumer로 이동합니다.

  1. Avro 특정 레코드 또는 제네릭 레코드를 사용할 수 있도록 소비자 애플리케이션을 실행할 수 있습니다. 특정 레코드 모드의 경우 먼저 다음 maven 명령을 사용하여 생산자 스키마에 대해 클래스를 생성해야 합니다.

    mvn generate-sources
    
  2. 그런 다음, 다음 명령을 사용하여 소비자 애플리케이션을 실행할 수 있습니다.

    mvn clean package
    mvn -e clean compile exec:java -Dexec.mainClass="com.azure.schemaregistry.samples.consumer.App"
    
  3. 소비자 애플리케이션을 성공적으로 실행하면 생산자 시나리오를 선택하라는 메시지가 표시됩니다. 이 빠른 시작에서는 1 - Avro SpecificRecords 사용 옵션을 선택할 수 있습니다.

    Enter case number:
    1 - consume Avro SpecificRecords
    2 - consume Avro GenericRecords
    
  4. 데이터 소비 및 역직렬화에 성공하면 생산자 애플리케이션에 다음 콘솔 로그가 표시됩니다.

    INFO com.azure.schemaregistry.samples.consumer.KafkaAvroSpecificRecord - Order received: {"id": "ID-0", "amount": 10.0, "description": "Sample order 0"}
    INFO com.azure.schemaregistry.samples.consumer.KafkaAvroSpecificRecord - Order received: {"id": "ID-1", "amount": 11.0, "description": "Sample order 1"}
    INFO com.azure.schemaregistry.samples.consumer.KafkaAvroSpecificRecord - Order received: {"id": "ID-2", "amount": 12.0, "description": "Sample order 2"}
    

리소스 정리

Event Hubs 네임스페이스를 삭제하거나 네임스페이스가 포함된 리소스 그룹을 삭제합니다.