아키텍처 결정 및 아티팩트

그러나 "먼저 작동하게 하고, 빠르게 만듭니다."라는 조언은 "아키텍처"에 대한 의사 결정에서 완전히 틀립니다. 아키텍처 결정이란 무엇입니까? 간단히 말해서, 그들은 비용이 많이 들고, 어렵고 그리고/또는 나중에 바꿀 수 없는 결정들이다. "비싼" 것은 때때로 "불가능한" 것과 같다는 것을 명심해라. 예를 들어 프로젝트에 예산이 부족하면 비싼 변경 사항을 구현할 수 없습니다. 에 대한 사회 기반 시설 변화는 대부분의 사람들이 떠올리는 그 범주의 첫 번째 변화입니다. 그러나 변화하기에 매우 불쾌해질 수 있는 또 다른 종류의 "건축적인" 유물도 있습니다.

  1. 다른 많은 부분이 사용하는 애플리케이션의 "중앙"에 있는 코드 조각. 이를 변경하려면 모든 종속성을 한 번에 변경하고 다시 테스트해야 합니다.

  2. 아티팩트는 입력이 매우 무작위로 달라질 수 있는 비동기 타이밍 종속 시나리오와 관련되어 있습니다. 변경 사항은 예측할 수 없는 영향을 미칠 수 있으며 테스트하기 어려울 수 있습니다.

  3. 시스템의 모든 부분 및 부분에서 반복적으로 사용되고 재사용되는 소프트웨어 패턴입니다. 소프트웨어 패턴이 최적 상태가 아닌 것으로 판명되면 패턴을 사용하는 모든 아티팩트를 다시 코딩해야 합니다.

기억나니? 이 페이지 맨 위에서 Dispatcher은 AEM 애플리케이션의 필수 부분이라고 말했습니다. 웹 애플리케이션에 대한 액세스는 매우 임의적입니다. 사용자가 예측할 수 없는 시간에 오고갑니다. 결국 - 모든 콘텐츠가 Dispatcher에서 캐시됩니다(또는 캐시되어야 함). 따라서 주의 깊게 살펴보았다면 캐싱이 "아키텍처" 아티팩트로 보일 수 있으므로 팀, 개발자 및 관리자 모두 이해해야 한다는 것을 깨달았을 것입니다.

개발자가 실제로 Dispatcher을 구성해야 한다는 것은 아닙니다. 개념(특히 경계)을 알고 있어야 Dispatcher에서도 코드를 활용할 수 있습니다.

Dispatcher은 코드의 속도를 마술처럼 향상시키지 않습니다. 개발자는 Dispatcher을 염두에 두고 구성 요소를 만들어야 합니다. 따라서, 그는 그것이 어떻게 작동하는지 알 필요가 있습니다.

Dispatcher 캐싱 - 기본 원칙

Dispatcher as 캐싱 Http - 로드 밸런서

Dispatcher은 무엇이며 왜 처음에 "Dispatcher"로 불립니까?

Dispatcher은

  • 가장 먼저 캐시

  • 역방향 프록시

  • Apache의 범용성에 AEM 관련 기능을 추가하고 다른 모든 Apache 모듈과 원활하게 작동하는 Apache httpd 웹 서버용 모듈입니다(예: SSL 또는 SSI에 다음에서 보는 바와 같이 포함됨)

웹 초기에는 사이트에 수백 명의 방문자가 있을 것으로 예상됩니다. 여러 AEM 게시 서버에 대한 요청 로드를 "디스패치됨" 또는 밸런싱한 Dispatcher 한 개의 설정이며 일반적으로 충분했습니다. 따라서 이름이 "Dispatcher"입니다. 그러나 최근에는 이 설정이 더 이상 자주 사용되지 않습니다.

Dispatcher 및 Publish 시스템을 설정하는 다양한 방법은 이 문서의 뒷부분에서 확인할 수 있습니다. 먼저 HTTP 캐싱의 기본 사항으로 시작하겠습니다.

Dispatcher 캐시의 기본 기능

Dispatcher 캐시의 기본 기능

Dispatcher의 기본 사항은 여기에 설명되어 있습니다. Dispatcher는 HTTP 요청을 수신하고 만드는 기능을 갖춘 간단한 캐싱 역방향 프록시입니다. 일반적인 요청/응답 주기는 다음과 같습니다.

  1. 사용자가 페이지를 요청합니다.
  2. Dispatcher은 이미 해당 페이지의 렌더링된 버전이 있는지 확인합니다. 이 페이지에 대한 첫 번째 요청이고 Dispatcher에서 로컬 캐시 복사본을 찾을 수 없다고 가정해 보겠습니다.
  3. Dispatcher이 Publish 시스템에서 페이지를 요청합니다
  4. Publish 시스템에서 페이지는 JSP 또는 HTL 템플릿에 의해 렌더링됩니다
  5. 페이지가 Dispatcher으로 반환됩니다
  6. Dispatcher이 페이지를 캐시합니다
  7. Dispatcher이 페이지를 브라우저에 반환합니다.
  8. 동일한 페이지를 두 번째로 요청하는 경우 Publish 인스턴스에서 다시 렌더링하지 않아도 Dispatcher 캐시에서 직접 제공할 수 있습니다. 이렇게 하면 Publish 인스턴스에서 사용자 및 CPU 사이클에 대한 대기 시간이 절약됩니다.

우리는 마지막 섹션에서 "페이지"에 대해 이야기하고 있었습니다. 그러나 이미지, CSS 파일, PDF 다운로드 등과 같은 다른 리소스에도 동일한 스키마가 적용됩니다.

데이터가 캐시되는 방법

Dispatcher 모듈은 호스팅 Apache 서버가 제공하는 기능을 활용합니다. HTML 페이지, 다운로드 및 그림과 같은 리소스는 Apache 파일 시스템에 간단한 파일로 저장됩니다. 그렇게 간단합니다.

파일 이름은 요청된 리소스의 URL에 의해 파생됩니다. /foo/bar.html 파일을 요청하면 /var/cache/docroot/foo/bar.html 아래에 저장됩니다.

원칙적으로 모든 파일이 캐시되어 Dispatcher에 정적으로 저장되는 경우 Publish 시스템의 플러그를 가져올 수 있으며 Dispatcher은 간단한 웹 서버 역할을 합니다. 하지만 이것은 단지 원리를 설명하기 위한 것이다. 실제 생활은 더 복잡하다. 모든 것을 캐시할 수는 없으며 렌더링 프로세스의 동적 특성으로 인해 리소스 수가 무한대가 될 수 있으므로 캐시가 완전히 "가득 참"인 것은 아닙니다. 정적 파일 시스템의 모델은 Dispatcher의 기능에 대한 대략적인 그림을 생성하는 데 도움이 됩니다. 또한 Dispatcher의 제한 사항을 설명하는 데 도움이 됩니다.

AEM URL 구조 및 파일 시스템 매핑

Dispatcher을 더 자세히 이해하기 위해 간단한 샘플 URL의 구조를 다시 살펴보겠습니다. 아래 예를 살펴보겠습니다.

http://domain.com/path/to/resource/pagename.selectors.html/path/suffix.ext?parameter=value&otherparameter=value#fragment

  • http은(는) 프로토콜을 나타냅니다.

  • domain.com은(는) 도메인 이름입니다.

  • path/to/resource은(는) 리소스가 CRX에 저장되고 이후에 Apache 서버의 파일 시스템에 저장되는 경로입니다.

여기서 AEM 파일 시스템과 Apache 파일 시스템 사이에는 약간의 차이가 있습니다.

AEM에서

  • pagename은(는) 리소스 레이블입니다.

  • selectors은(는) 리소스 렌더링 방법을 결정하기 위해 Sling에서 사용되는 여러 선택기를 의미합니다. URL에는 임의 개수의 선택기가 포함될 수 있습니다. 그것들은 일정 기간별로 분리되어 있다. 선택기 섹션은 예를 들어 "french.mobile.fancy"와 같은 것일 수 있습니다. 선택기에는 문자, 숫자 및 대시만 포함되어야 합니다.

  • "선택기"의 마지막 html을(를) 확장이라고 합니다. AEM/Sling에서는 렌더링 스크립트도 부분적으로 결정합니다.

  • path/suffix.ext은(는) URL의 접미사가 될 수 있는 경로와 유사한 표현식입니다. AEM 스크립트에서 리소스를 렌더링하는 방법을 추가로 제어할 수 있습니다. 이 부분에 대해서는 나중에 전체 섹션이 작성될 예정입니다. 지금은 추가 매개 변수로 사용할 수 있음을 알고 있으면 됩니다. 접미사에는 확장명이 있어야 합니다.

  • ?parameter=value&otherparameter=value은(는) URL의 쿼리 섹션입니다. 임의의 매개 변수를 AEM에 전달하는 데 사용됩니다. 매개 변수가 있는 URL은 캐시할 수 없으므로 매개 변수는 반드시 필요한 경우로 제한해야 합니다.

  • #fragment. URL의 조각 부분이 AEM으로 전달되지 않고 브라우저에서만 사용됩니다. JavaScript 프레임워크에서는 "라우팅 매개 변수"로 사용되거나 페이지의 특정 부분으로 이동합니다.

Apache(아래 다이어그램 참조)에서

  • pagename.selectors.html은(는) 캐시의 파일 시스템에서 파일 이름으로 사용됩니다.

URL에 path/suffix.ext 접미사가 있으면

  • pagename.selectors.html이(가) 폴더로 만들어졌습니다.

  • pagename.selectors.html 폴더의 폴더 path

  • suffix.ext은(는) path 폴더의 파일입니다. 참고: 접미사에 확장명이 없으면 파일이 캐시되지 않습니다.

Dispatcher에서 URL을 가져온 후 파일 시스템 레이아웃

Dispatcher에서 URL을 가져온 후 파일 시스템 레이아웃

기본 제한 사항

URL, 리소스 및 파일 이름 간의 매핑은 매우 간단합니다.

함정 몇 개를 알아차렸을 수도 있지만

  1. URL은 매우 길어질 수 있습니다. 로컬 파일 시스템에 /docroot의 "경로" 부분을 추가하면 일부 파일 시스템의 한도를 쉽게 초과할 수 있습니다. Windows에서 NTFS로 Dispatcher을 실행하는 것은 어려운 문제가 될 수 있습니다. 그러나 Linux를 사용하면 안전합니다.

  2. URL에는 특수 문자와 움라우트가 포함될 수 있습니다. 이는 일반적으로 Dispatcher의 문제가 아닙니다. 그러나 URL은 애플리케이션의 여러 위치에서 해석된다는 점을 염두에 두십시오. 거의 사용되지 않는(사용자 지정) 코드 한 개가 특수 문자에 대해 완전히 테스트되지 않았다는 사실을 확인하기 위해 애플리케이션의 이상한 동작을 자주 목격했습니다. 할 수 있으면 피해야 합니다. 그리고 당신이 할 수 없다면, 철저한 테스트를 위해 계획하십시오.

  3. CRX에서 리소스에는 하위 리소스가 있습니다. 예를 들어 페이지에 여러 개의 하위 페이지가 있습니다. 파일 시스템에 파일 또는 폴더가 있으므로 파일 시스템에서 이 항목을 일치시킬 수 없습니다.

확장명이 없는 URL은 캐시되지 않음

URL에는 항상 확장명이 있어야 합니다. AEM에서 확장 없이 URL을 제공할 수 있지만, 이러한 URL은 Dispatcher에서 캐시되지 않습니다.

http://domain.com/home.html은(는) 캐시 가능 ​입니다.

http://domain.com/home이(가) 캐시 불가능

URL에 접미사가 포함된 경우에도 동일한 규칙이 적용됩니다. 접미사를 사용하려면 확장명이 있어야 합니다.

http://domain.com/home.html/path/suffix.html은(는) 캐시 가능 ​입니다.

http://domain.com/home.html/path/suffix이(가) 캐시 불가능

리소스 부분에 확장명이 없지만 접미사에 확장명이 있으면 어떻게 되는지 궁금할 수 있습니다. 음, 이 경우 URL에는 접미사가 전혀 없습니다. 다음 예를 살펴보십시오.

http://domain.com/home/path/suffix.ext

/home/path/suffix은(는) 리소스의 경로이므로 URL에 접미사가 없습니다.

결론

항상 경로와 접미사 모두에 확장을 추가합니다. SEO를 알고 있는 사람들은 검색 결과에서 순위가 매겨진다고 주장하기도 합니다. 그러나 캐시되지 않은 페이지는 매우 느리고 훨씬 더 낮은 순위를 갖습니다.

충돌하는 접미사 URL

유효한 URL이 두 개 있다고 가정합니다.

http://domain.com/home.html

http://domain.com/home.html/suffix.html

AEM에서 절대적으로 유효합니다. 로컬 개발 시스템에는 Dispatcher이 없으면 문제가 발생하지 않습니다. 또한 UAT 또는 로드 테스트에서도 문제가 발생하지 않을 가능성이 높습니다. 우리가 직면한 문제는 너무 미묘해서 대부분의 시험을 통과했다. 피크 타임에 있고 해결할 시간이 제한되어 있고 서버 액세스 권한 또는 이를 수정할 리소스가 없을 때 이 문제가 사용자에게 매우 큰 영향을 미칩니다. 우리는 그곳에 갔다…

그래서… 뭐가 문제야?

파일 시스템의 home.html은(는) 파일이나 폴더일 수 있습니다. AEM에서와 동시에 둘 다 실행할 수는 없습니다.

먼저 home.html을(를) 요청하면 파일로 만들어집니다.

home.html/suffix.html에 대한 후속 요청에서 유효한 결과를 반환하지만 home.html 파일이 파일 시스템의 위치를 "차단"하므로 home.html을(를) 폴더로 두 번 만들 수 없으므로 home.html/suffix.html이(가) 캐시되지 않습니다.

파일 시스템의 파일 차단 위치로 인해 하위 리소스가 캐시되지 않음

파일 시스템의 파일 차단 위치로 인해 하위 리소스가 캐시되지 않음

반대로 수행하는 경우 먼저 home.html/suffix.html을(를) 요청하면 suffix.html이(가) /home.html 폴더 아래에 먼저 캐시됩니다. 그러나 이후에 home.html을(를) 리소스로 요청하면 이 폴더가 삭제되고 home.html 파일로 대체됩니다.

부모를 리소스로 가져올 때 경로 구조를 삭제하는 중

부모를 리소스로 가져올 때 경로 구조를 삭제하는 중

따라서 캐시된 사항의 결과는 전적으로 임의적이며 수신 요청의 순서에 따라 달라집니다. 문제를 더 까다롭게 하는 것은 일반적으로 디스패처가 두 개 이상 있다는 사실입니다. 또한 성능, 캐시 적중률 및 동작은 Dispatcher 간에 서로 다를 수 있습니다. 웹 사이트가 응답하지 않는 이유를 알아보려면 잘못된 캐싱 순서가 있는 올바른 Dispatcher을 보고 있는지 확인해야 합니다. 운이 좋게도 더 유리한 요청 패턴이 있었던 Dispatcher을 보면, 문제를 찾으려고 시도하다 보면 길을 잃게 될 것이다.