메시지 교환 패턴을 사용하는 경우(사용하지 않는 경우)
동기 및 비동기 통신의 차이점
CQRS 및 이벤트 소싱과 비교한 장단점
데이터 스트리밍 인프라 내에서 요청-응답을 구현하는 방법
요청-응답은 컴퓨터 가 네트워크에서 서로 통신하는 데 사용하는 기본 방법 중 하나입니다.
첫 번째 응용 프로그램은 일부 데이터에 대한 요청을 보냅니다.
두 번째 응용 프로그램은 요청에 응답합니다 .
요청자가 요청 메시지를 응답 시스템으로 보내고 응답 시스템은 요청을 수신하여 처리하여 궁극적으로 응답으로 메시지를 반환하는 메시지 교환 패턴 입니다.
요청-응답은 비효율적이며 사용 사례에 따라 많은 지연이 발생할 수 있습니다 . HTTP 또는 더 나은 gRPC는 일부 사용 사례에 적합합니다.
요청-응답 은 스트리밍 데이터용 Kafka로 CQRS( 명령 및 쿼리 책임 분리) 패턴으로 "대체"됩니다 .
요청-응답(HTTP)
일반적으로 동기식
포인트 투 포인트
높은 대기 시간(데이터 스트리밍에 비해)
사전 정의된 API
데이터 스트리밍(카프카)
연속 처리
종종 비동기식
이벤트 기반
짧은 대기 시간
범용 이벤트
이를 염두에 두고 HTTP가 Kafka와 함께 사용되는 사용 사례를 살펴보겠습니다.
요청 - 응답 메시지 교환 패턴은 종종 순전히 동기적으로 구현 됩니다.
REST, 메시지 큐, 데이터 스트리밍과 같은 메시지 교환의 가장 일반적인 예를 살펴보겠습니다.
웹 서비스는 애플리케이션 개발 및 엔터프라이즈 애플리케이션 통합에서 동기 통신의 기본 기술입니다.
수년 전에는 WSDL과 SOAP가 지배적이었지만 REST/HTTP는 오늘날 거의 모든 웹 서비스의 통신 표준입니다.
REST와 SOAP는 각기 다른 두 가지의 온라인 데이터 전송 방식입니다.
둘 다 웹 애플리케이션 간 데이터 통신을 허용하는 애플리케이션 프로그래밍 인터페이스(Application Programming Interface, API)를 구축하는 방법을 정의합니다.
- REST(Representational State Transfer)는 아키텍처 원칙 세트
- SOAP(Simple Object Access Protocol)는 World Wide Web Consortium(W3C)에서 유지관리하는 공식 프로토콜입니다.
- 즉, SOAP는 프로토콜이지만, REST는 프로토콜이 아니라는 점이 주요 차이점
출처
REST(Representational state transfer)는 소프트웨어 산업 전반에 걸쳐 채택되어 왔으며 안정적인 상태 비저장 웹 API를 생성하기 위해 널리 인정되는 일련의 지침입니다.
REST 제약 조건을 준수하는 웹 API는 비공식적으로 RESTful로 설명됩니다.
RESTful 웹 API는 일반적으로 HTTP 메서드를 기반으로 합니다.
HTTP를 통한 동기 웹 서비스 호출은 연결을 열린 상태로 유지하고 응답이 전달되거나 제한 시간이 만료될 때까지 기다립니다.
HTTP 웹 서비스의 대기 시간은 상대적으로 높습니다.
HTTP를 사용할 때 각 요청-응답 반복에 대해 TCP 연결을 설정하고 해제해야 합니다.
명확하게 말하면 대기 시간은 여전히 많은 사용 사례에 충분합니다.
단점은 HTTP 요청이 대기열 요청의 헤드가 처리되기를 기다리는 것을 차단할 수 있고 미해결 HTTP 요청이 너무 많은 경우 서버에 HTTP 회로 차단기를 설정해야 할 수 있다는 것입니다.
메시지 대기열 패러다임은 게시자/가입자 디자인 패턴의 형제이며 일반적으로 보다 광범위한 메시지 지향 미들웨어 시스템의 한 부분입니다.
생산자와 소비자는 서로 분리되어 비동기식으로 통신합니다.
메시지 대기열은 성공적으로 소비될 때까지 이벤트를 저장합니다.
대부분의 메시지 대기열 미들웨어 제품은 기본 제공 요청-응답 API를 제공 합니다.
통신은 비동기식 입니다.
구현에서는 상관 관계 ID를 사용합니다.
요청-응답 API(예: JMS)는 요청에서 응답 대상 엔드포인트를 가져와 소비자가 사용할 요청에서 참조되는 임시 대기열 또는 주제를 생성합니다.
ID는 단일 요청자와 요청을 구분하는 데 사용됩니다.
이러한 대기열 또는 주제는 요청자가 응답에 대한 세션과 함께 활성 상태인 동안에만 사용할 수 있습니다.
임시 대기열이나 이러한 구현은 Kafka에서 의미가 없습니다.
Kafka는 그런 식으로 작동하지 않습니다. 그 결과 Kafka 클러스터에 너무 많은 파티션과 주제가 있었습니다. 확장성과 성능 문제가 그 결과였습니다.
데이터 스트리밍은 데이터 소스에서 수집된 이벤트를 지속적으로 처리합니다.
비동기 통신 패러다임은 메시지 대기열과 같습니다.
메시지 대기열과 달리 데이터 스트리밍은 이벤트의 장기 저장과 기록 정보의 재생성을 제공 합니다.
그 결과 생산자와 소비자 사이의 진정한 분리가 이루어집니다.
대부분의 Apache Kafka 배포에서 통신 패러다임과 대기 시간 기능이 매우 다른 여러 생산자와 소비자가 이벤트를 보내고 읽습니다.
Apache Kafka는 기본 제공 요청-응답 API를 제공하지 않습니다.
이 게시물에서는 Kafka를 사용하여 비동기식 또는 동기식 요청-응답을 구현하는 방법도 살펴봅니다 .
CQRS(Command and Query Responsibility Segregation, 명령과 조회의 책임 분리) 에 따르면 모든 메서드는 작업을 수행하는 명령이나 호출자에게 데이터를 반환하는 쿼리 중 하나여야 합니다
이벤트 소싱
엔터티가 직접 직렬화 또는 개체 관계형 매핑을 사용하여 내부 상태를 추적하지 않고 이벤트를 읽고 이벤트 저장소에 커밋 하는 아키텍처 패턴입니다.
이벤트 소싱이 CQRS 및 도메인 기반 설계와 결합 되면 집계 루트는 명령의 유효성을 검사하고 적용한 다음(종종 명령 처리기에서 인스턴스 메서드를 호출하여) 이벤트를 게시하는 역할을 합니다.
CQRS를 사용하면 모든 관련 이벤트 메시지에 대해 상태가 업데이트됩니다. 따라서 상태는 항상 알려져 있습니다.
구체화된 뷰(예: Kafka Streams의 KTable)에 저장된 상태를 쿼리하는 것이 효율적입니다.
요청-응답을 통해 서버는 모든 요청의 상태를 계산하거나 결정해야 합니다.
CQRS를 사용 하면 해당 발생 시점의 상태 쿼리 수에 관계없이 한 번만 계산/업데이트 됩니다.
이러한 원칙은 데이터 스트리밍 세계에 완벽하게 들어 맞습니다.
Apache Kafka는 수신 이벤트를 변경할 수 없는 커밋 로그에 추가하는 분산 스토리지입니다.
이벤트의 진정한 디커플링 및 재생 가능성은 기본적으로 Kafka 인프라에 구축되어 있습니다.
도메인 기반 설계를 사용하는 대부분의 최신 마이크로서비스 아키텍처는 REST 또는 MQ가 아닌 Apache Kafka로 구축됩니다.
정말로 필요하지 않다면 Kafka와 함께 요청-응답 개념을 사용하지 마십시오! Kafka는 스트리밍 데이터와 다양한 생산자와 소비자 간의 진정한 디커플링을 위해 구축되었습니다.
이는 트랜잭션 워크로드의 경우에도 마찬가지입니다.
트랜잭션에는 동기 통신이 필요하지 않습니다.
Kafka API는 미션 크리티컬 트랜잭션을 지원합니다 (비록 비동기적이고 본질적으로 분산됨).
새로운 Kafka 애플리케이션을 구축할 때 요청-응답이 첫 번째 아이디어가 되어서는 안 된다고 설명했지만 이것이 불가능하다는 의미는 아닙니다.
요청-응답 패턴은 Kafka로 구현할 수 있습니다.
하지만 다르게. JMS 메시지 브로커(임시 대기열 등 포함)에서처럼 수행하려고 하면 궁극적으로 Kafka 클러스터가 종료됩니다(다르게 작동하기 때문에).
그럼에도 불구하고 사용된 개념은 상관 ID와 같이 JMS API에서와 같이 후드 아래에서 동일합니다.
Spring 프로젝트 와 Kafka Spring Boot Kafka 템플릿 라이브러리에는 Kafka로 빌드된 비동기 요청-회신 패턴 의 좋은 예가 있습니다.
"org.springframework.kafka.requestreply.ReplyingKafkaTemplate "을 확인하십시오.
Kafka API를 사용하여 요청/응답 애플리케이션을 쉽게 생성합니다.
Spring의 장점은 사용하기 쉬운 템플릿과 메서드 서명을 사용할 수 있다는 것 입니다.
프레임워크 를 사용하면 사용자 지정 코드 없이 디자인 패턴을 사용하여 구현할 수 있습니다.
예를 들어 다음은 Kafka를 사용한 요청-응답을 위한 두 가지 Java 메서드입니다.
RequestReplyFuture<K, V, R> sendAndReceive (ProducerRecord<K, V> 레코드) ;
RequestReplyFuture<K, V, R> sendAndReceive (ProducerRecord<K, V> 레코드, 응답 시간 종료) ;
결과는 ListenableFuture 비동기식으로 결과(또는 시간 초과의 경우 예외)로 채워집니다.
sendFuture 결과는 호출한 결과인 속성도 있습니다.
KafkaTemplate.send()
이 미래를 사용하여 보내기 작업의 결과를 결정할 수 있습니다.Spring Kafka 템플릿을 사용한 동기 요청/응답
Spring은 자동으로 생산자 레코드에 상관 ID를 설정합니다 .
Kafka 템플릿에 대한 Spring 문서에는 Kafka의 요청/회신 패턴에 대한 많은 세부 정보와 코드 예제가 있습니다.
Spring을 사용하면 요청/응답 패턴을 Kafka로 구현하는 것이 매우 간단합니다.
Spring을 사용하지 않는 경우 프레임워크에서 Kafka로 요청-응답을 수행하는 방법을 배울 수 있습니다.
위의 예는 Apache Kafka로 요청-응답 패턴을 구현하는 방법을 보여주었습니다.
데이터 스트리밍과 요청-응답 REST API는 종종 두 세계를 최대한 활용하기 위해 결합됩니다.
매우 일반적인 접근 방식은 Kafka 에코시스템을 사용하여 실시간으로 대규모 애플리케이션을 구현한 다음 API 관리 계층을 맨 위에 배치하여 이벤트를 외부 세계 (다른 내부 비즈니스 도메인 또는 B2B 타사 애플리케이션)에 API로 노출하는 것입니다.
다음은 SAP 데이터를 연결하는 예입니다.
스트리밍 데이터 허브로 데이터를 가져오는 방법에 관계없이 오른쪽에서 Kafka REST API는 HTTP를 통해 이벤트를 노출하는 데 사용됩니다 .
API, 요청-응답 통신, Kafka 간의 관계에 대해 논의한 후 시장의 중요한 트렌드인 Data Mesh(유행어)와 실시간 데이터 공유를 위한 스트림 교환(문제 해결사)을 살펴보겠습니다.
Data Mesh는 요즘 많은 화제를 불러일으키고 있는 새로운 아키텍처 패러다임입니다. 데이터 메시를 구축하는 데 완벽한 단일 기술은 없습니다 .
요청-응답 및 REST API를 중간에 사용하는 대신 스트림 네이티브 데이터 공유는 많은 사용 사례에서 자연스러운 진화입니다.
대부분의 아키텍처는 점대점 통신 (예: 서버와 모바일 앱 간) 을 위한 요청-응답 과 지속적인 데이터 처리를 위한 데이터 스트리밍이 필요합니다 .
Apache Kafka를 사용하여 동기 및 비동기 요청-응답 통신을 구현할 수 있습니다.
그러나 CQRS 및 이벤트 소싱은 대부분의 경우 데이터 스트리밍에 더 좋고 자연스러운 접근 방식입니다.
다양한 옵션과 장단점을 이해하고 작업에 적합한 도구(이 경우 올바른 디자인 패턴)를 사용하십시오.
너무 감사합니다 ㅜㅜㅠㅜㅜㅜㅜ