2017-05-11 7 views
0

pm2와 함께 클러스터 모드에서 실행되는 노드 응용 프로그램이 있습니다.Node.js는 클러스터/pm2와 db 경쟁 조건을 피합니다.

또한 특정 행이 db 테이블에 있는지 확인하는 기능이 있습니다. 행이 누락 된 경우 행을 작성하고 그렇지 않으면 값이 설정되고 저장됩니다.

userId와 groupId의 조합마다 하나의 행만 있으면됩니다.

function someFunction()={ 
    return Activation.findOne({ where: { userId: userId, groupId: groupId } }) 
    .then(activationObject => { 
     if (!activationObject) { 
      return Activation.create({ userId: userId, groupId: groupId, activationTime: sequelize.fn('NOW') }) 
     } else { 
      activationObject.activationTime = sequelize.fn('NOW'); 
      return activationObject.save() 
     } 
    })  
} 

클러스터 모드에서 노드를 실행할 때 어떻게 경쟁 조건을 피할 수 있습니까? 현재 첫 번째 작업자가 행을 사용할 수 있는지 확인하고 두 번째 검사가 동시에 결과를 얻지 못하고 결국에는 하나 대신 새로 만든 행이 두 개 있습니다.

나는 Sequelize가 findOrCreate() 방법을 제공한다는 것을 알고 있지만 쉽게 이해할 수있는 예제를 원했습니다.

답변

2

가장 쉬운 방법은 ON CONFLICT REPLACEuserIdgroupId의 조합에 대한 UNIQUE 제약 조건을 추가하고, 항상 업데이트 대신에 새로운 행을 작성하는 것입니다. 이렇게하면 새로 삽입 된 행에 새 activationTime이 삽입되어 이전 행을 대체하게됩니다.

삽입이 성공했는지 여부를 알기 위해 삽입 된 행 수를 추가로 확인할 수 있습니다.

예 : UNIQUE (userId, groupId) ON CONFLICT REPLACE

+0

이 문제에 대한 좋은 해결책입니다. 하지만 노드 js에 공유 뮤텍스 나 세마포어 같은 것이 없습니까? – Andybanandy

+0

https://www.npmjs.com/browse/keyword/mutex 및 https://www.npmjs.com/browse/keyword/semaphore에서 살펴보십시오. – Originato