특정 소스와 관련된 이벤트를 처리하고 있습니다. 각 소스에는 해시로 사용할 수있는 키 또는 ID가 있습니다. 각 소스의 이벤트를 순서대로 처리해야하지만 수평 적 확장 성을 달성하려면 여러 소스의 이벤트를 병렬 처리 할 수 있습니다. 수백 개의 소스 키가있을 것입니다.일관된 해시 교환으로 바인드 된 만료 된 큐의 치명적인 문자 메시지
메시지를 RabbitMQ에 제출할 때 라우팅 키의 일부로 키를 설정 한 다음 consistent-hash-exchange
을 사용하여 동일한 출처의 이벤트가 동일한 큐로 라우팅되도록 할 계획입니다. 나는 TTL을 사용하여 소비자로부터 개인 큐를 동적으로 바인딩 할 생각을하고있었습니다 (소비자가 다운되면 정상적으로 제거되도록). 처음에는 이중화를 위해 2 ~ 3 명의 소비자를 보유하게 될 것이지만 증가 된 메시지 수로 인해 확장하려는 경우 다른 소비자를 시작할 수 있습니다.
소비자가 다운되어 대기열에 메시지가 있으면 어떻게됩니까? 이상적으로는 대기열의 메시지가 consistent-hash-exchange
(다른 대기열에 라우팅 됨) (원래 대기열이 더 이상 존재하지 않으므로)으로 다시 라우팅되도록해야합니다.
약 dead lettering에 대한 RabbitMQ 설명서는 소비자 대기열의 TTL 시나리오 또는 대기열 삭제시 발생하는 상황을 명시 적으로 언급하지 않습니다.
내 접근 방식이 맞습니까? 특정 라우팅 키로 주문을 유지하면서 찾고있는 소비자 내결함성을 어떻게 얻을 수 있습니까?
참고 : 죽은 문자 메시지를 교환기로 라우팅하는 과정에서 원래 다른 대기열로 라우팅되는 만료 된 대기열로 라우팅 된 새 메시지가 나오면 더욱 경미한 경쟁 조건이 있다는 것을 알고 있습니다. 따라서 특정 인스턴스에서 순서가 끊어집니다.
답장을 보내 주셔서 감사합니다. 주파수와 관련하여 피크 시간대에 상당히 많은 수의 메시지입니다. 나는 이것에 약간 과잉 엔지니어링일지도 모른다. 내가 찾는 것은 소비자가 사라지면 자동으로 메시지를 다시 라우팅하는 것입니다. 나는 메시지 TTL을 큐 TTL보다 짧게 할 수 있다고 생각한다. 그래서 소비자가 연결이 끊어지면 메시지는 우선 만료되고 삭제되는 큐 TTL보다 먼저 DLX된다. 예. DLXed 메시지와 동일한 소스 키의 새 메시지를 사용하여 경쟁 조건을 주문하는 문제는 여전히 있습니다. – jbx
당신은 오신 것을 환영합니다. 내가 말했듯이, 나는 소비자를위한 감시 장치로 이것을 "소비면에서"해결할 것이다. 당신은 순차적으로 프로세싱을 유지하기 위해 소비자를 원하고 싶지만 실행하고 싶습니다. – cantSleepNow
소비자를 돌리는 머신이 죽고 몇 분 이상을 복구해야한다면 어떻게 될까요? 공평하게 말하면 대기열의 TTL이 비교적 짧고 (예 : 30 초) 소비자가 다시 연결하지 않으면 잠재적으로 30 초 분량의 새 메시지가있게됩니다. 대기열 TTL이 만료되기 전에 메시지가 마지막 순간에 들어올 수 있기 때문에 DLXing에서 가지고있는 가설은 작동하지 않습니다. 또는 클라이언트 분리 직후에 큐를 삭제하여 몇 개의 메시지 만 손실 될 수 있습니다. 메시지를 잃는 것이 이상적이지는 않습니다. – jbx