메시지 질환이 발생하는 원인
메시지 큐는 메시지 큐가 큐를 입력 큐 질서 메시지를 확인하는 것을 보장 할 수 있기 때문에, 그것은 메시지 (프로듀서)의 생산 결국 명확하지만, 종종 생산 환경 지출에 여러 메시지가있다 단부 (소비자) 메시지의 끝을 당겨 소비자가 각각의 처리 순서의 소비자 측을 보장 할 수 있지만, 메시지 때문에 네트워크의 다양한 측면 정렬 않는다.
장면 분석
회 변성 제품 정보, 메시지 A 및 B는 동기 한 기입 메시지 MySQL이 다음 메시지 큐 비동기 쓰기 메시지를 송신하고 메시지 큐 제작 측 (생산자)는 시간적으로 연속하여 두 메시지 A 및 B를 (전송 제 1 메시지)는, 전송 된 메시지 B를 송신한다. 비즈니스 논리를 통해 제품 정보의 최종 상태 메시지 A를 통합 할 필요가 있고 B는 메시지를 우선.
데이터베이스, 비동기 장면에 대한 겉보기보다 일반적인 동기 쓰기는 메시지를 보낼 수 있지만, 사실 필요가 질서 소비 메시지를 확인 할 수 있습니다.
- 가설 1 :에만 수정이 포함 된 메시지 무역 이름 , 메시지 B 만 수정이 포함되어 제품의 무게를 실제로 메시지 큐의 소비자 끝이이 시간에 메시지 시퀀스 우려 할 필요는 없다 , 단지 소비 메시지 큐 소비자 측 (소비자).
- 가정 2 : 개질 포함하는 메시지 상품명, 중량 , 개질 함유 메시지 B 상품명 소비자가 메시지 B의 일단을 수신하면, 메시지 (A)는 그 변경 메시지를 B 덮어되며 수신된다. 이 때 소비자 메시지 큐의 끝 실제로는 메시지 타이밍에 초점을 맞출 필요가있다 .
눈에 보이는, 이제 질서 소비 메시지를 확인해야합니다, 메시지 정보가 포함 된 내용을 보장 할 수 없습니다.
보기의 비즈니스 포인트는 질서 뉴스 소비를 확인하는 방법
- 생산 종료 메시지를 보낼 때, 메시지가 확인하기 위해 항상 정보의 전액이.
- 소비자 단말 캐시 타임 스탬프에 의해 메시지들을 수신, 결정된 메시지 생성 소비 메시지는 그렇지 않은 경우 폐기하고, 만일 그렇다면 다음 단계는 최신 시간 여부.
다음 의사 코드에 의해 설명되어 있습니다 :
생산 최종 의사
insertWare (도자기) 데이터베이스에 # 삽입 데이터는 일반적으로 삽입 전액을 우리는 수정 된 필드를 업데이트 할 데이터베이스에 삽입하지만,하지 않을 때
도자기 = selectWareById (ware.getId) # 제품 정보의 총량을 가져 오기 (이 시간에 최신), 메시지 큐에 넣어
# 비동기 전송 메시지가 MQ; syncMq (도자기)
소비자 최종 의사 코드
도자기 = fetchWare (); # 받기 메시지
경우 (isLasted (도자기))의 최신 변경 여부를 결정하기 위해 타임 스탬프를 수정하여 # 상품
다음 단계로 TODO # 비즈니스 로직
그밖에
메시지 반환 번호를 삭제
소비자 측이 메시지가 최신 변경이 있는지 여부를 확인하는 방법에 초점 isLasted
방법.
isLasted 방법
롱 = getCacheById (ware.getId) 수정 # 문서 상품 캐시의 최신 수정 시간을 가져옵니다
만약 (수정 ware.getModified>) 메시지가 최신 동작을 나타내는 긴 시간 레지스터보다 긴 경우 {# 제품 검토
setCacheById (도자기), 캐시에 기록 된 상품 수정 시간 소인 메시지 # 조각
true가 돌려로,
제품 수정 메시지 인 경우} # (가) 다른 댄 적은 캐시 시간, 기사는 메시지가 "작업 이력"에 속하는 설명을 업데이트하지 않습니다false를 반환;
위의 사업을 통해에 중점을두고, 질서 뉴스 소비를 보장하는 것을 의미한다 방법을 설명합니다 의사 코드의 방법입니다 캐시의 총량 및 메시지 타임 스탬프를 보냅니다 . 어디 기술적 구현 세부 사항이있다.
예를 들어, 소비자 측 소비 메시지 B 수행하는 타임 스탬프 버퍼를 획득 한 후, 새로운 캐시 전에 다시 설정 , 타단 소비자 소비도 B로 수행되는 단지 때 타임 스탬프 버퍼 취득 이 메시지는 발생하기 때문에, 캐시를 업데이트하지 않을 경우, 캐시가 여전히 캐시가 오래된 메시지를 얻을, 당신은이 소비자 끝이 있다는 것을 동의 할 때 자신의 소비 최신 뉴스, 삭제 된 메시지 Modiu의 원인.
물론,이는 분산 된 스레드 안전 분산 문제는, 일반적으로 잠금 아래와 같이 레디 스 또는 사육사, 잠금의 실행 타이밍을 사용합니다.
이는 소비자 끝에 질서 소비를 보장하기 위해 비즈니스 관점에서 메시지입니다. 소비자 측 캐싱 질서 소모 메시지를 확인 할 수있는 메시지의 전체 금액과 타임 스탬프의 메시지에 전송 된 메시지를 보냅니다.
상기 시나리오에서 비동기 메시지를 전송 한 다음 생성물을 획득 한 후 데이터의 총량 동기 MySQL이 작성한다. 이러한 일련의 단계는 MySQL의 바이너리 로그를 접합함으로써 달성 할 수 있고, 동시 기록의 MySQL 후, MySQL이 수신 된 변경의 MySQL 바이너리 로그 전송은 채널 알리바바 미들웨어 다음 메시지 대기열로 메시지를 전송 변경 바이너리 로그.
![](https://img2018.cnblogs.com/blog/630246/201907/630246-20190717223740465-1981496921.png)