시나리오 : 우리는 지리적으로 분산되어 있으며 그 위치에 대한 메시지를 수집하는 대기열이 있어야합니다. 그런 다음 모든 노드의 모든 대기열에서 수집 된 데이터를 중앙 위치의 해당 대기열로 보내려고합니다. 중앙 노드에서는 대기열에서 수집 된 데이터를 다른 노드에서 가져 와서 처리하고 영구 저장합니다.하나의 대기열 인스턴스를 여러 개의 Redis 인스턴스와 동기화하십시오.
제약 :
- 데이터는 우리에게 매우 중요합니다. 따라서 어떤 경우에도 데이터를 잃어 버리지 않도록해야합니다.
- 따라서 모든 노드에 영구 대기열이 필요하므로 임의의 이유로 인해 노드가 다운 되더라도 우리가 가져올 때 수집 된 데이터를 안전하게 유지할 수 있고 가능한 한 중앙 노드로 보낼 수 있습니다. 처리되어야한다.
- 마찬가지로 중앙 노드가 다운되면 데이터가 다른 모든 노드에 남아 있어야 중앙 노드가 나타나면 모든 데이터를 중앙 노드로 보내 처리 할 수 있습니다.
- 또한 중앙 노드의 데이터가 중복되거나 다시 저장되어서는 안됩니다. 즉, 노드 중 하나에서 수집 된 데이터는 중앙 노드에 한 번만 저장되어야합니다.
- 우리가 수집하는 데이터는 우리에게 매우 중요하며 중앙 노드에 데이터를 전달하는 순서는 문제가되지 않습니다.
우리의 솔루션 는 우리는 우리가 가장 좋은 것이라고 생각 하나를 다운 목록하기 위하여려고하고있는 밖으로 솔루션의 몇 가지 고려했다. 가능한 솔루션 (우리의 의견)은 Redis가 영구 저장소를 제공하기 때문에 Redis를 사용하여 모든 곳에서 큐를 유지 관리하는 것입니다. 그런 다음 지리적으로 분리 된 모든 노드에서 데몬을 실행하여 대기열에서 데이터를 읽고이를 중앙 노드에 보냅니다. 데이터 수신시 중앙 노드는 (데이터가 매우 중요하기 때문에) 데이터를 수신 한 노드에 ACK를 보낸 다음 ACK를 수신하면 노드는 큐에서 데이터를 삭제합니다. 물론, ACK가 수신되어야하는 타임 아웃 기간이있을 것이다.
문제 (우리)에 따라 위의 언급 한 솔루션은 잘 작동하지만, 문제는 우리가 우리가 여기 잘못 될 수있는 간단한 이유로 자신에 의해 전체 동기화 프로토콜을 구현하지 않을 것입니다. Redis에서 이러한 특정 동기화 방법을 찾을 수 없었습니다. 따라서 우리는 RabbitMQ, ZeroMQ 등과 같은 다른 AMQP 기반 대기열에 대해서도 개방되어 있습니다. 다시 이러한 솔루션으로이 작업을 수행 할 수 있는지는 알 수 없었습니다.
- 이러한 메시지 큐 또는 다른 데이터 저장소는 우리의 문제를 해결할 수있는 기능을 제공합니까? 그렇다면 어떻게?
- 그렇지 않다면 우리의 솔루션은 충분합니까?
- 누구나 더 나은 해결책을 제안 할 수 있습니까?
- 더 좋은 방법이있을 수 있습니까?
- 안전하지 못하게하는 가장 좋은 방법은 무엇입니까?
- 우리가 수집하는 데이터는 우리에게 매우 중요하며 중앙 노드에 데이터를 전달하는 순서는 문제가되지 않습니다.
올바른 작업에 적합한 도구 사용 : 승인, 지속성 및 (고급) 메시지 라우팅이 필요할 때 RabbitMQ는 확실히 올바른 도구입니다. – FGRibreau
"중앙 노드의 데이터가 중복되거나 다시 저장되어서는 안됩니다. 즉, 노드 중 하나에서 수집 된 데이터는 중앙 노드에 한 번만 저장되어야합니다." 이것을 어떻게 보장합니까? 네트워크 문제 (이 시나리오에서)로 인해 ACK가 전달되지 않는다고 생각하십시오. 이 경우 어떻게됩니까? 대기열은 여전히 작업 완료 상태를 인식하지 못합니다. 이 경우 메시지가 잠겨 있습니까? 아니면 다른 직원이 데리러합니까? 다른 작업자가 작업을 선택하면 동일한 데이터가 두 번 작동하게됩니다. 맞습니까? – vaidik