2011-11-01 6 views
3

저는 TIBCO EMS를 통해 요청/응답 서비스를 제공하는 서버 측 프로젝트를 진행하고 있으며이 서비스의 낮은 대기 시간뿐만 아니라 확장 성을 보관하는 모범 사례에 대한 조언을 찾고 있습니다. .NET에서이 작업을 수행하고 있지만 TIBCO EMS가 JMS 사양을 구현하고 있기 때문에 다른 JMS 구현 및 플랫폼 (Java)에 대한 조언이 적절하다고 가정합니다.TIBCO EMS (또는 다른 JMS)에서 확장 가능 요청/응답 프로세서는 어떻게 작성합니까?

현재 우리는 하나의 Connection, 하나의 Session, 하나의 Consumer를 사용하고 있고 그 단일 Consumer에서 콜백을 사용하여 메시지를 듣고 있습니다. 각 요청은 콜백 스레드에서 처리되며 다른 큐 (동 일한 세션)에서 동 기적으로 응답합니다. 이 방법은 효과가 있지만 확장되지는 않습니다. 높은 트랜잭션 속도에서도 CPU로드는 무시할 만하지만 요청 대기 시간은 계속 증가합니다.

EMS가 콜백에 대해 단일 스레드를 사용한다는 가정하에 응답을 처리하는 데 걸리는 시간은 물론 처리 시간도 다른 요청을 처리하지 못하도록 차단하지만, 가장 좋은 방법은 무엇입니까? 이 크기를 늘리는거야?

한 가지 방법은받은 스레드 풀에서 들어오는 요청의 실제 처리를 즉시 예약하는 것입니다. 이것은 신속한 수정이며 확장되지만 추가 지연 시간을 가져오고 세션 사용에 대한 스레딩 문제를 일으킬 수 있습니다. 또 다른 하나는 Session 객체 또는 심지어 Connection 객체의 수를 갖는 것입니다. 누구든지이 작업을 수행하는 모범 사례에 대한 조언을 구할 수 있습니까? 더 일반적인 사용 패턴 중 하나 여야합니다.

답변

1

두 단계 대기열 처리 프로세스가 필요합니다. 귀하의 콜백은 가능한 한 적게해야하며, 선호하는 옵션은 단지 메시지를 로컬 대기열에 큐에 넣는 것입니다. <T>. 그런 다음이 큐에 여러 로컬 스레드가 액세스 할 수 있습니다. 사용 가능한 항목을 큐에서 제거 및 처리하고 JMS 큐 프로세스가 계속 진행되도록하여 많은 양의 대기 시간을 제거합니다.

결과를 올바른 소비자에게 돌려주기 위해서는 약간의 동기화가 필요하지만 비교적 사소한 작업이어야합니다.

+0

나는 클라이언트 승인 모드를 사용하고 있다면, 나는 메시지를 처리하고 각 스레드에서 처리 메시지를 확인하면 여러 스레드를 사용할 수 있습니까? –

0

메시지 처리는 수신 확인 모드 및 병렬 세션 수에 의해 영향을받습니다.

당신이 말한대로, 나는 하나의 세션 만 사용하고 차례로 처리 (및 응답) 한 후 메시지를 확인 (클라이언트 확인)합니다.

및/또는 병렬로 여러 세션을 사용하면 자동 수신 확인 (수신 중에 메시지 확인)을 사용하여 속도를 높일 수 있습니다.

위에서 EMS는 "prefetch count"라는 매개 변수로 메시지 푸시를 가속화 할 수 있습니다. 은 큐에서 새 메시지를 가져 오는 시간을 줄입니다. (EMS 문서 참조).

늦은 대답,하지만 난이 도움이되기를 바랍니다)