SSM 기반 관리 시스템 설계 및보고

소개 : IM 메시지가 직면해야하는 또 다른 문제 : 수신 된 메시지의 순서가 잘못되지 않았는지 확인하는 방법입니다. 이 기사에서는 먼저 장애의 원인을 자세히 분석하고 각 원인에 대한 해결책을 제공합니다. 그리고 기사의 끝에는 단 한번의 디자인 계획이 제공됩니다.

IM 메시지가 직면해야하는 또 다른 문제 : 수신 된 메시지의 순서가 잘못되지 않았는지 확인하는 방법입니다. 이 문제를 해결하는 데 장애가되는 부분부터 살펴 보겠습니다.

메시지가 잘못된 이유는
보장하기 어렵습니다.

"시퀀스"에 관해서는 측정 표준이 있어야하지만 클라이언트 시간이나 서버 시간은 메시지 순서를 측정하는이 표준으로 사용되지 않습니다.
IM 서버 설계-메시지 장애를 해결하는 방법

위의 그림에서 볼 수 있듯이 IM 시스템은 서로 다른 액세스 게이트웨이의 여러 클라이언트에 연결되어 클라이언트 자체이든 서버 (네트워크, 논리적 서버)이든 다른 논리적 처리 서버에서 처리됩니다. 기계마다 시간이 다르기 때문에 기계의 현지 시간은 메시지 순서를 측정하는 표준으로 사용할 수 없습니다.

네트워크 주문을 보장 할 수 없습니다.

하나의 게이트웨이에 하나의 클라이언트 만 연결되는 시나리오를 고려하면 이러한 시나리오에서도 네트워크 요인으로 인해 메시지 순서를 보장하기가 어렵습니다.
IM 서버 설계-메시지 장애를 해결하는 방법

위의 그림과 같이 게이트웨이는 두 개의 메시지 메시지 1과 2를 차례로 클라이언트에 보내려고하면 다음과 같은 문제가 발생할 수 있습니다.

게이트웨이는 클라이언트에게 메시지 1을 전송하는데 이때 클라이언트의 네트워크 상태가 좋지 않아 메시지가 손실되거나 재전송 될 수 있습니다.
게이트웨이는 메시지 1의 전송 결과를 기다리지 않고 메시지 2를 계속 전송했습니다. 이때 클라이언트의 네트워크 상태가 좋아졌고이 메시지는 메시지 1보다 빠르게 클라이언트에 수신되었습니다.
위의 시나리오에서 일부 사람들은 처리 모드를 생각할 수 있습니다. 게이트웨이는 클라이언트가 메시지 1 수신에 응답 한 후에 만 ​​메시지 2를 계속 보내므로 네트워크 이유로 인한 메시지 장애가 없습니다. 그러나이 경우 메시지는 직렬 전송에 해당하고 효율성이 높지 않습니다.

멀티 스레딩 요인으로 인한 고장

클라이언트와 서버 모두 다중 송신 및 수신 스레드를 가질 수 있으며, 이는 메시지 장애의 원인 중 하나이기도합니다.

해결 전략

메시지 장애의 여러 원인에 대한 이전 분석은 다음 분석을 하나씩 수행해야합니다.

메시지 순서 번호

앞서 언급 한 첫 번째 문제점은 클라이언트 나 서버의 현지 시간으로 메시지의 타이밍 기준을 측정 할 수 없다는 점이다. 이때 증분 ID를 생성하는 구성 요소를 도입 할 수 있으며이 구성 요소는 균일하게 증분을 생성 할 수 있고, 반환되지 않은 메시지의 시퀀스 번호는 메시지 시퀀스를 측정하는 데 사용됩니다.

그러나 자세히 논의 할 수있는 또 다른 부분이 있습니다.이 구성 요소에서 생성 된 ID는 전역 적으로 고유해야합니까? 즉, 단일 채팅과 그룹 채팅 모두 생성 된 일련 번호가 고유한지 확인해야합니다.

서로 다른 채팅을 통해 메시지가 고유하고 자체 채널에서 증가하도록 보장 할 수 있기 때문에 이러한 글로벌 고유성은 필요하지 않습니다. 이를 전제로이 구성 요소에 대한 ID를 생성하는 프로세스는 대략 다음과 같습니다.

채팅을 처리 한 논리 서버 ID입니다.
각 채팅 채널 (단일 채팅, 그룹 채팅)에는 고유 한 독립 채널 ID가 있습니다.
각 채널 내에서 증분 및 되 감지 않는 일련 번호를 생성 할 수 있습니다.
이러한 방식으로 메시지 시퀀스 번호는 실제로 채널의 논리 서버 ID- 채널 ID- 메시지 시퀀스 번호의 세 부분으로 구성됩니다.

그룹 채팅 메시지 처리

이전 메시지 시퀀스 번호로 첫 번째 문제인 메시지 타이밍 표준 문제가 해결되었습니다. 그러나 이것은 아래 그림의 그룹 채팅 시나리오를 고려하면 충분하지 않습니다.
IM 서버 설계-메시지 장애를 해결하는 방법

위 그림에서 :

두 클라이언트는 메시지 A와 메시지 B를 순서대로 보냅니다.
위와 같이 그룹 채팅 메시지의 장애의 원인은 동일한 그룹 채팅의 메시지가 최종적으로 처리를 위해 두 개의 서로 다른 논리 서버로 발송되기 때문임을 알 수 있습니다.
위의 메시지 일련 번호 생성 아이디어를 계속 사용하십시오. 동일한 채팅 채널이면 함께 처리됩니다. 따라서 다음 그림에서 처리 방법으로 변경할 수 있습니다.
IM 서버 설계-메시지의 장애를 해결하는 방법

위 그림에서 그룹 채팅 메시지의 그룹 ID에 따라 논리 서버를 선택하여 같은 그룹의 메시지를 같은 서버에서 처리 할 수 ​​있습니다.

ID를 생성하기 위해 "분산 고유 증분 ID"와 같은 구성 요소를 사용할 필요가 없음을 알 수 있습니다. 여기의 문제는 다음과 같이 단순화 되었기 때문입니다. 논리 서버에서 처리하는 채팅 채널에서 메시지 시퀀스 번호 만 고유하고 고유해야합니다. 증분이면 충분합니다. 문제의 재분석과 정의는이 과정을 훨씬 쉽게 만들어주었습니다.

네트워크 장애 처리

그런 다음 네트워크로 인한 장애를 처리합니다. TCP 프로토콜에서 네트워크 장애를 처리하는 유사한 방법이 있습니다.

TCP 프로토콜 스택에는 수신 된 데이터를 버퍼링하는 버퍼가 있습니다.
발신자는 일련 번호 ACK를 사용하여 일련 번호가 1, 2, 3 인 데이터와 같이 수신자가 수신 한 데이터를 확인합니다. 먼저 1 개를 수신하면 발신자는 ACK 1 메시지를 수신합니다. 수신자가 메시지 2보다 먼저 메시지 3을 수신 한 경우, 발신자는 여전히 메시지 1을 ACK하여 메시지 3이 고장 났음을 나타냅니다.
버퍼 및 확인 시퀀스 번호를 통해 프로토콜 스택이 애플리케이션 계층에 제공 할 수있는 데이터를 알 수 있습니다.
IM 서버 설계-메시지 장애를 해결하는 방법

위의 그림과 같이 :

메시지 1과 3은 수신자의 TCP 프로토콜 스택에 차례로 저장되고 메시지 2는 아직 수신되지 않았습니다.
메시지 1은 발신자에 의해 확인되며, 이때 메시지 1은 애플리케이션 계층에 제공 될 수 있습니다.
메시지 2가 수신되지 않았으므로 메시지 3은 순서가 다르며 응용 프로그램 계층에 제공 할 수 없습니다.
발신자가 송수신 큐를 제어 할 수 있고 발신자가 메시지의 순서를 알고 있다는 점에서 영감을 얻었습니다. 메시지를 보내고받는 순서는 보장 할 수 없지만 버퍼가 도입되어 확인 된 메시지 만 사용할 수 있습니다. 이러한 방식으로 발신자의 ACK 확인을 사용하여 메시지의 순차적 소비를 보장 할 수 있습니다.

위의 아이디어는 네트워크 비 순차적 메시지 처리에 적용될 수 있습니다.

최종 계획

위의 분석을 바탕으로 메시지 장애 문제는 다음과 같은 방법으로 해결 될 수 있습니다.

클라이언트 메시지 캐시 큐

클라이언트 내부에서는 캐시 된 메시지의 큐를 유지하며 각 메시지에는 해당 메시지 시퀀스 번호가 있습니다. 메시지를 수신 한 후 게이트웨이에 확인하여 메시지가 순서대로 수신되었는지 확인해야합니다. 이러한 메시지 만 있습니다. 애플리케이션 계층 소비에 제공 할 수 있습니다.
IM 서버 설계-메시지 장애를 해결하는 방법

위 그림에서 :

메시지 일련 번호의 형식은 다음과 같습니다. 논리 서버 ID- 채널 ID- 채널의 고유 한 증분 ID이므로 위 그림의 메시지는 논리 서버 ID 1과 채널 ID 2에 해당합니다. 다음 설명에서는 편의를 위해 채널의 ID 만 사용합니다.
클라이언트는 메시지 시퀀스 번호가 101 인 메시지를 수신합니다. 이때 클라이언트는 ACK를 수행하고 게이트웨이는 메시지를 확인합니다. 101 이전의 메시지가 확인되었으므로 게이트웨이는 ACK 101로 응답합니다. 즉, 시퀀스 번호가 메시지에 대한 응용 프로그램 계층에 직접 제공 될 수 있음을 의미합니다.
클라이언트는 메시지 시퀀스 번호가 103 인 메시지를 수신하고 클라이언트는 메시지를 확인하기 위해 ACK 및 게이트웨이를 수행합니다. 이 메시지 이전의 102 메시지는 ACK를 수신하지 않았으므로 게이트웨이는 ACK 101로 응답합니다. 이는 클라이언트에게 현재 애플리케이션 계층 메시지에 제출할 수 있음을 알리는 메시지가 여전히 101임을 의미합니다.
메시지 일련 번호 및 논리 서버 전환

메시지 시퀀스 번호는 논리 서버 ID, 채널 ID 및 채널의 고유 및 증분 ID로 구성됩니다.

논리 서버 ID : 서비스의 호스트 이름, 프로세스 번호 및 수신 포트 번호를 결합하여 논리 서버 ID를 생성 할 수 있습니다.
채널 ID : 채팅 채널은 채팅 참가자와 만 관련이 있기 때문에 단일 채팅 채널은 채팅에 참여하는 양 끝의 클라이언트 ID를 결합하여 채널 ID를 생성 할 수 있으며 그룹 채팅 ID는 그룹 ID를 사용하여 채널 ID를 생성 할 수 있습니다.
채널의 고유 및 증분 ID :이 값은 디스크를 배치하지 않고도 저장할 수 있으며 매번 채팅 로직 서버에서 채널 ID에 해당하는 증분 ID에 해당하면됩니다.
메시지를 처리하는 논리 서버가 변경되면 논리 서버 ID도 변경됩니다. 이때 게이트웨이 든 클라이언트 든 특정 클라이언트와 통신을 구축하여 유지하는 메시지 캐시 큐의 논리 서버 ID가 변경된 것을 발견하면 이전에 캐시 된 메시지를 폐기하고 통신을 재개합니다.
우리는 전문 생산 팀과 엄격한 기밀 유지 시스템이 있습니다. 우리 엔지니어들은 서비스 수준을 보장하기 위해 소프트웨어 엔지니어링 개발 및 설계의 모든 영역에서 풍부한 경험을 축적했습니다. 그들에게 졸업 디자인을 제공하고 각 학생에게 의무를 부여하십시오.

이 글에서는 컴퓨터 관련 전공이 어떻게 졸업 디자인을 완성하는지 소개하고자합니다. 저는 오랫동안 컴퓨터 관련 전공 제작에 참여해 왔기 때문에 풍부한 업무 경험을 가지고 있으며 곧 졸업하고 싶습니다. 급우들이 공유합니다.

연락 · 관계 · 우리 :. 버클. 버클. 번호 (하나 제로 셋 둘 셋 칠일 초 하나)

당사에 연락하여 귀하의 작성 요건을 당사에 제출하면 당사의 컨설턴트가 귀하의 서비스 요구에 따라 "서비스 내용, 서비스 요건, 서비스 시간, 기타 요건"및 기타 측면에 대해 귀하와 소통 할 것입니다. 완제품 디자인은 독창성에 전적으로 기반을두고 있으며, 시장에 나와있는 다른 세대에 의해 수정 된 열등한 제품이 결코 아닙니다.

위의 그림에서와 같이 시리얼 넘버 1-2-103의 메시지를 수신 한 후 논리 서버는 다운되고, 이때 클라이언트의 채팅 서비스는 다른 서버에서 처리되고 논리 서버 ID는 2, 채널이됩니다. ID는 3이됩니다. 이때 게이트웨이는주고받은 메시지에서 논리적 서버 ID와 채널 ID가 변경되었음을 감지하여 이전 메시지 캐시를 지우고 클라이언트에게 메시지 캐시를 지우고 논리적 서버 ID 및 채널 ID 메시지로 다시 통신하도록 알립니다. 이는 101 이후의 메시지가 메시지를 위해 클라이언트 애플리케이션 계층에 제공되기 전에 다시 전송 및 수신되어야 함을 의미합니다.

추천

출처blog.51cto.com/14992191/2547378