2014-06-17 1 views
0

대기열에서 일부 작업을 수행하고 있다고 가정 해 봅시다. 일부 큐 항목을 실행할 때 몇 가지 예외가 발생하여이 항목을 대기열에 다시 추가하려고 시도하지만 QueueManager은 Redis와의 연결이 끊어 지거나 다른 문제로 인해 수행 할 수 없습니다.큐 관리자가 항목을 다시 추가 할 수없는 상황?

$Item = $QueueManager->getNext(); 
try { 
    $Item->runWorker(); 
} catch (\Exception $e) { 
    $Item->incrementRetries(); 
    $QueueManager->addItem($Item); //what to do if error occures here? 
} 

보시다시피, 우리는 아이템을 잃어 버리고 있습니다. 이 상황에서해야 할 일은 무엇입니까?

답변

1

연결이 손실되어 간헐적으로 문제가 발생하면 다시 연결하려고합니다. 그래도 여전히 실패하거나 중단이 발생하면 인프라에서 중복성을 구축하거나 코드에서 중복성을 처리하십시오.

대기열/데이터베이스의 가용성을 높일 수 있습니다. 로드 밸런서와 여러 노드 (독립 또는 복제 중 하나)를 설정합니다. 하나가 다운되면 작동하는 것으로 전환됩니다. 대기열에 사용하는 소프트웨어에 따라 모든 작업을 디스크에 유지할 수 있으므로 온라인 상태가되면 작업이 처리 될 수 있습니다. 최소한 하나 이상의 노드가 항상 실행되고 연결을 수락하는지 확인하면됩니다. 생각을 사용하고있는 대기열에 따라 이것이 가능할 수도 있고 그렇지 않을 수도 있습니다.

추가 하드웨어가 옵션이 아닌 경우 코드에서 처리해야합니다. 대체 대체물을 추가해야합니다. 대체 데이터베이스를 사용하여 거기에 데이터를 삽입하거나 플랫 파일에 대한 데이터를 쓸 수 있으며 나중에 연결이 복원되면 나중에 처리 할 수 ​​있습니다. 여러 서버를 사용하는 경우 데이터를 각 서버에 로컬로 저장하는 대체 방법은 문제가 될 수 있습니다.

대기열에 어떤 소프트웨어를 사용하고 있는지 잘 모르겠다. (내가 언급 했으니 Redis을 사용하고 있다고 가정한다.)하지만 말할 때까지 대기열에서 항목을 제거하지 않는 방법이 있는지 확인한다. . 그렇게하면 연결이 끊어지고 항목이 실패하면 대기열에 다시 추가 할 필요가 없습니다. 대기열에 계속 남아 있기 때문에 시간 초과를 설정하고 계속 이동해야합니다. 아이템은 라인의 어떤 지점에서 다시 시도됩니다. 항목이 처리되었지만 여전히 연결되어 있으면 큐에서 제거하고 계속 이동하십시오.

마지막으로 대기열에 사용중인 현재 소프트웨어가 올바른 선택인지 여부를 평가해야 할 수도 있습니다. 어쩌면 당신은 더 높은 신뢰성을 가진 하나를 찾아야 할 수도 있고 위에서 언급 한 것과 유사한 유스 케이스를 지원할 수도 있습니다.

도움이 되길 바랍니다.

+0

정말 감사드립니다. 고맙습니다. – Kirzilla

관련 문제