>  기사  >  Java  >  Quarkus를 사용한 Apache Camel 실용 가이드: ETL 애플리케이션 구축

Quarkus를 사용한 Apache Camel 실용 가이드: ETL 애플리케이션 구축

王林
王林원래의
2024-09-03 12:45:31305검색

Apache Camel에 대한 일련의 기사를 소개하게 되어 기쁘게 생각합니다. 이번 첫 번째 게시물에서는 Apache Camel의 복잡성을 깊이 파고들기보다는 그 기능을 보여줄 수 있는 실제 사용 사례를 제시하겠습니다. 특히 Apache Camel을 사용하여 두 데이터베이스 간에 간단한 ETL(추출, 변환 및 로드) 애플리케이션을 생성하는 방법을 배우게 됩니다.

Apache Camel 소개 - 간략한 개요

실제 사용 사례를 살펴보기에 앞서 Apache Camel에 대해 간단히 소개하겠습니다. Apache Camel은 EIP(엔터프라이즈 통합 패턴)를 활용하여 다양한 시스템의 통합을 촉진하는 오픈 소스 통합 프레임워크입니다.

오늘날에는 다양한 유형의 수많은 시스템이 공존합니다. 일부는 레거시 시스템일 수도 있고 일부는 새로운 시스템일 수도 있습니다. 이러한 시스템은 종종 서로 상호 작용하고 통합해야 하는데, 이는 구현 및 메시지 형식이 다르기 때문에 어려울 수 있습니다. 한 가지 해결책은 이러한 차이점을 연결하는 사용자 정의 코드를 작성하는 것이지만, 이로 인해 긴밀한 결합 및 유지 관리가 어려워질 수 있습니다.

대신 Apache Camel은 시스템 간의 차이를 조정하는 추가 계층을 제공하므로 결합이 느슨해지고 유지 관리가 쉬워집니다. Camel은 API(또는 선언적 Java 도메인 특정 언어)를 사용하여 EIP를 기반으로 라우팅 및 중재 규칙을 구성합니다.

EIP(엔터프라이즈 통합 패턴)

Apache Camel을 이해하려면 '엔터프라이즈 통합 패턴(EIP)'을 이해하는 것이 중요합니다. "엔터프라이즈 통합 패턴"이라는 책에서는 구성 요소가 동일한 프로세스나 다른 컴퓨터에서 실행될 수 있는 대규모 구성 요소 기반 시스템을 설계하기 위한 패턴 집합을 설명합니다. 핵심 아이디어는 시스템이 메시지 지향적이어야 하며 구성 요소가 메시지를 통해 통신해야 한다는 것입니다. 패턴은 이러한 커뮤니케이션을 구현하기 위한 툴킷을 제공합니다(그림 1).

Practical Guide to Apache Camel with Quarkus: Building an ETL Application

그림 1 – 통합 솔루션의 기본 요소(enterpriseintegrationpatterns.com)

Apache Camel의 주요 용어

  • 엔드포인트: 엔드포인트는 메시지를 보내고 받는 채널입니다. 구성요소와 외부 세계 사이의 인터페이스 역할을 합니다.

  • 메시지: 메시지는 시스템 간 통신에 사용되는 데이터 구조로 헤더와 본문으로 구성됩니다. 헤더에는 메타데이터가 포함되고, 본문에는 실제 데이터가 포함됩니다.

  • 채널: 채널은 두 엔드포인트를 연결하여 메시지 송수신을 용이하게 합니다.

  • 라우터: 라우터는 한 엔드포인트에서 다른 엔드포인트로 메시지를 전달하여 메시지 경로를 결정합니다.

  • 번역가: 번역가는 메시지를 한 형식에서 다른 형식으로 변환합니다.

Apache Camel 소개에 대해서는 여기서 잠시 멈추려고 합니다. 이제 Apache Camel을 사용하여 두 데이터베이스 간에 간단한 ETL 애플리케이션을 생성하는 방법을 보여드리겠습니다.

문제 설명

중요 구성 요소 중 하나가 데이터베이스인 고부하 시스템이 있다고 가정해 보겠습니다. 어떤 시점에서는 ML 모델 교육, 내보내기, 그래프 생성 등 일반적인 운영 사례 외부에서 이 데이터를 처리해야 하거나 단순히 데이터의 일부가 필요합니다. 물론 이는 운영 데이터베이스에 더 큰 부담을 주게 되며, 이를 위해 필요한 데이터를 추출하고 이를 필요한 형식으로 변환한 후 다른 데이터베이스에 저장할 수 있는 메커니즘을 갖는 것이 최적일 것입니다. 운영보다. 이 전략을 통해 우리는 운영 기반의 과도한 잠재적 과부하 문제를 해결합니다. 또한, 이러한 메커니즘을 사용하면 시스템 부하가 크지 않은 시간(예: 야간)에 이 작업을 수행할 수 있습니다.

솔루션 개요

해법은 아래 다이어그램에 나와 있습니다(그림 2). Apache Camel을 사용하여 두 데이터베이스 사이에 간단한 ETL 애플리케이션을 생성하겠습니다. 애플리케이션은 소스 데이터베이스에서 데이터를 추출하여 변환한 후 대상 데이터베이스에 로드합니다. 소스 데이터베이스에서 데이터를 추출하는 방법에 중점을 두고 이 솔루션을 구현하기 위한 다양한 전략을 도입할 수 있습니다. 데이터 선택 기준은 기록의 수정일을 기준으로 할 것으로 가정합니다. 이 전략은 수정된 데이터를 추출할 수 있는 기회도 제공합니다.

Practical Guide to Apache Camel with Quarkus: Building an ETL Application

그림 2 – Apache Camel을 사용하여 두 데이터베이스 간 데이터 동기화

소스 및 대상 데이터베이스는 다음과 같은 테이블 구조를 갖습니다.

CREATE TABLE IF NOT EXISTS user
(
    id            serial PRIMARY KEY,
    username      VARCHAR(50)  NOT NULL,
    password      VARCHAR(50)  NOT NULL,
    email         VARCHAR(255) NOT NULL,
    created_at    timestamp default now()::timestamp without time zone,
    last_modified TIMESTAMP DEFAULT now()::timestamp without time zone
);

대상 데이터베이스에서는 사용자 이름을 삽입하기 전에 대문자로 변환합니다.

다양한 Camel 구성요소에 Camel Quarkus 확장을 사용하겠습니다. 특히 Camel SQL 구성 요소를 사용하여 데이터베이스와 상호 작용합니다. SQL 구성요소는 SQL 쿼리, 삽입, 업데이트 및 삭제 수행을 지원합니다.

먼저 RouteBuilder를 확장하는 클래스를 생성하고 구성 메소드를 재정의합니다.

@ApplicationScoped
public class UserRoute extends RouteBuilder {
    @Override
    public void configure() throws Exception {
        // your code here
    }
}

여기서 @ApplicationScoped 주석 사용은 필수는 아니지만 클래스가 CDI Bean이고 CDI 컨테이너에서 관리되어야 함을 나타내는 것을 선호합니다.

위에서 언급했듯이 Camel SQL 구성 요소를 사용하여 데이터베이스와 상호 작용합니다. 소스 및 대상 데이터베이스에 연결하려면 Camel SQL 구성 요소를 구성해야 합니다. Quarkus Agroal 확장 프로그램을 사용하여 데이터 소스를 구성하겠습니다. Agroal 확장은 데이터 소스에 대한 연결 풀을 제공합니다. application.properties 파일에서 데이터 소스를 구성하겠습니다.

#
# Source Database Configuration
quarkus.datasource.source_db.db-kind=postgresql
quarkus.datasource.source_db.jdbc.url=jdbc:postgresql://localhost:5001/demo
quarkus.datasource.source_db.username=test
quarkus.datasource.source_db.password=password1
#
#
# Target Database Configuration
quarkus.datasource.target_db.db-kind=postgresql
quarkus.datasource.target_db.jdbc.url=jdbc:postgresql://localhost:6001/demo
quarkus.datasource.target_db.username=test
quarkus.datasource.target_db.password=password1
#

이제 소스 및 대상 데이터베이스에 연결하도록 Camel SQL 구성 요소를 구성할 수 있습니다. sql 구성 요소를 사용하여 소스 및 대상 데이터베이스에 대한 SQL 엔드포인트를 생성하겠습니다.

SQL 구성 요소는 다음 끝점 URI 표기법을 사용합니다.

sql:select * from table where id=# order by name[?options]

하지만 작업을 자동으로 실행하려면 메커니즘이 필요합니다. 타이머 구성 요소를 사용하여 매 초마다 ETL 프로세스를 트리거합니다. 타이머 구성 요소는 타이머가 실행될 때 메시지 교환을 생성하는 데 사용됩니다. 타이머 구성 요소는 다음 끝점 URI 표기법을 사용합니다.

timer:name[?options]

저희 경로에서는 다음과 같은 구성을 사용합니다.

 from("timer://userSync?delay={{etl.timer.delay}}&period={{etl.timer.period}}")

{{etl.timer.delay}} 및 {{etl.timer.period}}는 application.properties 파일에서 정의할 구성 값입니다.

etl.timer.period=10000
etl.timer.delay=1000

데이터를 대상 데이터베이스에 삽입하기 전에 변환하려면 번역기를 제공해야 합니다.

.process(exchange -> {
    final Map<String, Object> rows = exchange.getIn().getBody(Map.class);

    final String userName = (String) rows.get("username");

    final String userNameToUpperCase = userName.toUpperCase();

    log.info("User name: {} converted to upper case: {}", userName, userNameToUpperCase);

    rows.put("username", userNameToUpperCase);
})

프로세서 인터페이스는 메시지 교환 소비자를 구현하거나 메시지 번역기 및 기타 사용 사례를 구현하는 데 사용됩니다.

자, 짜잔, Apache Camel을 사용하여 두 데이터베이스 사이에 간단한 ETL 애플리케이션이 생겼습니다.

애플리케이션을 실행하면 로그에 다음 출력이 표시됩니다.

2024-06-09 13:15:49,257 INFO  [route1] (Camel (camel-1) thread #1 - timer://userSync) Extracting Max last_modified value from source database
2024-06-09 13:15:49,258 INFO  [route1] (Camel (camel-1) thread #1 - timer://userSync) No record found in target database
2024-06-09 13:15:49,258 INFO  [route2] (Camel (camel-1) thread #1 - timer://userSync) The last_modified from source DB: 
2024-06-09 13:15:49,274 INFO  [route2] (Camel (camel-1) thread #1 - timer://userSync) Extracting records from source database
2024-06-09 13:15:49,277 INFO  [org.iqn.cam.rou.UserRoute] (Camel (camel-1) thread #1 - timer://userSync) User name: john_doe converted to upper case: JOHN_DOE
2024-06-09 13:15:49,282 INFO  [org.iqn.cam.rou.UserRoute] (Camel (camel-1) thread #1 - timer://userSync) User name: jane_smith converted to upper case: JANE_SMITH
2024-06-09 13:15:49,283 INFO  [org.iqn.cam.rou.UserRoute] (Camel (camel-1) thread #1 - timer://userSync) User name: alice_miller converted to upper case: ALICE_MILLER

GitHub 저장소에서 애플리케이션의 전체 소스 코드를 찾을 수 있습니다.

결론

이 설정을 통해 소스 데이터베이스에서 데이터를 추출하고 변환한 후 대상 데이터베이스에 로드하는 Apache Camel을 사용하여 간단한 ETL 애플리케이션을 만들었습니다. 이 접근 방식은 운영 데이터베이스의 로드를 줄이는 데 도움이 되며 사용량이 적은 시간에도 데이터 추출을 수행할 수 있습니다.

위 내용은 Quarkus를 사용한 Apache Camel 실용 가이드: ETL 애플리케이션 구축의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.