클라이언트에서 보낸 단일 JMS 메시지를 두 시스템에 정확하게 (정확히 한 번) 전달해야한다는 요구 사항이 있습니다. 이 두 시스템은 HA-사용할 수 없습니다, 그래서 생각 해낸 최고의 제안하는 것입니다 :JMS 메시지를 2 개의 대상으로 "복사"하는 방법은 무엇입니까?
에 대한 클라이언트의 게시물이 "중간"큐
을 설정 한 큐를 만들
은 사용자 정의 "DuplicatorMDB"를 사용하여 클라이언트 대기열에서 메시지를 읽고 같은 트랜잭션 내에서 두 개의 대기열에 게시합니다. 같은 기존의 기능
client->JMSDQ->DuplicatorMDB->Q1->MDB->System1 \->Q2->MDB->System2
있습니까? 백엔드 시스템 중 하나 또는 둘 다 작동 중지 된 경우 시스템을 안정되게 유지하기 위해 시스템의 균형을 유지하는 적절한 방법은 무엇입니까?
응용 프로그램 서버는 웹 로직 (10)
내가 너무 많은 메시지 중복이 발생할 수 있기 때문에 클러스터 항목에 이것에 대한 주제를 사용할 수 있습니다. 우리는이 개 인스턴스가있는 경우, 다음 주제는 다음과 같이 갈 것이다 :
모든 메시지가 시스템 2에 두 번 시스템 1에 두 번 제공되며, 클러스터의 8 개 서버가있을 수 있습니다 경우에 따라서client->Topic-->[email protected]>System1 | \->[email protected]>System2 \---->[email protected]>System1 \--->[email protected]>System2
, 각 메시지를 8 번 배달됩니다. 이것은 내가 정말로 피하고 싶은 것입니다.
마침내 테스트 할 시간이있었습니다. 여기 내가 관찰 한 것이 있습니다 : 클러스터의 2 노드. 2 JMS 서버 : node1의 jms1, node2의 jms2. 분산 주제 dt. 영구 가입 및 jms-client-id = durableSubscriber가있는 MDB. 시스템을 시작했습니다 : 0 메시지, mdb @ node1이 가동되고 mdb @ node2가 주기적으로 연결을 시도하지만 "클라이언트 ID, durableSubscriber가 사용 중이므로"할 수 없습니다. 예상대로.
메시지 수 : jms1 @ dt messages 현재 = 0, 메시지 총계 = 100, 소비자 현재 = 1 node1이 100 개의 메시지를 처리 한 것을 볼 수 있습니다.
jms2 @ dt messages current = 100, messages total = 100, consumers current = 1 즉 "duplicate"메시지가 주제에서 보류 중입니다.
다른 100 개의 메시지가 전송되면 노드 1에서 100 개가 처리되고 node2에서 보류중인 200 개가 처리됩니다.
노드 1을 재부트하면 mdb @ node2가 dt에 다시 연결되고 "보류 중"메시지 처리가 시작됩니다. 노드 2에서 200 개의 메시지가 처리되었습니다.
node1이 가동 된 후 mdb @ node1은 dt에 연결할 수없고 mdb @ node2는 연결됩니다. 0 = 현재 메시지 DT
jms1 @ 메시지 0 = 총 0 = 현재 메시지 DT 0
jms2 @ = 현재 소비자가, 메시지 1
100 이상의 메시지 보내기 = 소비자 전류 200 총 모든 100 개의 메시지가 node2에서 처리되고 node1에서 삭제 된 것을 볼 수 있습니다.
jms1 @ 0 = 현재 메시지 DT, 메시지 = 100 소비자 전류 = 0
jms2 @ 메시지 = 0, 메시지 = 300 총 전류 dt가 소비자 전류 = 이제 노드 2를 재부팅 1
, MDB 전체 @ node1은 dt에 다시 연결합니다. 재부팅 후 mdb @ node2가 dt에 다시 연결되고 mdb @ node1이 dt에서 연결 해제됩니다. 0 = 현재 메시지 DT
jms1 @ 메시지 = 100 총 0 = 현재 메시지 DT 1
jms2 @ = 현재 소비자 메시지 0 = 총 전류 소비자 = 1 I (100) 메시지를 보내
, 모두 노드 1 항목에서 노드 2에서 처리 및 저장된다 : 100 = 현재 메시지 dt를
jms1 @ 메시지 0 = 현재 메시지 dt가 = 200 소비자 전류 = 1
jms2 @ 전체 메시지는 = 0, 소비자 총 현재 = 1
그렇다면 de2와 mdb @ node1이 주제에 다시 연결된 후 node1에서 100 개의 "보류중인 메시지"가 처리되는 것을 봅니다.
그래서 결과는 다음과 같습니다. 400 개의 메시지를 보냈습니다. 700 개는 MDB에서 처리했으며 300 개는 중복되었습니다.
MDB 재 연결이 예상대로 잘 작동하는 것처럼 보이지만 "활성"MDB를 호스트하는 노드가 다운되면 메시지가 복제 될 수 있습니다.
이것은 weblogic JMS 구현의 버그 또는 기능 일 수 있습니다.
나는 뭔가를 놓친가요? 주제를 사용하지 않는 이유는 무엇입니까? – SingleShot
영구 가입에 대한 의견이 있으십니까? –