스레드

메시지 처리 노드 및 구문 분석기는 멀티인스턴스, 멀티스레드 환경에서 작동해야 합니다. 다수의 구문 요소를 포함하는 다수의 노드 오브젝트 또는 구문 분석기 오브젝트가 있을 수 있으며, 이러한 오브젝트의 메소드를 실행하는 다수의 스레드가 있을 수 있습니다. Message Broker는 메시지 플로우를 통해 메시지를 수신하고 처리하는 스레드만 메시지 오브젝트 및 여기에 속하는 모든 오브젝트를 사용하도록 설계됩니다.

메시지 플로우 처리 노드의 인스턴스는 해당 노드가 정의된 메시지 플로우를 서비스하는 모든 스레드에 의해 공유되고 사용됩니다. 구문 분석기의 경우, 구문 분석기의 인스턴스는 단일 메시지 플로우 스레드에 의해서만 사용됩니다.

사용자 정의 확장은 이 모델을 준수해야 하며 여러 스레드에 걸친 액세스를 일련화하기 위한 세미포어를 필요로 하는 전역 데이터 또는 자원을 사용하지 않아야 합니다. 그러한 일련화는 성능 저하를 초래할 수 있습니다.

사용자 정의 확장 구현 기능은 재실행 가능(reentrant)해야 하며, 이들이 호출하는 기능도 재실행 가능(reentrant)해야 합니다. 모든 사용자 정의 확장 유틸리티 기능이 전부 재실행 가능(reentrant)해야 합니다.

사용자 정의 확장은 필요한 경우 추가 스레드를 생성(spawn)할 수 있으나, 구현 기능 완료 시 동일한 스레드가 브로커에 제어를 리턴해야 합니다. 그러지 않을 경우에는 브로커의 무결성이 손상되고 예상치 못한 결과가 발생합니다.

실행 모델

실행 그룹이 초기화되면 해당 런타임이 적절한 lil을 사용할 수 있게 됩니다. 실행 그룹 런타임 프로세스는 전용 구성 스레드를 시작하고 생성(spawn)합니다. 메시지 플로우 실행 환경에서 메시지 플로우는 스레드에 안전합니다. 일련화 문제를 고려하지 않고 다수의 OS 스레드에서 동시에 메시지 플로우를 실행할 수 있습니다. 구현하는 사용자 정의 노드가 이 스레드 모델을 손상시켜서는 안 됩니다. 다음 사항에 주의하십시오.
  • 메시지 플로우로 송신되는 입력 메시지는 이를 수신한 스레드에 의해서만 처리됩니다. 메시지 처리 중에 스레드 또는 컨텍스트 스위치가 발생하지 않습니다.
  • 메시지 플로우에서 액세스하는 데이터 구조는 단일 스레드에만 표시되며, 이러한 데이터 구조는 처리 중인 메시지의 지속 기간 동안만 존재합니다.
  • 메시지 플로우의 단일 인스턴스는 메시지 플로우 스레드 풀에 있는 모든 스레드 간에 공유됩니다. 이것은 상태를 포함하지 않는 점에서 메시지 플로우 노드의 작동과 관련이 있습니다.
  • 실행 그룹의 메모리 요구사항은 추가 OS 스레드에서 실행 중인 메시지 플로우로부터 심하게 영향을 받지 않습니다.

스레드 모델

다음 메시지 플로우 예는 사용자 고유의 사용자 정의 노드를 설계 및 구현할 때 알아야 할 몇 가지 스레드 고려사항을 이해하는 데 도움이 됩니다. 사용자 정의 입력 노드의 예를 고려합니다.

스레드 세트에서 실행되도록 메시지 플로우를 구성할 수 있습니다. 이는 메시지 플로우에 있는 입력 노드 수와 메시지 플로우의 추가 인스턴스 등록 정보 값으로 결정됩니다. 이 두 요소는 메시지 플로우가 사용할 수 있는 스레드 풀의 최대 용량을 판별합니다. 따라서 메시지 플로우에서 단일 스레드 실행을 지시하는 특별한 처리 시 요구사항이 있는 경우 사용자가 이를 확인해야 합니다.

input 노드 처리를 위한 일반적인 이벤트 순서는 다음과 같습니다.
  1. Input 노드 구성이 발생합니다.
  2. 스레드 풀에서 스레드가 요구됩니다.
  3. 노드의 실행 메소드에서 할당된 스레드가 시작됩니다.
  4. 구성(또는 재구성)이 확약됩니다.
  5. 스레드의 컨텍스트에서 초기화 처리가 수행됩니다.
  6. 스레드가 브로커의 큐 관리자에 연결합니다.
  7. 메시지 그룹 및 버퍼 오브젝트가 작성됩니다.
  8. 입력 큐에 대한 큐 열기 요청이 큐 관리자에 송신됩니다. 이 큐는 스레드의 지속 기간 동안 열린 상태로 유지됩니다.
  9. input 노드는 메시지 처리 루프를 입력합니다.
  10. 메시지가 수신될 때 데이터 버퍼에 메시지의 헤더 및 본문이 포함됩니다.
  11. 메시지 오브젝트가 작성되어 스레드 그룹에 첨부됩니다.
  12. 여러 스레드를 지정한 경우에는 스레드 디스패치가 활성화됩니다.
  13. 메시지 데이터가 아래로 전달됩니다.
다음 사항에 유의해야 합니다.
  • input 노드는 선택된 메시지 플로우 스레드 모델을 구현합니다.
  • input 노드는 항상 해당 입력 소스에서 읽기를 수행하거나 수신한 메시지를 능동적으로 처리하는 최소한 하나 이상의 스레드를 가집니다. 메시지 플로우에 여러 개의 입력 노드가 있으면, 해당 입력 노드의 디스패치 정책에 따라 추가 스레드 인스턴스를 사용하여 입력 노드를 서비스할 수 있습니다.
스레드를 요구하거나 요청할 수 있습니다. 메시지 플로우가 전개되면, 입력 노드는 초기 스레드를 요구합니다. 메시지 플로우가 스레드 풀과 연관되나, 디스패치 정책을 담당하는 것은 입력 노드입니다. 이는 입력 노드가 항상 자신의 한 인스턴스가 하나의 스레드에서 실행 중이도록 해야 함을 의미합니다. 추가 인스턴스 등록 정보의 디폴트 값은 0이므로, 여러 입력 노드를 정의한 경우에는 스레드에 대한 추가 요청이 실패합니다. 이는 메시지 플로우가 사용자의 예상보다 많은 스레드를 소모할 수 있음을 의미합니다. 이는 또한 여러 입력 노드를 정의한 경우 입력 노드 중 하나에서 스레드 부족 현상이 발생할 수도 있음을 의미합니다.

추가 인스턴스 등록 정보를 사용하여 브로커가 별도의 스레드에서 메시지 플로우의 추가 사본을 시작할 수 있게 하는 것이 입력 큐에 병목현상이 발생하지 않도록 하는 가장 효과적인 방법입니다. 그러나 별도의 스레드를 작성하면 메시지 큐에 있는 메시지가 병렬로 처리될 수 있으므로, 메시지 처리 순서가 중요하지 않을 때만 이 등록 정보를 사용해야 합니다.

스레드는 입력 노드 구성 및 조작의 결과로서 작성됩니다. 스레드는 스레드 풀에서 활성 또는 비활동 상태로 유지되며, 비활동 스레드는 입력 노드에 의해 브로커되거나 브로커가 종료될 때까지 풀에 남아 있습니다.

아래 그림은 메시지 플로우에서의 스레드 할당을 보여줍니다.

메시지 플로우에서의 스레드 할당

다이어그램에 있는 요소에 대한 설명은 함께 제공되는 텍스트를 참조하십시오.

처음에 스레드 1이 요구되어(A) 메시지를 기다립니다. 메시지가 도착하면(B), 스레드 1이 메시지를 전달하고 스레드 2를 디스패치합니다. 스레드 2가 즉시 메시지를 수신하여(C) 전달하고 스레드 3을 디스패치하면, 스레드 3이 메시지를 기다립니다(D). 스레드 1이 완료되어(E) 스레드 풀로 리턴됩니다. 그런 다음 스레드 3이 메시지를 수신하고(F), 스레드 1을 디스패치한 후 메시지를 전달합니다. 이제 스레드 1이 메시지가 큐에 도착하기를 기다립니다(G).

H가 표시된 지점에 주의해야 합니다. 메시지 플로우의 이 인스턴스에서 스레드 1은 메시지를 수신하나, 이 시점에서 다른 모든 스레드가 활성 상태에 있으므로 디스패치를 수행할 수 없습니다. 메시지가 전달됩니다.

이 메시지가 전달된 후에는, 스레드 2가 완료되고(I) 큐에서 새 메시지를 수신하여 이 새 메시지를 전달합니다. 그런 다음 스레드 3이 완료되어(J) 풀로 리턴됩니다. 그런 다음 스레드 2도 완료됩니다(K). 스레드 1이 완료될 때(L), 이 스레드는 디스패치를 수행하지 않았으므로 큐에 메시지가 없더라도 스레드 풀로 리턴할 수 없으며, 대신 큐에 메시지가 도착할 때까지 기다립니다.

WebSphere Message Broker에서의 스레드 작동에 대해 다음 사항에 주의하십시오.
  • 스레드는 워크로드에 필요한 경우에만 작성됩니다. 이는 실행 그룹 프로세스가 구성된 수보다 적은 수의 스레드를 사용할 수 있음을 의미합니다.
  • 사용 가능한 모든 스레드가 메시지 플로우 내에서 능동적으로 처리 중이지 않는 한, 항상 하나의 스레드가 입력 큐를 읽고 있습니다.
  • 특정 시점에서 워크로드가 증가하면, 동일한 메시지 플로우에 있는 다른 입력 노드가 스레드 풀로 리턴된 스레드를 확보할 수 있습니다.
스레드가 메시지를 수신하나 이때 다른 모든 스레드가 활성 상태이면 스레드가 디스패치를 수행할 수 없습니다. 메시지는 전달됩니다. 이 스레드가 완료될 때, 이 스레드는 디스패치를 수행하지 않았으므로 큐에 메시지가 없더라도 스레드 풀로 리턴할 수 없습니다.
관련 태스크
C로 입력 노드 작성
관련 참조
cniDispatchThread
주의사항 | 등록상표 | 다운로드 | 라이브러리 | 지원 | 피드백
Copyright IBM Corporation 1999, 2006 마지막 갱신 날짜: 2006/08/21
as01460_