2009-12-02 2 views
2

:.NET 문서 관리 시스템 디자인 - 성능 질문에 나는 다음과 같은 사양의 기본 .NET 문서 관리 시스템을 개발해야

  1. 데이터가 포함 된 휴대용 및자가되어야한다, 그래서 문서를 직렬화됩니다 (일반적인 형식은 Word, PDF, Excel 및 Powerpoint 포함)을 이진 데이터로 변환합니다. 그런 다음이 바이너리 데이터를 SQL Server 2005 데이터베이스에 저장합니다. 사용자가 문서를 다운로드해야하는 경우 시스템은 바이너리 데이터를 비 직렬화하여 원래 형식으로 표시합니다.

  2. 평균 행 크기는 200k보다 클 수 없습니다.

  3. 3 년 동안 최대 500 개의 문서가 매월 업로드 될 것으로 예상됩니다.

  4. 우리는 우리가 잠재적으로 동시에 시스템에 액세스 할 이만명의 최대 목표를

  5. GB (6)을 통해 데이터베이스의 크기 이제까지 갈 기대하지 않습니다.

내 질문은 : 견고한 성능을 제공하고 사이트 중단 시간을 방지하기 위해 기술이 얼마나 강건해야합니까?

저는 초보 개발자이며 이러한 종류의 아키텍처 및 디자인에 익숙하지 않습니다.

+1

초보자는 초보자입니다. 꽤 엄격한 요구 사항과 상당히 정교한 확장 성 요구 사항이 있습니다. 대형 (예 :이 시나리오에서는 200K) 대형을 비 직렬화하는 동안 잠재적으로 20,000 개의 동시 요청을 처리하면 데이터베이스의 BLOB에 심각한 설계 고려 사항이 필요합니다. –

+0

안녕하세요, John, 감사합니다. 이 경우 초보자는 "매우"입니다. "진지한 디자인을 고려중"이라면 무엇을 의미할까요? 이 디자인의 예를 들어 주시겠습니까? –

답변

5

파일 서버 나 CDN에 문서의 경로를 저장하는 대신 파일을 데이터베이스에 저장해야하는 이유는 무엇입니까? DB 서버의로드가 훨씬 적어지고 문서 저장을위한보다 융통성있는 옵션을 제공합니다.

당신은 내가 제안 하나, 같은 시스템으로 이동/삭제 된 파일에 문제가있는 경우 아마도 또한 다음과 같은 다른 옵션을 고려 : 모든 사람에게 기본 파일 시스템을 제외하고에

  • 잠금 권한을 응용 프로그램 폴더 등의 변경 사항을 청취하고 결국 데이터베이스 따라

을 업데이트하는 백그라운드 서비스를 실행 (가장 쉬운 방법)

  • 에서 실행되는 역할은 데이터베이스 유일한 해결책은 간단 할 수 있지만, 나는 수만명의 사용자를 위해 대용량 파일을 저장하여 발생할 수있는 부하를 과소 평가하지 마십시오.

  • +3

    +1하지만 필자는 오라클 11과 SQL Server가 파일이 데이터베이스에 "있지만"실제로 파일 서버에있는 기능을 제공한다고 덧붙입니다. 즉, DB에 의해 관리됩니다. 오라클 11은 파일에 대한 WebDAV 액세스를 제공하기까지합니다. 이는 매우 깔끔합니다. 우리는 Oracle 11 용 SecureFiles를 사용하여 대용량 파일 (500MB 이상)을 성공적으로 수행했습니다. – user7116

    +0

    +1 정보 - 좋은 팁. – Marcus

    +0

    안녕하세요 Marcus입니다. 우리는 그런 종류의 시스템을 정확하게 대체하기를 원합니다. 문서가 디렉토리에서 제거되고 경로가 DB에서 업데이트되거나 삭제되지 않기 때문에 링크가 끊어진 사례가 많습니다. –

    5

    이것은 "기본"시스템 그 이상입니다. 따라서 여기에 내 걱정거리가 있습니다 :

    • 500 개 문서는 데이터베이스 크기가 6GB를 초과 할 수 있습니다. 최대 문서 크기를 결정하고 해당 계산이 지속되는지 확인할 수 있습니다.
    • 20,000 명의 사용자가 많이 있습니다. 한 번에 얼마나 많은 사람들에게 기대할 수 있습니까? 동시 사용자가 100 명이 넘으면 부하를 처리 할 수 ​​있도록 서버 클러스터링/웹 팜을 조사하기 시작합니다.
    • 단순한 선택이지만 .NET의 "Serializable"의미에서 "직렬화"되지는 않습니다 .당신이 당신의 DB 서버가 다운

    마지막으로 간다 단지의 경우 다른 DB 인스턴스 DB 복제 볼 필요가있을 것이다 고 가용성을 필요하면 그냥 DB

  • 에 원시 문서 바이트를 저장됩니다. 필자는 사용자가 원하는대로 작업 할 수있는 기성 시스템이 있으며 권한 기반 액세스 및 문서 개정과 같은 고급 기능을 포함한다고 믿어야합니다.

    마이크

  • +0

    귀하의 의견을 기다리고 있습니다. ""선택을 할 수는 없지만 .NET의 "Serializable"의미에서 "serialize"되지는 않습니다. 당신은 DB에 원시 문서 바이트를 저장할 것입니다. "감사합니다. –

    +0

    직렬화는 객체 클래스를 XML로 저장하는 것과 같이 다른 형식으로 생성 된 객체를 나타내는 것을 의미합니다. 당신이하고있는 일은 한 파일을 다른 파일로 감싸는 것입니다. – overslacked

    +0

    죄송합니다 - 객체 클래스가 아닌 "XML의 객체 인스턴스"를 읽어야합니다. – overslacked

    0

    당신이 당신의 머리에있을 때 프로그램의 중요한 부분은 알고있다. 게시 한 CTQ가 실제, 특히 동시 액세스 요구 사항이라면, 당신은 상처를 입을 수 있습니다. 트렌치에서 꽤 많은 시간을 가진 우리조차도 그러한 종류의 요구 사항으로 상처를 입을 것입니다. 다음과 같은 사고 방식으로이 문제를 해결할 것입니다 :

    나는 이것이 내가 상상할 수있는 더 많은 방법으로 잘못 할 것입니다. 이 구조를 유지하는이 많이 알고

    , 간단한 확률이 더 높다는을 확장하는 것입니다. 그러나 내가 일하는 회사는 절대적으로 엄청 나서 에 20,000 명의 동시 사용자가있는 시스템이 있다고 의심 스럽습니다. 따라서 씹을 수있는 것보다 더 많이 물지 마십시오.

    아키텍처를 간단하고 견고하며 (큰 순서) 아키텍처를 설계하면 결국 큰 총을 호출해야 할 때까지 자연스럽게 확장됩니다.

    SQL Server 2008에 액세스하는 데 최소한의 비용을 지출해야한다고 제안 할 수 있습니다. 해당 버전에서는 문제가 상당히 초보적이어야합니다. 파일에 FILESTREAM 저장소를 사용하십시오. 직렬화가 필요하지 않습니다. 이렇게하면 NTFS 파일 시스템에 파일을 저장하고 프로그래밍, 유지 관리 및 확장 성을 극대화합니다.

    SQL Server 2005 만있는 경우 BLOB을 처리해야합니다. 정확히 어렵지는 않지만 다소 복잡합니다. Microsoft Research의 To BLOB or Not to BLOB을 읽어 보면 SQL Server 2005에 데이터를 저장하는 것이 최선의 결정인지 판단 할 수 있습니다. 그렇다면 파일을 SQL 서버 BLOB에 저장하는 방법을 자세히 설명하는 기사가 많이 있습니다. 이 솔루션이 가장 효율적이거나 확장 가능한 솔루션이라는 것은 거의 알 수 없습니다.

    +0

    안녕하세요, 대단히 감사합니다. –