2014-06-09 3 views
1

노드 및 비동기 프로그래밍 개념의 비동기 성질을 이해하며 오랫동안 해왔습니다. 그러나 나는 당신이 원한다면 "동기화되어"무언가를 체크하는 동시 요청이 필요한 상황에 처해있다. 설명해 드리겠습니다 :요청 사이의 노드 j 동시성

  • UserA는 존재하지 않는 리소스를 요청합니다.
  • "isProcessing"에 대한 플래그를 설정하여 다른 사용자가 자원을 작성 중임을 알립니다.
  • 사용자 B는 동일한 자원을 요청은 준비하는 것이 처리, 그리고 대기 본다 - 무거운 비동기의
  • [무리 (폴링을 사용하여이 부분이 우리가 원하는 방식으로 작동하기 때문에,이에 초점을하지 않습니다) 물건 리소스를 생성하는 일]
  • 자원, 어디

피클 날이 부분은 "2 단계"이다 (내가 말했듯이,이 부분은 작동) 그것에 대한 사람의 폴링 알림을 받게됩니다 준비 우리는 "isProcessing"플래그를 설정했다. 이것은 비동기 데이터베이스 작업 (mongo)입니다.이 작업은 2 회 이상의 요청이 동시에 인 경우 일 때 아직 완료되지 않았습니다. 따라서 여러 요청이 동일한 리소스를 만들려고합니다. 문제는 데이터베이스 쓰기가 발생할 수있는 충분한 시간 (~ 5ms)으로 요청이 분리되지만 "동시"요청의 경우에는 사라집니다.

누구든지이 문제를 해결할 수있는 좋은 조언을 제공 할 수 있습니까? 동기 (스레드 차단) 방식으로 "isProcessing"플래그를 설정해야하는 것 같습니다. 파일 시스템에 동기 작업이 있다는 것을 알고 있습니다 -이 방법이 있습니까? 우리는 언젠가 클라우드로 확장 될 멀티 코어 머신에서 노드를 사용하고 있습니다. 우리는 pm2를 사용하여 여러 코어에 걸쳐 응용 프로그램을 배포하고 있습니다. 모든 조언을 크게 주시면 감사하겠습니다.

+0

플래그 설정이 비동기 데이터베이스 작업이어야합니까? 따라서 메모리에 즉시 플래그가 설정되어 지연이 없습니까? – jfriend00

+0

@ jfriend00 -이를 확장하는 방법에 대해 조언 해 주시겠습니까? –

답변

0

데이터베이스 액세스 권한 만 있으면됩니다. 당신이 말 할 때

IsProcessing이 이미 1로 설정된 경우 수정 된 행이 없습니다. 그렇지 않으면 1 행입니다. 이것은 두 가지 경우를 구분하고 무거운 작업을 한 번만 시작할 수있는 방법입니다.

+0

나는 이것을 정말로 좋아하고 그것에 대해서 생각조차하지 않았다. 테스트하고 다시보고합니다 (mongodb를 사용하지만 업데이트 된 행 수를 반환합니다). –

+0

이것은 올바른 방향으로 나를 이끌어 냈습니다. 고유 한 필드 제약과 중복 삽입에 대한 오류 처리의 조합을 사용했는데이 대답은 그 방향으로 나를 설정했습니다. –