2011-02-08 6 views
4

내가 작업중인 프로젝트는 데이터베이스에서 개체 및 개체 모음을 가져 오는 방법에 대한 디자인 딜레마에 직면하고 있습니다. 경우에 따라 객체 ID를 설정하고 필요할 때마다 속성을 쿼리하는 것이 유용 할 때도 있습니다 (객체 당 1 db 호출을 사용하여 모든 속성을 가져 오는 것이 유용 할 때도 있습니다.) * 모두 *). 많은 경우 컬렉션은 버퍼링 객체를 메모리로 지원하고 주문형 액세스를위한 최소 정보로 초기화해야합니다. 결국 모든 것을 메모리에 버퍼링 할 수는 없으며 필요에 따라 모든 것을 읽을 수있는 것은 아닙니다. 유비쿼터스 메모리 대 IO 문제입니다.비즈니스 계층 디자인 딜레마 : 메모리 또는 IO?

누구나 같은 문제에 직면 했습니까? 디자인에 어떤 영향을 미쳤습니까? 힘든 교훈은 무엇입니까? 다른 생각과 권장 사항은 무엇입니까?

EDIT : my 프로젝트는 웹 응용 프로그램, 웹 서비스 및 데스크톱 응용 프로그램에서 사용되는 비즈니스 계층 DLL의 전형적인 예입니다. 데스크톱 응용 프로그램에 대한 제품 목록이 필요하고 제품 이름으로 만 표시되는 경우 모든 제품을 표시하려면이 일련의 단계를 수행하는 것이 좋습니다 (데이터베이스에 백만 개의 제품이 있다고 가정하십시오).
1. 하나 이 같은 API가 소비 될 것입니다 경우 DB

그러나 (온 디맨드 액세스), 제품에 사용자가 클릭 세부 정보를 볼 경우 모든 제품 정보를 얻을 수
2. 하나의 DB를 호출 모든 제품 이름을 얻기 위해 전화 웹 서비스를 통해 모든 제품을 세부적으로 표시하면 네트워크 트래픽이 원활하지 않게됩니다. 이 경우 더 좋은 순서는 다음과 같습니다.
1. 단 하나의 db 호출로 모든 제품과 제품 필드 버퍼링 (이 경우 1 백만 제품 버퍼링도 무섭다)

답변

6

얼마나 자주 데이터 변경. 정적 및 정적 데이터에 가까운 캐시가 일반적입니다 (일반적으로 캐시 만료 창과 함께).

데이터베이스는 이미 데이터를 캐시하도록 설계되었으므로 제공된 네트워크 I/O가 병목 현상이 아니므로 데이터베이스를 올바르게 수행하십시오.

사용 가능한 캐싱 기술 중 일부를 보았습니까?

+0

링크를 제공해 주셔서 감사합니다. Velocity 기사는 매우 즐겁습니다 ... 정적 데이터는 이미 사내 캐시에 캐시되어 있습니다. 정적이 아닌 다른 데이터는 전혀 캐시되지 않으며 메모리로 완전히 읽히지 않습니다 (필드는 필요시 액세스됩니다, 편집 참조). 이 동적 데이터의 경우 메모리를 완전히 또는 부분적으로 읽어야하는지 여부를 결정하기가 어렵습니다. 조언을 주셔서 감사합니다 – kateroh

2

이 인기 P 아니다 그러나 절대적으로 필요한 경우가 아니면 "인터넷 규모"가 필요하다는 것을 즉시 알고있는 경우를 제외하고는 모든 캐싱을 피하십시오. 데이터베이스 상단의 계층 형 캐시를 수평 확장하려고 시도 했습니까? 캐시를 통해 write-through 할 것이며 LRU 객체가 변경 사항을 쓰는 것을 읽기만 기다리시겠습니까? 다른 앱이나 웹 서비스 계층이 DB 상단에 앉아서 일관성없는 읽기를하면 어떻게됩니까?

대부분의 최신 데이터베이스는 이미 캐시를 가지고 있으며 사용자가 필요로 할 때마다 DB 전선을 사용할지 결정합니다. 대다수의 경우 DB는 정상적으로 작동하므로 일관성을 유지할 수 있습니다.기본 및 CAP 이론은 멋지고 재미있게 이야기하고 상상할 수 있지만 때때로 좋은 오래된 데이터베이스를 치는 것의 비용 - 투 - 마켓을 이길 수는 없습니다. 스트레스 테스트 및 핫스팟 확인, 필요한 경우 캐시를 보수적으로 구현하십시오.

+0

. 원래의 문제는 캐시 대 데이터베이스 히트의 문제 만은 아닙니다 (프로젝트는 덜 자주 변경되는 개체에 대해 이미 캐시를 가지고 있습니다). get-all 메소드가 최소한의 데이터를 가져오고 필요에 따라 나머지를 반환하는 대신 모든 데이터를 메모리로 읽어야하는지에 대한 질문이기도합니다. (데이터의 부실 가능성도 적습니다.) – kateroh

+0

@kateroh - 다시 돌아오고 있습니다. 같은 캐시 문제, 항상 캐시를 통해 갈 수있는 모든 것이 잘 될 수 있습니다. 캐시를 무효화하지 않고 영구 데이터를 만드는 다른 레이어가 있으면 일관성없는 결과가 발생합니다. 웹은 (대부분) 상태를 유지하지 못하는 경우가 종종 이런 트랜잭션 시스템과의 불일치이지만 캐시 불일치와 일관성 오버 헤드가 너무 많이 발생했습니다. – Xailor

+0

@kateroh - 개인적으로 KISS에서 필요한 경우 DB에 쿼리합니다. – Xailor

관련 문제