2013-04-13 3 views
1

Objectify와 함께 Google App Engine을 사용 중이며 5 분마다 db의 항목을 삭제하고 싶습니다. 이것을 달성하는 가장 좋은 방법은 무엇입니까? Google App Engine의 ThreadManager 또는 cron 작업을 사용해야합니까? 아니면 다른 방법이 있습니까?가 주기적으로 objectify의 항목을 삭제합니다.

+0

5 분마다 삭제할 ​​항목의 수는 얼마나됩니까? –

+0

@IbrahimArief : 대다수, 아마도 수십만 명? 아니면이 항목을 자동으로 만료시키는 방법이 있습니까? –

+0

그건 .. 거대 해. 공유 데이터를 자동으로 만료하는 유일한 방법은 Memcache에서 [만료] (https://developers.google.com/appengine/docs/java/javadoc/com/google/appengine/api/memcache/Expiration) 옵션을 사용하는 경우입니다. 당신은 [put operation] (http://bit.ly/10S6xve)을하지만, 당신의 데이터는 일시적 일 것입니다. 자주 비용이 많이 드는 수십만 개의 엔티티를 삭제하면 규모에 대해 확신 할 수 있습니까? –

답변

0

Cron 여기에 맞는 요구 사항이 있지만 삭제해야하는 항목의 크기가 걱정됩니다. (의견에 따라 5 분마다 수십만 개까지). 많은 엔티티를 삭제하는 데는 5 분 이상의 시간이 소요될 수 있으며 프론트 엔드 cron 핸들러의 마감 시간 인 10 분 이상이 될 수도 있습니다.

백엔드가 마감 기한없이 실행될 수 있으므로 가능한 해결책은 backend instance에서 삭제하는 것입니다. Cron은 삭제 될 엔티티를 쿼리하고, 키 전용 쿼리를 사용하여 키를 가져온 다음 background threads의 엔티티를 삭제하는 프로세스를 시작하는 데 사용될 수 있습니다.

프로세스가 무기한 실행될 수 있으므로 삭제가 완료되었다고 스레드가보고 한 후에 즉시 다시 쿼리하고 다음 엔티티 집합을 삭제할 수 있습니다. 백엔드에서 전역 인 메모리 잠금을 사용하여 후속 cron 요청이 별도의 프로세스를 시작하지 않도록 할 수 있지만 프로세스가 이미 실행되었음을 감지하면 자동 종료됩니다. 그래서 여기서 cron은 삭제 과정에서 keep-alive 신호로만 사용됩니다.

부수적으로이 엔티티를이 스케일에서 자주 쿼리하고 삭제하면 데이터 저장소 운영 비용이 엄청나게 비쌉니다. 당신이 원하는 것처럼

+0

감사합니다. 내 구현을 다시 생각해 보겠습니다 –

+0

단일 인스턴스에서 충분한 데이터 저장소 작업 처리량을 얻을 수 없기 때문에 이것이 작동하지 않는다고 생각합니다. 이것이 작동 할 수있는 유일한 방법은 map/reduce를 사용하는 것입니다. 데이터 저장소 연산에서 $ 150/day 이상을 소비합니다.데이터를 읽고 싶다면 타이밍 문제가 있습니다. – stickfigure

+0

@stickfigure : 감사합니다. Jeff, 처리량도 궁금합니다. 내가 mapreduce를 좋아하는만큼, 그것은 구직자가 필요로하는 종류의 정밀한 제어를 제공하는지 모른다. (우리는 이전에 [여기] (http://stackoverflow.com/questions/15976406/objectify-and-timertask-no-api-environment-is-registered-for-this-thread?lq=1)에서이 문제를 논의하고있었습니다) 그것이 내 앱이라면로드와 삭제를 배포하기 위해 일종의 마스터 작업자 패턴을 사용 하겠지만, 구현 전략을 완전히 변경하는 것보다는 약간 과장 될 수 있습니다. –

1

는에, 5 분마다 소리 :

  • 엔티티의 수천
  • 집계 수백
  • 수백 개체의 수천을 삭제 수백 개체의 수천을 쓰기

map/reduce를 사용하여이 작업을 수행 할 수 있습니다. 그러나 비용이 많이 들고 (하루에 수백 달러가 소요될 것입니다.) 특히 작업 큐가 백업 될 때 타이밍 문제가 발생할 것입니다.

이 데이터를 GAE 외부에 저장하는 것이 좋습니다. Google Compute Engine 계정을 만들고 여기에 mongodb 또는 redis 인스턴스를 설정하십시오. 또는 AWS에서 호스팅 할 수도 있습니다. GAE는 이러한 종류의 작업 부하에 적합하지 않지만 "전부 또는 아님"이 아닙니다. 클라우드의 다른 부분에서 서비스로 쉽게 작업 할 수 있습니다.

+0

좋습니다, 감사합니다! 나는 그것을 들여다 볼 것이다. –

관련 문제