나는 RabbitMQ 브로커를 가지고 있는데, Elasticsearch에서 문서로 끝나는 다른 메시지를 게시합니다. 브로커의 여러 소비자가 있습니다. 실제로는 amqp 인바운드 게이트웨이에 할당 된 작업 실행자에서 서로 다른 스레드입니다 (여기서는 스프링 통합과 amqp를 사용).큐 메커니즘 및 Elasticsearch 1.4.0
다음과 같은 시나리오를 생각해보십시오 : 나는 구조
{
"field1" : "value1",
"field2" : "value2"
}
와 ES의 문서를 만든 이후 나는이 명 업데이트 요청, 같은 필드를 업데이트를 모두 보내, 이제 field1
을 가정 해 봅시다. 이 메시지를 다른 하나 (생산의 일반적인 유스 케이스)로 바로 보내면 소비자 스레드가 올바른 순서로 메시지를 가져 오지만 (amqp는 허용 함) 처리가 잘못된 순서로 발생할 수 있으며 나중에 업데이트 된 값이 될 수 있습니다. 첫 번째 것에 의해 덮어 씌여진다. 나는 최종 데이터를 가지고 결국 것입니다.
데이터가 손상되지 않도록하려면 어떻게해야합니까? => 하나의 단일 소비자 스레드 만 있으면 충분하지 않습니다. 소비하는 응용 프로그램과 함께 더 많은 컴퓨터를 추가하여 확장하려는 경우에도 여전히 여러 소비자가있을 것이기 때문입니다. 메시지의 순서가 필요할 수도 있지만 여러 대의 컴퓨터가있을 경우 클러스터 인식 구성 요소를 만들어야 할 필요가있을 것입니다. SI를 사용하고 있기 때문에 제 생각에는 그렇게하기가 어렵습니다.
이전 1.2 버전의 ES에서는 타임 스탬프와 같은 외부 버전을 사용했는데 내 시나리오에는 VersionConflictException
이 던졌습니다. 첫 번째 업데이트에는 10000 버전이 있었을 것입니다. 먼저 처리되었으므로 ES는 기존 요청보다 낮은 버전 10000으로 요청을 거부합니다. 하지만 최신 버전에서 업데이트 작업을 수행하는 ES 팀 have removed this functionality.
spring-amqp와 함께이 해시 함수를 주입하려면 어떻게해야합니까? 간단한 예를 들어 주시겠습니까? –
문서의 해시를 어떻게 든 계산합니다 (예 : 'customerNumber % 3' (3 큐의 경우)를 사용하여'rabbitTemplate.send ... (...)'메소드에서'routingKey'를 빌드하십시오. –
내가 3 개의 다른 대기열에 게시하고 각각의 대기열에 대해 1 개의 소비자를 등록한다고 가정 해 봅시다. 내 앱을 배포하는 3 대의 컴퓨터가있는 경우 어떻게 하나의 스레드 만 대기열에서 메시지를 가져올 수 있습니까? –