XML을 반환하는 웹 서비스 API를 사용할 때 매번 외부 서비스를 호출하고 (ElementTree를 사용하여) XML을 구문 분석하여 사이트에 표시하거나 레코드를 데이터베이스 (한 번 또는 여러 번 구문 분석 한 후 매일 필요함) 대신 동일한 정보에 대해 데이터베이스 호출을 수행하십시오.외부 XML을 구문 분석하거나 데이터베이스를 조회하는 것이 더 효율적입니까?
답변
누구나이 질문에 대답하는 데 매우 정중합니다. "의존합니다."... "테스트해야합니다."... 등등.
사실이 질문은 관련된 응용 프로그램 및 네트워크 토폴로지에 대해 자세히 설명하지는 않지만 질문하는 경우에도 다음과 같습니다. a) DB가 응용 프로그램과 동일한 서브넷에있는 "로컬" , 또는 같은 기계 또는 메모리), 그리고 b) 웹 서비스가 아닙니다. 어쨌든 OP는 "외부 서비스"및 "자신의 사이트에 표시"라는 문구를 사용합니다. "하루에 한 번 또는 여러 번 파싱"이라는 구절은 매초마다 정확히 바뀌지 않는 일련의 데이터를 제안합니다.
고전적인 SOA 신화는 네트워크가 항상 사용 가능하다는 것입니다. 더 나아가 네트워크가 항상 낮은 대기 시간과 함께 사용 가능하다는 전설이 있습니다. 내부 시스템이 허튼 소리가 아니라면 인터넷을 통해 HTTP 쿼리를 보내는 것은 로컬 DB 또는 DB 클러스터에 대한 쿼리보다 항상 느립니다. 여기에는 여러 가지 이유가 있습니다. 원격 서버에 대한 홉 수, 원격 종료시 제어 할 수없는 중단 또는 성능 저하 문제 및 원격 웹 서비스 응용 프로그램이 요청을 분석하기위한 내부 처리 시간입니다. 자체 퍼시스턴스 백엔드 (일명 DB)를 생성하고 결과를 반환합니다.
앱을 실행하십시오. DB에 대한 대기 시간 및 응답 시간을 단축하십시오. 이제 원격 웹 서비스에서도 동일한 작업을 수행하십시오. DB가 인터넷에 있지 않으면 큰 차이가 있음을 알 수 있습니다.
유능한 기술자가 DB를 확장하거나 memcached 및 다른 패러다임을 사용하여 캐싱에서 DB를 완전히 제거하는 것이 어렵지 않습니다. 데이터 센터에 서로 가까이있는 서버 사이의 대기 시간은 인터넷을 통해 (그리고 더 안전하고 부팅하기 위해) 기계들보다 기념비적으로 적습니다.이 스케일을 달성하더라도 약간의 생각이 필요하다하더라도 스케일링과 대기 시간이 완전히 불투명 한 원격 웹 서비스와 달리 제어가 가능합니다. 나는 내 사이트의 가용성과 반응성이 전적으로 다른 사람을 기반으로한다는 생각에 너무 만족하지 않을 것입니다.
마지막으로 원격 웹 서비스를 사용할 수없는 경우 어떻게됩니까? 사이트에 대한 모든 요청이 다른 사이트에 대한 인터넷을 통한 요청을 포함하는 세상을 상상해보십시오. 다른 사이트를 사용할 수없는 경우 어떻게됩니까? 사용자가 몇 시간 동안 죽음의 회전 커서를 보지 않습니까? 이 예기치 않은 외부 의존성 때문에 사이트가 손상되는 동안 오류 500가 발생합니까?
기본 기능이 모든 요청에 대해 원격 인터넷 전화에 의존하는 아키텍처를 채택하는 경우, 결과와 함께 살 수 있는지 결정하기 전에 응용 프로그램에 대해 매우 신중하게 생각하십시오.
캐싱 등을 통해 웹 서비스와 웹 서버를 확장 할 수있는 많은 것들이 있기 때문에 웹 서비스를 사용하는 것이 더 효율적입니다. 중간 레이어를 사용하면 반환 된 데이터 형식을 변경할 수 있습니다 (예 : XML이 아닌 JSON을 사용할 수 있음). 데이터베이스를 확장하는 것이 훨씬 어렵습니다 (복제 등 포함). 일반적으로 가능한 경우 DB에 적중을 줄입니다.
1 차 조치. 하나가 다른 하나보다 좋거나 나쁘다고 가정하지 마십시오.
둘째, 실제로 측정하고 싶지 않다면 데이터베이스가 조금 더 빠릅니다 (데이터베이스가 웹 서비스에 비해 상대적으로 로컬이라고 가정). 네트워크 대기 시간은 실제로 복잡한 데이터베이스 또는 실제로 복잡한 XML을 말하지 않는 한 일반적으로 구문 분석 시간 이상입니다.
일반적으로 말할 수있는 정보가 충분하지 않습니다. 왜 몇 가지 검사를하고 알아 내는게 어때? 파이썬을 사용하는 것처럼 들리므로, 아마도 timeit 모듈을 사용하고 싶을 것이다. 결과에 영향을 수
어떤 것들은 :
당신이 서버간에- 성능 반환 된
캐시 할 수있는 경우 캐시 된 버전의 데이터는 더 빠르지 만 로컬 RDBMS 사용을 의미하지는 않습니다. 응용 프로그램의 memcached 또는 메모리 캐시에있을 수 있습니다.
더 중요한 것은 원격 사이트에서 업데이트하는 빈도와 로컬 사이트에서 액세스하는 빈도입니다. –
- 누가 웹 서비스를 호출합니까? 사용자가 페이지를 조회 할 때마다 웹 서비스가 호출됩니까? 그렇다면 일종의 캐싱 레이어를 도입하는 것이 좋습니다. 많은 웹 서비스 API가 시간 당 만들 수있는 히트 양을 조절합니다.
캐싱 된 XML을 파싱하거나 데이터베이스에서 데이터를 호출할지 여부는 상관 없습니다 (여기서 엔터프라이즈 스케일링에 대해 언급하지 않는 한). 개인적으로 DOM Parser를 작성하는 것보다 훨씬 간단한 SQL 호출을 작성하는 편이 낫습니다 (예외적 인 시나리오에 훨씬 더 취약합니다).
경우에 따라 다르므로 측정 (또는 적어도 교훈있는 추측을해야 함)해야합니다.
몇 가지 사항을 고려해야합니다.
웹 서비스
- 는 데이터베이스 자체
- 가 캐시 할 수 있습니다 히트 수 는 네트워크 대기 시간을 소개하고
- 신뢰할 수 있습니다하거나 접근보다 빠른 로컬 네트워크에하고 수
- 심지어 로컬 디스크
DB
- 는
기술 자체가 속도면에서 큰 의미가 없습니다
적용 가능한 경우 응용 프로그램의 데이터를 캐싱하는 것이 좋습니다.
몇 명의 사람들이 말했듯이, 의존하고 테스트해야합니다.
종종 외부 서비스가 느리고 로컬 (메모리의 데이터베이스, 예를 들어 memcached)에 캐싱이 더 빠릅니다. 하지만 그렇지 않을 수도 있습니다.
다행히도 저렴하고 테스트하기 쉽습니다.
테스트가 완료되었습니다. 일반적으로 XML은 앱 간 통신에 적합하지만 일단 앱 내부에 데이터가 있으면 모든 것이 데이터베이스 테이블에 저장되어야합니다. 이것은 모든 경우에 적용되는 것은 아니지만 그것이 나를위한 시간의 95 %를 차지합니다. 언제든지 데이터를 다른 방식으로 저장하려고 시도 할 때 (예 : 콘텐츠 관리 시스템의 XML) 나는 이전의 좋은 sprocs 및 SQL 서버를 사용하기를 바랬다.
기본적으로 캐시 결과를 원하고 그럴 가치가 있는지 궁금해 할 것 같습니다. 그러나 그렇다면 데이터베이스를 사용하지 않을 것입니다 (관계형 DB에 대해 생각하고 있다고 가정합니다). RDBMS는 캐싱에 적합하지 않습니다. 많은 사람들이 그들을 사용하더라도. 지속성이나 ACID가 필요하지 않습니다. Oracle/MySQL과 외부 웹 서비스 사이에서 선택한다면, 서비스를 사용하는 것부터 시작합니다.
대신 실제 캐싱 시스템을 고려하십시오. 지역 여부 (memcache, 간단한 메모리 캐시 등). 또는 DB를 사용해야하는 경우 키/값 저장소를 사용하면 BDB가 잘 작동합니다. 응답 메시지를 직렬화 된 형식 (XML)으로 저장하고, 캐시에서 가져 오지 못하면 서비스에서 파싱을 시도하고 구문 분석합니다. 또는 편리하고 더 간단한 직렬화가있는 경우이를 저장하고 가져올 수 있습니다.
- 1. 어느 것이 xml을 구문 분석하기위한 성능이 더 좋습니까? XQuery 또는 xml을 프로그래밍 방식으로 구문 분석 하시겠습니까?
- 2. SQL 데이터베이스를 검색하는 것이 얼마나 효율적입니까?
- 3. 1MB 파일을 지속적으로 편집하는 것이 더 효율적입니까?
- 4. 하나의 쿼리가 많은 데이터를로드하는 것이 더 효율적입니까, 아니면 더 작은 청크를로드하는 여러 쿼리가 더 효율적입니까?
- 5. git 상태를 구문 분석하거나 gitsharp를 사용해야합니까?
- 6. PHP에서 XML을 구문 분석하는 것이 더 나은 방법은 무엇입니까?
- 7. +가 concat보다 더 효율적입니까?
- 8. XmlDocuments, XSLT 또는 Linq를 사용하여 Xml, XPath를 구문 분석하는 것이 더 효율적입니까?
- 9. 외부 웹 서버에서 내부 SQL 서버를 쿼리하는 경우 웹 서비스를 사용하는 것이 더 효율적입니까?
- 10. 입력을 T로 구문 분석하거나 매핑하기위한 일반 intrerface?
- 11. XML을 구문 분석 호기심 - "더 이상"속성
- 12. C# Data Collection v 데이터베이스 조회 - 어느 것이 더 효율적입니까?
- 13. 모든 레코드를 검사하는 것보다 명확하고 대체하는 것이 더 효율적입니까?
- 14. 캔버스로 이미지를 그리는 것이 브라우저에서 렌더링하는 것보다 더 효율적입니까?
- 15. mysql 데이터베이스에서 어떤 방법으로 권한을 저장하는 것이 더 효율적입니까?
- 16. 지도의지도 또는 매우 큰지도를 갖는 것이 더 효율적입니까?
- 17. 변경 사항을 파일로 보거나 중복으로 파일을 쿼리하는 것이 더 효율적입니까?
- 18. 텍스트를 파일 또는 DB에 저장하는 것이 더 효율적입니까?
- 19. 어떤 SQL 문이 조인 또는 존재하는 것이 더 효율적입니까?
- 20. Errno = 13 및 어떻게 디버깅하는 것이 더 효율적입니까?
- 21. Android - 어느 쪽이 더 효율적입니까?
- 22. XML을 한 번에 또는 비트 단위로로드하는 것이 더 빠릅니까?
- 23. 두 개의 쿼리가 더 효율적입니까?
- 24. 외부 XML을 AS3.0으로 사용
- 25. 화성을 사용하여 7000 행을 업데이트하는 것이 효율적입니까?
- 26. sendRedirect 또는 요청 배송이 더 효율적입니까?
- 27. C++ : 간단한 정규 표현식으로 구문 분석하거나 shoud로 sscanf를 사용합니까?
- 28. xml을 레일스에서 간단하게 읽거나 해시로 변환하는 것이 더 간단할까요?
- 29. 하드 코딩하는 것이 더 낫습니다, 아니면 외부 XML 파일에 두는 것이 더 좋습니까
- 30. 큰 주소 데이터베이스를 구성하는 것이 더 나은 방법은 무엇입니까?
질문을주의 깊게 읽었습니까? 기본 결과가 항상 외부 웹 서비스에서 오는 것처럼 들리므로 네트워크 중단은 이미 처리해야하는 항목입니다. 또한 문제의 웹 서비스가 클라이언트 호스트에 대한 것일 뿐이지 만 사물의 웅장한 구성표에서는 로컬 일 가능성이 높습니다. – StaxMan