다음을 통해 공유


어댑터에서 큰 메시지를 처리하는 방법

BizTalk 메시징 엔진은 큰 메시지를 처리할 수 있으며 메시지의 최대 크기를 제한하지 않습니다. 그러나 최적 성능 및 리소스 관리를 유지하려면 메시지 크기 제한을 고려해야 합니다. 메시지 크기가 증가함에 따라 초당 처리되는 메시지 수는 감소합니다. 시나리오를 디자인하고 용량을 계획할 때 BizTalk Server 처리되는 평균 메시지 크기, 메시지 유형 및 메시지 수를 고려합니다.

스트림 기반 처리

어댑터를 개발할 때는 큰 메시지 처리를 염두에 두는 것이 중요합니다. 크기에 관계없이 전체 데이터 스트림을 메모리에 로드하는 것은 BizTalk Server 프로세스가 중지될 수 있으므로 권장되지 않습니다. 지정된 시간에 엔진에서 처리하는 메시지 크기와 수에 따라 가상 메모리 부족 문제가 발생할 수 있습니다. 대신 다음과 같이 스트리밍 방식으로 메시지를 처리해야 합니다.

  • 인바운드 메시지. 인바운드 메시지의 경우 수신 어댑터가 BizTalk 메시지에 네트워크 스트림을 연결하고 BizTalk 메시징 엔진이 스트림을 "끌어옵니다".

  • 아웃바운드 메시지. 아웃바운드 메시지의 경우 어댑터가 스트림을 끌어옵니다. 이렇게 하면 MessageBox 데이터베이스에서 송신 파이프라인을 통해 스트림을 효과적으로 끌어올 수 있습니다. 어댑터는 스트리밍 방식으로 전선을 통해 데이터를 보냅니다.

    다음 그림은 메시징 엔진 수신 측면의 스트림 기반 처리를 보여 줍니다.

    메시징 엔진의 수신 쪽에서 스트림 기반 처리를 보여 주는 이미지입니다.

    어댑터는 메시지를 엔진으로 전송할 때 BizTalk 메시지에 데이터 스트림을 연결해야 합니다. 일부 어댑터에서는 이 과정이 네트워크 스트림 구현일 수 있습니다. 메시지가 전송되면 엔진에서 수신 파이프라인을 실행합니다. 파이프라인 실행 중에 데이터를 변경할 파이프라인 구성 요소는 새 메시지의 스트림을 이전 메시지의 스트림으로 연결하여 메시지를 복제합니다. 파이프라인이 실행된 후에 메시징 엔진은 파이프라인에서 메시지를 가져와 해당 메시지의 스트림을 읽는 루프를 실행합니다. 이 스트림 읽기는 이전 스트림에 대한 읽기를 호출하고, 이전 스트림은 그 이전 스트림에 대한 읽기를 호출하여 네트워크 스트림에까지 이어집니다. 엔진은 정기적으로 데이터를 MessageBox로 플러시하여 플랫 메모리 모델을 유지 관리합니다.

    문제 해결 팁: 송신 쪽에서 어댑터는 스트림을 읽습니다. 송신 어댑터가 송신 파이프라인에서 승격 또는 기록된 메시지 컨텍스트 속성을 읽으려는 경우 전체 스트림을 읽을 때까지 해당 속성을 쓸 수 없습니다. 스트림을 완전히 읽은 경우에만 어댑터에서 모든 파이프라인 구성 요소의 실행이 완료되었음을 확신할 수 있습니다.

스트림에서 특정 바이트 찾기

일시 중단해야 하는 실패한 메시지를 처리하기 위해 어댑터에서 스트림의 시작 부분을 찾아야 하는 시나리오가 있습니다. 이러한 예로 청크 분할 인코딩을 사용하여 데이터를 받고 간청-응답 쌍으로 응답 메시지를 전송하는 HTTP 어댑터를 들 수 있습니다.

그러나 많은 시나리오에서는 데이터 스트림을 추적할 수 없습니다. 예를 들어 청크 분할 인코딩을 사용하여 데이터를 받는 HTTP 어댑터를 고려해 보십시오. 보내지 못한 메시지를 찾을 수 있도록 데이터 스트림을 디자인하려면 어댑터가 데이터를 읽을 때 메모리나 디스크에 데이터를 캐시해야 합니다. 이는 최적의 방법은 아니며 추가 리소스가 필요합니다. 또한 즉시 사용 가능한 많은 파이프라인 구성 요소는 앞으로만 이동 가능한 스트리밍 방식으로 작동합니다. 이러한 시나리오의 경우 SDK의 BaseAdapter는 VirtualStream이라는 도우미 클래스를 사용합니다. 이 기능이 포함된 파일의 이름은 VirtualStream.cs로 지정됩니다.

참고

VirtualStream.cs 파일은 파이프라인 SDK 샘플 아래의 두 위치에 있습니다. SDK\Samples\Pipelines\ArbitraryXPathPropertyHandler 및 SDK\Samples\Pipelines\SchemaResolverComponent\SchemaResolverFlatFileDasm.

가상 스트림의 기반이 되는 개념은 데이터가 디스크의 안전한 위치에 오버플로되는 임계값에 도달할 때까지는 스트림의 데이터가 메모리 스트림에 캐시된다는 것입니다. 스트림이 닫힌 후에 디스크 파일은 자동으로 삭제됩니다. 이런 방식으로 앞으로만 이동 가능한 스트림을 디자인할 수 있습니다.