메시지 큐 문제가 발생하고 솔루션 ActiveMQ를 던져

약 1. 심각한 토론 : 서비스가 중단.

그것은 저장 메커니즘의 ActiveMQ에서였다. 정상적인 상황 하에서, 비 영구적 인 메시지를 메모리에 영구 메시지는 최대 축적 구성 <systemUsage> 노드 구성 파일을 제한하는 파일에 저장된다. 그러나, 비 지속성 메시지가 어느 정도 축적, 메모리는 시간, ActiveMQ를 메모리를 확보하기 위해 임시 파일에 기록됩니다 비 지속성 메시지의 메모리에있을 것 다했다. 파일에 저장되지만 다시 시작 파일에서 복구 후와 메시지 사이의 차이가 지속, 지속적인 메시지입니다 있지만, 비 영구적 임시 파일을 직접 삭제됩니다.

파일에 도달 할 것을 그래서 만약 최대 한계 증가 구성 시간이 발생합니다? 나는 다음과 같은 실험을했다 :

2G 지속적인 파일 제한 주위를 설정, 지속성 메시지의 대량 생산 파일은 생산을 차단하는 최대 한도,이 시간에 도달 할 때까지,하지만 소비자들은 파일을 삭제하고 공간을 확보, 제대로 연결 및 메시지를 사용, 그래서 메시지의 일부 소비 할 수있다 또한 생산자 그러나이 메시지를 보낼 계속 서비스가 자동으로 정상으로 돌아갑니다.

임시 2G 파일 제한 주변에 질량의 비 지속성 메시지의 생산은 생산을 차단 최대 한계에 도달 할 때, 소비자가 제대로 연결 될 수 있습니다 임시 파일을 작성하지만, 메시지, 또는 기타 느린 소비자 지출, 소비자를 소비 할 수 갑자기 중단했다. 전체 시스템을 연결할 수 있지만 서비스를 제공 할 수없는, 그렇게 끊었된다.

구체적인 이유를 알 수없는이 솔루션 : 그것을 사용해야하는, 큰 임시 파일을 전송하기 위해 가능한 한 제한됩니다, 비 지속성 메시지를 사용하지 않도록하십시오.

2. 손실 메시지.

java.net.SocketException의 시작부터이 비정상적으로 자바. 간단하게 연결을 닫기를 호출 한 후 보낸 사람이 네트워크 데이터의 무리를 보낼 때 그것이 넣어합니다. 당신이 방법은 여전히 ​​캐시에서 읽어 호출하면이 데이터는받는 사람의 캐시에 전송, 수신자는 다른면이 연결을 종료에도 불구하고, 데이터를 읽을 수 있습니다. 예외가 발생되도록 접속이 폐쇄 된 이후 수신 시도가이 시간에 데이터를 전송할 때,이 잘 이해된다. RECV 실패 오류 :하지만 SocketException이 발생하는 경우, 버퍼 영역의 데이터가이 시간에, 따로 설정 한 것을 참고 다시받는 사람 캐시에서 데이터를 읽을 수있는 읽기 메소드를 호출, 그것은 소프트웨어가 중단 연결을 발생보고합니다.

그에 의해 캡처는 ActiveMQ를 하트 비트 패킷을 보내드립니다 매 10 초마다, 서버는 클라이언트가 죽지 않은 죽음에 결정된다, 클라이언트에 하트 비트 패킷을 전송하는 것입니다. 첫 번째 기사를 위에 읽는다면, 당신은 어느 정도 비 지속성 메시지의 축적이 파일에 기록 될 것을 알고, 모든 작업을 차단합니다 20 ~ 30 초 동안 지속되며, 증가 된 메모리 쓰기 과정 증가한다. 클라이언트가 자신의 메시지 호출의 Connection.close ()를 완료하면, 서버는 15 초 이상 직접 답변 가까운 소켓 레이어 닫기 TCP 연결 호출하지 않은 경우, 연결을 닫 답을 찾을 것입니다. 이 때 클라이언트에서 보낸 메시지는 실제로 여전히 서버의 캐시에서 처리되기를 기다리고 있지만 서버 하트 비트 패킷 이후, 비정상적인 java.net.SocketException가 이어지는 옆으로 데이터 캐시 세트, 메시지는 손실 처리하지 않았다.

해결 방법 : 사용 지속성 메시지, 또는 비 지속성 메시지는 시간에 축적하거나, 트랜잭션을 시작 트랜잭션을 시작하지 않는, 커밋 () 메서드는 가까운 메시지를 야기 연결이 손실되지 않습니다, 반환에 서버 대기 할 책임이 있습니다.

매우 느리게 3. 지속성 메시지.

기본적으로 비 지속성 메시지는 비동기 전송, 지속성 메시지는 빠른 메시지를 참을 보내, 조금 느린 하드 드라이브가 발생, 동 기적으로 전송됩니다. 그러나 열린 트랜잭션의 경우, 메시지는 효율 크기 개선이 개 주문 될 것입니다, 비동기 전송됩니다. 지속성 메시지를 보낼 때, 활성화 트랜잭션 모드로해야합니다. 거래도 성능이 영향을주지 않기 때문에, 비 지속성 메시지를 열 것을 권장 보냈되는 사실에.

 

메시지 (4)는 불균일하게 소비.

때때로 어떤 메시지를 전송 한 후, 개방이 개 소비자는 메시지를 처리합니다. 당신은 소비자 핸들 모든 메시지 소비자가 메시지를 수신하지 않는 하나를 발견 할 것이다. 그 이유는 ActiveMQ를 프리 페치 메커니즘입니다. 소비자가 메시지를 하나 얻을 수에 의해 하나가 아닌 일회성 인수의 숫자를 얻기 위해 갈 때, 기본값은 1000입니다. 이 전 인수 소식은 없습니다 소비하기 전에, 관리 콘솔은 여전히 ​​이러한 메시지를 볼 수 있습니다 확인하지만, 다른 소비자들에게 이러한 메시지의 상태가 "비 소비는 할당 된"고려되어야한다이 시간을 재 할당하지 메시지가 최종적으로 소비하는 경우, 그것은 소비자가 붕괴하는 경우,이 메시지는 새로운 고객에 재 할당되며, 서버 측에서 삭제됩니다. 그러나 소비자는 붕괴되지, 확인을 소비하지, 이러한 메시지는 거짓말을하지 않습니다 것을 소비자 완충 지대가 처리 할 수 ​​않는 경우. 대개의 경우, 이러한 메시지의 소비는 매우 많은 시간이 소요, 당신은 다루는 10 소비를 개설, 9 패자 종료뿐만 아니라, 그 하나의 기계 Hangchihangchi 프로세스를 발견했다.

죽은 편지 큐.

당신이 프로세스가 실패에 메시지를 게시 할 경우, 서버가 삭제되지 않습니다 또한 폐쇄 AUTO_ACKNOWLEDGE을 할 수있는 다른 소비자 또는 재 시도에 의해 처리 될 수 있으며, ACK는 자신과 함께 프로그램에 언급했다. 당신이 AUTO_ACKNOWLEDGE를 사용하는 경우, 메시지가 확인 될 경우,하지 않았다 정지 뉴스를 확인하는 방법은 무엇입니까? 거기!

소비자 뉴스 하나가 될 때까지 반환 메시지를 차단합니다 consumer.receive () 메소드를 호출하는 두 가지 방법이 있습니다. 메시지는 호출자에게 반환 한 후,이 경우, 자동 방법은 확인 된 것이다. 또 다른 방법은 메시지의의 onMessage 방법은 청취자 인터페이스 호출됩니다 도착했을 때, 콜백 함수 리스너를 사용하는 것입니다. 이 경우의 onMessage 방법 완료된 후, 메시지가 한 메소드가 예외를 발생으로 메시지가 확인되지이 경우 확인된다. 질문은 그래서 메시지가 처리 할 수없는 서버가 재 할당에 단 하나의 소비자가있는 경우, 반환 될 경우, 메시지가 다시 획득하고 예외를 다시 던질 될 것입니다. 처리 할 수있는 뉴스 서버에 종종 다수의 소비자가있다하더라도, 또 다른 서버에서 처리 할 수 ​​없습니다. 그러한 복귀가 - 수 - 아직 죽음의주기 주어진?

재시도 여섯 번 후, ActiveMQ는이 메시지 죽은 문자 메시지 큐에 던져 질 것 "독성"믿습니다. 귀하의 메시지가 사라 졌는지, ActiveMQ.DLQ에 보이는 내부는, 어쩌면 그냥 거짓말.
----------------
면책 조항 :이 문서는 CSDN 블로거 '밝은 _'원래 기사는 CC 4.0-SA 저작권 계약, 복제, 원본이 링크를 첨부하시기 바랍니다에 따라입니다 문.
원본 링크 : HTTPS : //blog.csdn.net/soulmate_p/article/details/81380937

추천

출처www.cnblogs.com/panchangde/p/11866056.html