2013-10-06 2 views
0

상품을 일정 기간 사용할 수있는 경매 스타일 웹 앱을 개발 중입니다.NodeJs의 시간 기반 응용 프로그램 모델링

저는 어떻게 모델링했는지 알고 싶습니다.

지금까지 제가했던 것은 DB에 제품을 저장하는 것입니다 :

{ 
... 
id: p001, 
name: Product 1, 
expire_date: 'Mon Oct 7 2013 01:23:45 UTC', 
... 
} 

때마다 제품, 나는 * CURRENT_DATE < EXPIRE_DATE을 테스트 클라이언트 요청 *.

사실 인 경우 제품 데이터와 클라이언트 측에 카운트 다운 타이머를 표시합니다. 타이머가 0에 도달하면 관련 컨트롤을 비활성화합니다.

그러나, 서버 쪽, 아무도, 해당 제품을 요청하지 예를 들어, 자신의 제품이 종료 된 것을 소유자에게 통지 한 경우에도 수행해야 할 몇 가지 작업이 있습니다.

각 요청마다 전체 제품 컬렉션을 검색 할 수는 있지만 나에게 부담스러워 보입니다.

나는 크론로 매 n 분 루틴을 트리거에 대한 생각,하지만 당신은 더 나은 솔루션을 생각할 수 있는지 알고 싶습니다.

감사합니다.

답변

1

각 요청에서 전체 컬렉션을 검색하면 처리 시간이 엄청납니다.

메인 서버 프로세스를 추적하고주기적인 작업을 cron과 같은 기능을 내장하여 처리하는 데는 pm2과 같은 것을 사용합니다.

1

일부의 생각 :

  1. 색인 expire_date 필드. 특정 날짜보다 오래된 경매 물건을 스캔하는 경우에 원할 것입니다.
  2. expired (또는 active) 두 번째 필드를 추가하는 것이 좋습니다. 다른 유형의 날짜가 아닌 검색도 할 수 있습니다 (항상 그렇듯이 만료 된 경매는 거부해야 함).
  3. 당신은 예를 들어 두 번째 필드 active을 추가 가정하면, 더 활성 및 유효 기간이 지난들만 경매 항목으로 스캔을 제한 할 수 있습니다. 이러한 경우에 대한 복합 색인을 고려하십시오. (시간이 지남에 따라 예를 들어 스캔 할 필요가없는 만료 된 항목이 더 많아집니다.
  4. 예, 만료 된 경매를 검색하려면 자주 사용하는 기술을 사용하여 시간 지정 작업을 추가해야합니다. 이를 수행하는 데는 여러 가지 방법이 있습니다. 인프라가 무엇이 합리적인지 판단하는 데 도움이됩니다.
  5. 가능한 한 효율적으로 검색을 수행하려면 가능하면 현재 경매 항목의 로컬 캐시를 메모리에 보관하십시오. 데이터베이스가 만료되지 않으면 아무 이유도 없습니다.
  6. 다시 데이터베이스에서 검색 할 때 항목이 여전히 활성 상태인지 확인하십시오. 표시되기 위해 만료 된 항목이 만료되는 경합 조건이 쉽게 존재할 수 있으므로 항목이 아직 활성 상태인지 확인하십시오.
  7. 상태 재전송 상태 등을 데이터베이스에 저장하여 서버 재시작 등을 적절히 처리 할 수 ​​있습니다.

이 될 수 뭔가 같은 :

{ 
... 
id: p001, 
name: "Product 1", 
expire_date: ISODate("Mon Oct 7 2013 01:23:45 UTC"), 
active: true, 
... 
} 

// console 
db.auctions.esureIndex({expire_date: -1, active: 1}) 

// javascript idea: 
var theExpirationDate = new Date(2013, 10, 06, 0, 0, 0); 
db.auctions.find({ expire_date : { "$lte" : theExpirationDate }, active: true })