2012-11-07 4 views
1

저는 응용 프로그램의 프로토 타입을 작성하는 작업을 받았습니다. 내가 함께 왔어요 솔루션 개념 가장에서 냄새 나는 것 같은 나는 ... 아직 코드가없는WPF 응용 프로그램에서 Azure blob 데이터를 많이로드합니다.

문제 :

솔루션이 물건을 할 다양한 푸른 프로젝트 구성 Azure SQL db-s에 저장된 많은 데이터. 거의 모든 작업을 수행하면 blob 저장소에 gzip 된 로그 파일이 생성됩니다. 로그 엔트리 당 하나의 .gz 파일입니다.

또한 이러한 로그 파일을 읽고 필터링하고 정렬 할 수있는 소형 데스크톱 (WPF) 앱이 있어야합니다.

로깅이 수행되는 방식에 영향을주지 않으므로이 문제를 해결하기 위해 변경할 수 없습니다. 나는 (개념)와 함께 왔어요

가능한 해결책 :

1 :

  • 컨테이너를
  • 읽기/다운로드를 열 BLOB 저장소에 연결 얼룩 (필터 적용)
  • .gz 파일 압축 해제
  • 읽기 및 표시

이의 문제 필터에 따라,이 전체 (느린)를 다운로드 할 데이터의 많은 및 프로세스 (매우 물어되지 않습니다 의미 할 수 있다는 것입니다). 난 정말이 응용 프로그램으로 볼 수 없습니다.

2 :

  • 서비스가 필터 PARAMS 및 기타 물건을 데이터와 함께 하나의 XML/JSON 파일을 반환합니다
  • 은 WCF 또는 REST 서비스를 실행하는 웹 역할을 만들 처리가 클라우드에서 수행됩니다.

이러한 접근 방식을 사용하면 이러한 파일의 압축을 풀 때 문제가 발생할 수 있습니다 (저장소/계산 인스턴스에서 여분의 공간을 차지할 것입니다. 그는 서비스가 실행 중입니다.)

편집 : 필터가 의미하는 것은 결과를 날짜와 심각도 (정보, 경고, 오류)로 제한하는 것입니다. .gz 파일은이 작업을 매우 쉽게 해주는 구조로 저장되며 파일 자체를 조사하여 필터링하지 않습니다.

3 :

  • 내가

의 모르는 다른 우아하고 간단한 해결책이 나는 또한 앱에서 실시간으로 표시되는 로그를 업데이트 만드는 방법이 필요 것 시간, 나는 blob 저장소/서비스에 대한 반복 된 요청으로 수행해야 할 필요가 있다고 가정합니다.


이것은 "코드 제공"질문 중 하나가 아닙니다. 모범 사례에 대한 조언이나 이와 유사한 문제를 해결하는 유사한 솔루션을 찾고 있습니다. 또한 사람들이 문제에 대한 접근 방식이 다르기 때문에 이것이 "아무도 맞지 않는 질문"중 하나 일 수 있음을 알고 있지만 프로토 타입을 제작할 시간이 있으므로 다른 것들을 시도 할 것입니다. 대답은 실제로 효과가있는 솔루션을 보여준 것이거나, 올바른 방향으로 나를 조종 한 솔루션 일 것입니다. 실제로 뭔가를 구축하고 테스트하기까지는 시간이 걸릴 수도 있습니다.

+0

나에게 명확하지 않습니다. "로그 항목 당 하나의 .gz 파일"단일 마스터 로그가 있습니까? 이러한 .gz 파일을 조사하지 않고 필터링을 수행하려면 어떻게 필터링합니까? – Paparazzi

+0

응용 프로그램은 Logger.Log (심각도, "메시지")와 같은 것을 호출합니다. 이러한 각 호출에 대해 "severity-date.gz"와 같은 파일 이름으로 새 파일이 작성됩니다 (이름에 더 많은 데이터가 있지만이 경우에는 관련이 없습니다). – Pinetree

+0

아직도 명확하지 않습니다. .gz 파일 이름만으로 필터링한다고 말하고 있습니까? 따라서 Logger 앱을 제어 할 수 없습니까? Logger.Log에 대한 호출을 제어 할 수 있습니까? – Paparazzi

답변

1

필자가 알고 있듯이 Azure Blob 저장소의 로그 파일은 특정 방식 (gzip)으로 형식화되어 있으며이를 표시하려고합니다.

이 파일의 크기는 어느 정도입니까? 모든 단일 정보를 로그 파일에 표시하고 있습니까?

로그 파일 인 경우 정적 및 기록 중임을 가정하면 ... 일단 로그/gzip 파일을 만든 후에는 변경할 수 없습니다 (블로그 저장소에없는 gzip 파일은 업데이트되지 않습니다).). 만 새 파일


왜 주기적으로 꺼지고 BLOB 저장소를 검색하도록 지속 "데이터베이스"를 구축 작업자 역할/작업 프로세스를 생성하지

하나의 솔루션 ... 생성 할 수 있습니다 표시 할 수 있습니다. 좋은 점은 WPF 앱이나 UI에서 로그 파일을 추출하기 위해 압축 해제/비즈니스 로직을 사용하지 않는다는 것입니다.

1) 나는 작업자 역할 푸른 BLOB 저장소에서 로그 파일을 검사 할 것이다 것은 2) 처리 어디에 어떤 것들 추적하는 메커니즘의 어떤 종류와 현재 "상태"지난 GZIP 파일 의 아마 UTC 날짜가 3) 작업자 역할의 로그 파일의 압축 해제/추출 작업을 수행하십시오. 작업자 역할로 SQL 데이터베이스, Azure 테이블 저장소 또는 분산 캐시에 내용을 넣으십시오. 5) REST 서비스로 액세스 할 수 있습니다. (ASP.NET 웹 API/Node.js 등)

규모를 조정해야 할 경우 더 많은 작업을 추가 할 수 있습니다 (예 : 주어진 시간에서 모든 로그 파일을 다시 작업하는 작업으로 실행). 모두 새로 고침). 데이터의 크기를 알 수 없으므로 실현 가능성이 있는지 확신 할 수 없습니다.

좋은 점은 일자리를 확장해야하는 경우 (하룻밤 사이) 2, 3, 6 작업자 역할을 확대 할 수 있다는 것입니다. 콘텐츠를 추출하고 결과를 서비스 버스 또는 저장소 대기열에 전달합니다. 액세스를 위해 SQL, Cache 등에 삽입 할 수 있습니다.

+0

예, 클라우드 앱에서 발생하는 모든 로그 항목에 대한 gzip 파일이 있습니다. DB를 가지고 액세스하는 생각이 마음에 들지만, 지금은 실현 가능한 솔루션이라고 생각하지 않습니다. 또한 로그는 앱에서 최근 버전이어야합니다. 따라서이 작업자 역할이 하루에 한두 번 실행되고 채워지면 여전히 클라이언트에서 부실 데이터가 표시됩니다. – Pinetree

+0

작업자 역할은 SQL 테이블/Azure 저장소를 업데이트하고 업데이트해야하는 경우 1 초마다 업데이트를 ping/검색 할 수 있습니다. 그걸 처리하는 데는 꽤 많은 시간이 걸릴 수 있습니다. 귀하의 응용 프로그램이 매초마다 로그 파일 지핑을 작성하고 있는지 의심 스럽습니다. UI 앱에서 로그에 액세스하면 트랜잭션 비용이 발생합니다 ... 또한 원시 로그 파일을 표면화 할 수있는 솔루션 확장 성을 극적으로 제한합니다 (여러 로그 파일에서 시간에 관계없이 쿼리를 수행하려는 경우 ... 어떻게해야합니까? 10 로그 파일을 실시간으로 압축을 풀고 쿼리를 처리하고 UI를 렌더링 하시겠습니까?). –

+0

첫 번째 옵션은 아니지만 로그 데이터를 데이터베이스에 저장하는 작업자 역할도 옵션 일 수 있음을 알 수 있습니다. 따라서 +1이 있습니다. – Pinetree

1

단순히 얼룩을 저장하는 것만으로는 충분하지 않습니다. 필터링 할 메타 데이터는 모든 메타 데이터를 쉽게 필터링하고 검색 할 수있는 곳에 저장해야합니다. 그래서 나는 당신이이 문제로이 분할해야한다고 생각 :

A. 나는 효율적으로 메타 데이터를 모두 "GZip으로 압축"을 나열 할 순서대로 내가이 GZip으로 압축에 필터를 적용 할 수있는 방법을 내 클라이언트에서 그들을 표시하는 방법 응용 프로그램입니다.

솔루션

  • 물방울 : 목록 모양은 느리고 필터링 할 수 없습니다 (월 또는 주 사용자 또는 당 컨테이너에서 그룹 ... 당신은 할 수 있지만 그 필터링 아니에요).
  • 테이블 저장소 : 매우 빠르지 만 검색 속도가 느림 (PK 및 RK 만 인덱싱 됨)
  • SQL Azure : 다른 메타 데이터와 함께 "gzips"목록이있는 테이블을 만들 수 있습니다 gzip, 전체 크기, ...). 좋은 인덱스를 가진 저장 프로 시저를 사용하면 매우 빠르게 검색 할 수 있지만 SQL Azure는 가장 확장 가능한 솔루션이 아닙니다.
  • Lucene.NET : Lucene.NET을 사용할 수있게 해주는 Windows Azure 용 AzureDirectory이 있습니다. 신청. 이것은 당신의 '문서'인덱스를 할 수있는 슈퍼 빠른 검색 엔진 (메타 데이터)이며,이 필터링하고 "GZip으로 압축"

업데이트 목록을 반환하는 완벽 할 것입니다 : 당신은 단지 날짜에 필터링 때문에을 와 정도는 물방울 표 옵션을 검토해야합니다

  • 물방울을 : 당신은 날짜 + 심각도에 따라 컨테이너를 만들 수 있습니다 (20,121,107 - 저, 20121107 중간, 20121107 높은 ...). 데이터 + 심각도 당 너무 많은 blob이 없다고 가정하면 컨테이너에서 직접 blob을 나열 할 수 있습니다. 여기있는 유일한 문제는 지난 주 (7 일)의 심각도가 높은 모든 항목을 사용자가보고 싶어한다는 것입니다. 즉, 7 개의 컨테이너에 얼룩을 나열해야합니다.
  • 테이블 : 테이블 저장소 나 db가 옵션이 아니라고해도 테이블 저장소는 고려해야합니다. 파티션과 행 키를 사용하면 매우 확장 가능한 방식으로 쉽게 필터링 할 수 있습니다 (예 : CompareTo을 사용하여 항목의 범위를 가져올 수 있습니다 (예 : 11 월과 7 월 사이의 모든 레코드). 테이블 데이터 저장소에서 데이터를 복제해도 문제가 없습니다. 테이블 저장 엔티티에 gzip의 일부 데이터를 포함하여 WPF 응용 프로그램에 표시 할 수 있습니다 (필터링 후 표시하려는 가장 중요한 정보). 즉, 사용자가 열거 나 두 번 열 때 blob 만 처리하면됩니다.

    (예를 들어, 검색 결과를 더블 클릭 후) 내 응용 프로그램에서 "GZIP"를 표시 할 방법 WPF 응용 프로그램

B의 기록을 클릭 WPF 응용 프로그램에서 스토리지 계정에 5,

솔루션

  • 연결은 파일을 다운로드하여 압축을 풀고을 표시합니다. 즉, 저장소 계정을 WPF 응용 프로그램에 저장하거나 SAS 또는 컨테이너 정책을 사용해야하며 백엔드에서 파일 저장 방법을 변경하려면 해당 저장소 계정을 변경해야합니다. WPF 응용 프로그램.
  • 웹 역할에 연결. 이 웹 역할은 BLOB 저장소에서 BLOB를 가져 와서 압축을 풀고 유선을 통해 전송합니다 (또는 전송 속도를 높이기 위해 압축 된 메시지를 보냅니다). 파일 저장 방법이 변경된 경우 웹 역할 만 업데이트하면됩니다.
+0

글쎄, "필터"는 잘못된 용어 일 수도 있지만 날짜와 로그 수준 (정보, 경고, 오류)별로 결과를 제한하고 싶습니다. blob 파일은 실제로는별로 문제가되지 않는 방식으로 구조화되어 있습니다. Bart Czernicki에게 대답하면 DB (테이블 또는 SQL)는 아마도 옵션이 아닐 것입니다. 두 번째 부분에서는 하나의 BLOB를 선택할 때뿐만 아니라 목록 자체에 일부 데이터를 표시 할 수 있기를 원합니다. BTW +1 여기에 lucene. 나는 아이디어를 좋아하고, 확실히 그것에 대해 조사 할 것이다. – Pinetree

+0

날짜와 심각도에 따라 필터링하는 경우 기본적으로 파일 이름을 예상대로 구조화하고 거기에 있는지 확인하는 것만으로도 lucene이 실제로 필요합니까? – Pinetree

+0

답변을 업데이트하겠습니다. –