2009-11-19 2 views
4

나는 대화식으로 더 많거나 적게 수백만 개의 레코드를 대량 태그하는 기능이 포함 된 응용 프로그램을 작성합니다. 사용자 상호 작용은 사용자가 개별 전자 메일에 태그를 추가하거나 많은 양의 전자 메일을 대량 태그 할 수있는 Gmail과 매우 유사합니다. 또한 이러한 태그 멤버쉽에 대한 빠른 읽기 액세스와 읽기 패턴이 어느 정도 임의적이어야합니다.낮은 대기 시간 읽기 및 쓰기에 대한 지속성 전략

지금 우리는 Mysql을 사용하고 모든 태그 - 문서 쌍에 대해 하나의 행을 삽입하고 있습니다. 수백만 개의 행을 MySQL에 작성하는 것은 대량 삽입과 무거운 최적화를 사용하는 경우에도 (높은 I/O) 시간이 걸립니다. 배치 프로세스가 아닌 대화식 프로세스가 필요합니다.

우리가 저장하고 읽는 데이터의 경우 데이터의 일관성 및 가용성은 성능 및 확장 성만큼 중요하지 않습니다. 따라서 쓰기가 발생하는 동안 시스템 오류가 발생할 경우 데이터 손실이 발생할 수 있습니다. 그러나 어떤 시점에서는 데이터를 확실히 2 차 저장소에 보관해야합니다.

그래서, 요약하기, 여기에 요구 사항 : 잠재적으로 수십 기록의 수백만의

  • 낮은 지연 시간 벌크 쓰기
  • 데이터
  • 낮은 대기 시간이 랜덤 읽기 어떤 방법으로 지속되어야한다
  • 내구성 쓰기 필요하지
  • 최종 일관성 괜찮
기록이 비동기 데이터베이스에 메모리에 기록하고 배출하는 캐시 (테라코타, Gigaspaces, 일관성) 뒤에

  • 쓰기 :

    는 여기에 내가 검토 한 결과 몇 가지 솔루션입니다. 그들은 내가 피하고 싶을만한 앱에 일정한 복잡성을 더하는 것처럼 보이기 때문에 조금 놀랐다. MongoDB를, HBase를, 도쿄 폭군 같은

  • 확장 성이 뛰어난 키 - 값 저장,

답변

2

Coherence를 사용할 예산이 있다면 그렇게하는 것이 좋습니다. Coherence에서의 write-behind, 궁극적 인 일관성 동작에 대한 직접적인 지원이 있으며 데이터베이스 중단 및 Coherence 클러스터 노드 작동 중단 (별도의 호스트에서> = 3 Coherence 노드를 사용하는 경우 별도의 JVM에서 가능)에서 매우 유용합니다. 포춘지 선정 100 대 기업의 전자 상거래 사이트 용 대량 CRM을 구현하기 위해이를 구현했으며 환상적으로 작동합니다.

이 아키텍처의 가장 좋은 점 중 하나는 Java 애플리케이션 코드를 작성한 것처럼 write-behind 동작을 작성한 다음 Coherence 토폴로지와이를 구성하는 구성을 연결하는 것입니다. Coherence의 동작이나 토폴로지를 나중에 변경해야하는 경우 애플리케이션을 변경할 필요가 없습니다. 아마도 합리적인 방법이있을 것입니다.하지만이 동작은 Coherence에서 직접적으로 지원됩니다.

정말 좋은 점을 알려면 응용 프로그램의 복잡성을 추가하는 것이 좋습니다. Coherence를 사용하면 캐시에 업데이트를 간단하게 쓸 수 있습니다 (또는 Hibernate를 사용하는 경우 L2 캐시 공급자가 될 수 있습니다). Coherence 구성 및 토폴로지에 따라 write-behind, distributed, caches를 사용하도록 애플리케이션을 배치 할 수 있습니다. 따라서 캐시 기능으로 인해 애플리케이션이 더 이상 복잡하지 않습니다.

마지막으로, Coherence가 Tangosol에 의해 만들어진 2005-2007 년부터 위에서 언급 한 솔루션을 구현했으며 최상의 지원을 받았습니다. 나는 오라클의 상황이 어떻게되는지 잘 모르겠습니다.

0

데이터가 아마도 어떻게 구성되어 있는지 읽기 대기 시간이 충분히 낮지 않은 경우 sharding, 를 사용할 수있을 것입니다에 따라 캐싱을 추가 할 수도 있습니다. Memcache는 널리 사용되는 솔루션 중 하나입니다.

1

나는 비동기 쓰기를 사용하는 커다란 프로젝트에서 작업했다.이 경우 백그라운드 스레드를 사용하여 손으로 직접 작성했다. db write 프로세스를 JMS 큐로 오프로드함으로써 이와 비슷한 것을 구현할 수도있다.

확실히 db 쓰기 속도를 높이는 한 가지 방법은 일괄 적으로 수행하는 것입니다. JDBC 배치 업데이트는 개별 쓰기보다 훨씬 빠르게 진행될 수 있으며, 비동기 적으로 수행하는 경우 한 번에 500 개를 쓸 수 있습니다.

0

Berkeley DB는 트랜잭션을 지원하는 매우 높은 성능의 디스크 기반 해시 테이블을 필요로하며 Java EE 환경과 통합됩니다. 데이터를 키/값 쌍으로 모델링 할 수 있다면 매우 확장 가능한 솔루션이 될 수 있습니다.

http://www.oracle.com/technology/products/berkeley-db/je/index.html

(참고 : 오라클 DB 5-10 년 전 버클리를 구입, 원래 제품 15-20 년 동안 주변되었습니다).