Share via


HUB와 MBX의 라운드 로빈 메카니즘

ü 클라이언트가 새로운 메일을 보냅니다.

ü Mapi 메시지는 스토어에 생성될 것이고, MDB Event history에 메일이 왔다는 EVENT가 제공됩니다.

ü 위 그림에서 Mailbox Server에 있는 AI로부터 제공된 MAPI event를 , mailsubmission 서비스는 RPC를 통해서 HUB 서버의 Transport service도 포워딩 합니다.

ü HUB 서버에 동작하는 Transport Service내의 Store Driver는 해당 MAPI 메시지를 오픈하여 새로운 Transport mail을 생성한 뒤에 그것을 Submission Q에 전달합니다.

ü 그리고 Store에게는 “내가 할일은 다 했어” 라고 보냅니다. 그러면 Store는 비로소 메시지를 Draft또는 outbox 에서 메시지를 Sent item으로 보냅니다.

    그러면 Mail submission에 있어서 발생할 수 있는 에러 유형은 다음과 같습니다.

1. Configuration Problems.

주로 mail submission 서비스가 사용할 허브 서버가 없는 경우에 해당합니다. Mail submission서비스는 Exchange Topology discovery API를 사용하여

Local server와 Hub서버를 같은 AD site내에서 찾는 데, 이것이 실패할 경우에 해당합니다.

보통 다음과 같은 에러를 보여 줍니다.

<stringvalue>There is no available Hub Transport server in the local site.</stringvalue>

<eventmessageid>1008</eventmessageid>

2. RPC Communication Problems.

HUB서버가 AD site내에서 정상적으로 존재할 때, Mail submission 서비스는 라운드 로빈 방식으로 Hub 서버를 선택하게 됩니다. 만약

Hub 서버가 RPC Call 을 못 받을 경우, Unavailable 상태로 marking되며, 5분 후에 다시 시도합니다.

(좀 더 자세히 부연하면, HandleEvent가 어떤 이유에서건, 해당 이벤트를 처리 못하면, TransientEternalRetryException을 Raise하며,

AI는 나중에 해당 이벤트를 다시 Retry해야 함을 인식합니다.)

가능성 있는 장애 상황으로는 다음과 같은 경우가 있습니다.

Ø Hub 서버에서 Transport Service가 running 안 할 때.

Ø 네트웍 문제 : Mailbox 서버가 HUB서버 ping이 안 되는 상황.

Ø HUB서버가 big pressure를 받고 있을 때이며 더 이상 새로운 메일을 받아 들일 수 없는 상태.

Ø 보안이슈로 Transport 가 메시지를 Reject할 때

Ø 기타 RPC runtime error.

   

위와 같은 이유로 HUB contact에 실패했을 때, PickNextBridgeHead()를 통해서 다음 Available 한 Hub서버를 찾게 됩니다.

    Mail Submission 서비스는 Retry중인 HUB서버에 대한 성능 카운터를 가지고 있습니다. 만약 모든 HUB서버가 Retry상태이면, 다음과 같은 로그를

    남기게 됩니다.

  <stringvalue>There is no active Hub Transport server in the local site.</stringvalue>

  <eventmessageid>1009</eventmessageid>

   우리 소스에 언급된 BridgeHeadPicker에 대해 설명입니다. 위에서 언급 한 라운드 로빈 방식으로 HUB 서버 리스트를 keeping한다는 내용입니다.

 /// <summary>

    /// BridgeheadPicker stores the list of bridgehead servers and state

    /// to return bridgehead server in round-robin way.

    ///

    /// This class needs to be thread-safe because multiple threads can call methods

    /// on the same object.

    ///

    /// The number of BridgeheadServer in the list never changes after intialization.

    /// But the status of each server can be changed between active and nonactive.

    /// In addition, the index of next bridgehead server to return also changes.

    ///

    /// This class implements Singleton pattern. When we need to update configuration,

    /// we can simple update the static Singleton instance.

internal class BridgeheadPicker

    {

        /// <summary>

        /// Refresh interval in minutes for configuration data

        /// </summary>

        private const int RefreshInterval = 10;

        /// <summary>

        /// Refresh interval in minutes to retry when a refresh fails because the AD is unavailable

        /// </summary>

        private const int ADRefreshInterval = 1;

 

written by jungseo