2008-10-09 4 views
10

2-4 서버 환경에서 기본 제공 서버 장애 조치를 사용하는 TIBCO EMS 솔루션이 있습니다. TIBCO가 한 EMS 서버에서 다른 EMS 서버로 장애 조치 서비스를 관리하는 경우 연결은 EMS 서비스 수준에서 새 서버로 자동 전송됩니다. EMS 서비스를 사용하는 C# 응용 프로그램의 경우 이러한 일이 발생하지 않습니다. 즉, 사용자 연결이 장애 조치 후에 새 서버로 전송되지 않고 이유가 확실하지 않습니다.C# (TIBCO.EMS.dll)에 대한 TIBCO EMS 장애 조치 (failover) 재 연결

응용 프로그램을 시작한 후에 TIBCO 관리자가 장애 조치 (failover)를 할 경우 사용자는 새 서버에 다시 연결하기 위해 응용 프로그램을 다시 시작해야합니다 (EMS 연결은 모든 4 프로덕션 EMS 서버 - 첫 번째 시도가 실패하면 문자열의 다음 서버로 이동하여 다시 시도합니다.

연결이 끊어 졌음을 감지하면 주기적으로 EMS에 다시 연결을 시도하는 자동화 된 방법을 찾고 있는데 어떻게해야 최선인지 모릅니다.

아이디어가 있으십니까? 우리는 TIBCO.EMS.dll 버전 4.4.2 및 .Net 2.x (SmartClient 응용 프로그램)를 사용하고 있습니다.

도움이 되길 바랍니다.

+0

어떻게 현재 내결함성을 구현? 'factories.conf'파일의 서버에 있습니까? 'url'속성에 134 페이지의 'tib_ems_dotnet_ref.pdf'에 지정된 URL의 쉼표로 구분 된 목록이 있습니까? –

+0

예, 그렇습니다, 믿거 나 말거나 문제입니다. EMS 서버가 페일 오버 될 때 한 서버에서 다른 서버로 연결이 전송되어야합니다. 연결 문자열에 EMS 서버의 구분 된 목록이있을 때 작동해야하지만 작동하지 않는 EMS.lib의 버그가 있다고 생각합니다. – ScottCher

+0

수신기에서 장애 조치 (failover) 후 오류가 발생합니까? (메시지를 보낼 때) 제작자가 장애 조치 한 후에 오류가 발생합니까? 대부분의 경우 라이브러리에서 다시 연결해야합니다. 연결 문자열에 여러 서버를 제공하면 연결하는 동안 라운드 로빈이 가능해집니다. 나중에는 ... – TheSoftwareJedi

답변

6

이 포스팅은

팁코 'ConnectionFactory에'와 '연결'유형은 스레드 안전 유형 헤비급 있습니다 ... 현재의 내 의견을 요약하고 더 자세히 내 접근 방식을 설명해야한다. TIBCO는 하나의 ConnectionFactory (서버 구성 팩토리 당) 및 하나의 사용을 유지함을 제안합니다. 공장 당 연결 수는입니다.

서버 역시 인데, '연결'페일 오버 및 재 연결을 담당하므로이므로 작업을 수행하고 있는지 확인한 다음 해당 기능을 사용하십시오.

클라이언트 측 솔루션을 만드는 것은 서버 또는 클라이언트 설정 문제를 해결하는 것보다 약간 더 복잡 할 것입니다. 실패한 연결을 통해 생성 한 모든 세션은 다시 만들어야합니다 (제작자, 소비자 및 대상은 말할 것도 없습니다). 두 유형 모두에서 "다시 연결"또는 "새로 고침"메소드가 없습니다. 세션은 부모 연결에 대한 참조를 유지하지 않습니다.

연결/세션 개체의 조회를 관리하고 모든 사용자가 다시 초기화해야합니다! 또는 새 연결을 가져 와서 다시 연결할 수있는 일종의 세션 실패 이벤트 처리기를 구현하십시오.

이제는 클라이언트가 장애 조치 알림을 받도록 설정되어 있는지 확인해 봅시다 (tib ems 사용자 가이드 292 페이지 참조). 발생한 예외가 포착되고, 장애 조치 URL을 포함하며 제대로 처리되고 있는지 확인하십시오.

+1

Tibems.SetExceptionOnFTSwitch (true)를 설정 했으므로 이제 연결이 끊어지는 것을 볼 수 있습니다. 페일 오버 설정에서 아직 테스트 할 수 없었지만 연결이 끊어지면 예외가 발생합니다. 서버가 다시 돌아 오면 기본 제공 재 연결이 작동하지 않습니다. – ScottCher

+0

서버 - 클라이언트 및 클라이언트 - 서버 하트 비트를 확인했습니다. 그들은 테스트 환경에서 사용할 수 없게되었고, 다시 작동하지 않는 것이 원인 일 수 있다고 생각했습니다. Enabled로 설정하고 10 초로 설정하면 다시 연결 시도가 발생하지 않습니다. – ScottCher

+0

서버 연결 실패로 인해 트랩 할 수 있다는 사실은 좋은 징조입니다.하지만 EMS 라이브러리에서 논리 재 연결을 사용하면 수동으로 루프 재 연결을 수행해야하는 것보다 작업을 수행하는 것이 좋습니다. – ScottCher

1

클라이언트 응용 프로그램은 tibco.tibjms.ft.switch.exception 시스템 프로퍼티 아마도

일할 수있는 라이브러리 요구 사항을 설정하여 장애 조치의 통지를 수신 할 수있다?

8

첫째로, 예, 내 질문에 대답하고 있습니다. 그러나 ajmastrean이 없다면 아무 것도 없을 것입니다. 정말 고맙습니다!

하나 : ConnectionFactory.SetReconnAttemptCount, SetReconnAttemptDelay, SetReconnAttemptTimeout을 적절하게 설정해야합니다. 나는 기본값이 너무 빨리 재 시도 (재시도 사이에서 1/2 초 정도)한다고 생각한다.우리의 EMS 서버는 네트워크 스토리지 등으로 인해 장애 조치에 긴 시간이 걸릴 수 있습니다. 따라서 1/2s 간격으로 5 회 재시도가 충분히 길지 않습니다.

TWO : 저는 클라이언트 - 서버 및 서버 - 클라이언트 하트 비트를 사용하는 것이 중요하다고 생각합니다. 확인할 수는 있지만 위치에없는 경우 클라이언트가 서버가 오프라인 상태이거나 장애 조치 모드로 전환되었다는 알림을받지 못할 수 있습니다. 이것은 물론 EMS의 서버 측 설정입니다.

THREE : Tibems.SetExceptionOnFTSwitch (true)를 설정하여 장애 조치 이벤트를 볼 수 있습니다. 그런 다음 예외 이벤트 핸들러를 연결합니다. 단일 서버 환경에서 "연결이 종료되었습니다."라는 메시지가 나타납니다. 그러나 내결함성이있는 다중 서버 환경에있는 경우 "연결에서 내결함성 스위치를 수행했습니다"라고 표시됩니다. 이 알림은 엄격하게 필요하지 않지만 유용 할 수 있습니다 (특히 테스트 할 때).

FOUR : EMS 설명서에서 분명히 명확하지 않은 연결 단일 서버 환경에서 연결 재 연결이 작동하지 않습니다. 다중 서버, 내결함성 환경에 있어야합니다. 그러나 트릭이 있습니다. 이상하게도 동일한 서버를 연결 목록에 두 번 넣을 수는 있지만 작동하고 내장 된 다시 연결 논리를 사용할 수 있습니다.

일부 코드 :

private void initEMS() 
{ 
    Tibems.SetExceptionOnFTSwitch(true); 
    _ConnectionFactory = new TIBCO.EMS.TopicConnectionFactory(<server>); 
    _ConnectionFactory.SetReconnAttemptCount(30);  // 30retries 
    _ConnectionFactory.SetReconnAttemptDelay(120000); // 2minutes 
    _ConnectionFactory.SetReconnAttemptTimeout(2000); // 2seconds 
_Connection = _ConnectionFactory.CreateTopicConnectionM(<username>, <password>); 
    _Connection.ExceptionHandler += new EMSExceptionHandler(_Connection_ExceptionHandler); 
} 
private void _Connection_ExceptionHandler(object sender, EMSExceptionEventArgs args) 
{ 
    EMSException e = args.Exception; 
    // args.Exception = "Connection has been terminated" -- single server failure 
    // args.Exception = "Connection has performed fault-tolerant switch to <server url>" -- fault-tolerant multi-server 
    MessageBox.Show(e.ToString()); 
}