무엇이 디자인 패턴은 대부분의 레버리지를 만드는 고용 응용 프로그램은 무엇입니까?[마감]

StackOverflow https://stackoverflow.com/questions/814742

문제

마찬가지로 있는 디자인 패턴을 피해야 하는?

도움이 되었습니까?

해결책

나는 가정을 쓰는 서버 종류 응용 프로그램(떠날 수 있습 Web apps 는 몇 가지 좋은 선반 솔루션을 도울 수 있는,그래서 거기에서 찾을 수 있습니다"나는 이러한 새로운 유형의 서버가 쓰는"하지만,나는 그것을 HA 문제).

에서 서버를 구현한 클라이언트의 요청을 일반적으로(에서 어떤 형태 또는 다른)로 변환하여부 이벤트 또는 명령 유형 패턴,그리고 다음에서 실행되는 하나 이상의 큐습니다.

그래서 먼저 문제를 저장해야 하는 이벤트/에서 명령하는 방식으로 살아남을 것입니다에서 클러스터(ie.새로운 노드 이상으로 마스터,그것은 외모에서 다음 명령을 필요로 하는 실행하기 시작).

시작할 수 있습니다 하나의 스레드 서버 impl(는 가장 쉬운-와 개념을 적용하여 멀티 스레드 그러나 그는 자신의 설정의 issues0.명령의 경우에는 처리에 필요 어떤 종류의 트랜잭션 처리 등이 있습니다.

또 다른 관심사 관리 부작용을 어떻게 처리의 실패는 현재 명령?가능,처리 측면에서 효과 트랜잭션으로,그래서 그들은 모든 아무것도 아니다.ie.이 명령에 상태가 변경 변수,그러나 충돌을 절반 방법을 통해 실행,수로 돌아가'이전'상태가 좋습니다.이것은 새로운 주인 노드를 다시 시작으로 추락한 명령을 다시 명령을 실행합니다.는 좋은 방법이 다시 깨고 부작용으로 작업할 수 있는 다시는 모든 노드에서 실행.ie.저장소의 주요 요청 시작과 끝 작업으로,많은 작은 작업을 처리하는 말로만 한쪽 효과 당 작업입니다.

이것은 또한 도입 다른 문제는 것이 효과 당신의 디자인이다.그 상태 변수는 반드시 데이터베이스의 업데이트됩니다.그들이 공유될 수 있습니다 상태(말한적 상태계에 대한 내부 구성 요소)는 배포될 클러스터에 있습니다.그래서 패턴을 관리하는 변화는 마스터 코드를 참조해야한다는 일관된 버전의 상태,그것은 필요와 다음에 투입되는 상태에서 클러스터입니다.를 사용하여 어떤 형태로의 변경할 수 없(적어도 마스터에서 실을 하는 업데이트)데이터 저장이 유용합니다.ie.모든 업데이트가 효과적으로 수행에 새로운 복사본을 통해 어떤 종류의 중재자 또는 외관만이 업데이트를 로컬에서 메모리 사본으로 업데이트한 후 업데이트에서 클러스터(또는 최소한의 구성원에서 클러스터에 대한 데이터를 일관성).

이러한 문제의 일부는 또한 현재에 대한 마스터 작업자는 시스템입니다.

또한 필요 오류가 좋은 관리수의 것을 갈 수 있는 잘못된 상태에서 업데이트를 증가(당신이 이제 네트워크는 참여하).

나는 상태를 사용 패턴을 많이합니다.대신 하나인데,부작용을 위해 당신에 보내려는 요청/응답을 사용하고,대화가 특정의 fsm 을서 진행 상황을 확인할 수 있습니다.

또 다른 문제는 표현의 엔드 포인트입니다.ie.클라이언트가 연결한 마스터하는 노드가 필요할 수 있 다시 연결하는 새로운 마음을 듣고에 대한 결과는?또는 당신은 단순히 취소하는 모든 보류 중인 결과와 클라이언트가 다시 전송?도록 허용하는 경우 보류 중인 요청을 처리할 수 있는 좋은 방법이 확인 끝점(고객)이 필요로(즉,.어떤 종류의 클라이언트 id 조회에서).

또한 정리해야 하는 코드 등(ie.원하지 않는 데이터 기다리고 있는 클라이언트가 연결을 기다리는 영원히).

많이 큐로 사용됩니다.많은 사람들이 따라서 일부를 사용하여 메시지 버스(jms 말 java)를 밀어는 이벤트에 트랜잭션 방식이다.

테라코타(다 java)를 해결의 많은 이 당신을 위해-그냥 업데이트 메모리 테라코타이 당신의 정면/중재자니다 여기에.그들은 그냥 주는 측면에 대한 귀하의.

테라코타(난 그들을 위해 일)-의 개념을 소개하"슈퍼 static",그래서 당신은 이러한 클러스터의 넓은 싱글는 멋지다,하지만 당신은 단지 알고 있어야 이것이 어떻게 영향을 것입 테스트 및 개발 워크플로우-ie.많이 사용 조성물,대신 상속의 구체적인 구현을 위한 좋은 재사용할 수 있습니다.

웹 애플리케이션에 대한 좋은 응용 프로그램 서버 도움이 될 수 있습 세션 변수를 복제하고 좋은 부하를 분산을 작동합니다.에 someways 사용하여 이를 통해 나머지(또는 웹서비스 방법의 선택)은 쉬운 방법을 쓰는 멀티-스레드 서비스입니다.그러나 성능에 영향을 줍니다.다시 따라 달라집에서 당신의 문제는 도메인입니다.

메시지를 제공합(말 jms)자주 사용을 소개하는 느슨한 카플링 사이의 다양한 서비스.로 괜찮은 메시지는 서버를 많이 할 수 있습니다 msg 라우(다시 아파치 카멜 또는 유사한 일)ie.말 끈끈한 소비자에 대하여 클러스터의 jms 생산자들 등등.는 허용할 수도 있에 대한 좋은 페일오버가 가능합니다.Jms 큐의 등을 제공할 수 있는 간단한 방법을 배포하 cmds 에서 클러스터,indept 의 마스터/슬레이브.(다시 그에 따라 달라 하는 경우에 당신은 로브 또는 쓰 server/제품 처음부터).

(이 나이 깔끔하고,어쩌면 좀 더 넣어 세부 사항에서 맞춤법을 수정 문법 등)

다른 팁

신뢰할 수있는 소프트웨어 생성에 대한 한 가지 방법은입니다 충돌 전용 소프트웨어:

충돌 전용 소프트웨어는 안전하게 충돌하고 빠르게 복구하는 소프트웨어입니다. 그것을 막는 유일한 방법은 그것을 충돌시키는 것입니다. 시작하는 유일한 방법은 회복하는 것입니다. 충돌 전용 시스템은 재 시정 가능한 요청과 통신하는 충돌 전용 구성 요소로 구성됩니다. 결함은 결함이있는 구성 요소를 충돌시키고 다시 시작하고 시간이 초과 된 요청을 다시 시도하여 처리됩니다. Crash Recovery는 사후 생각이 아닌 개발 과정에서 일류 시민이기 때문에 결과 시스템은 종종 더 강력하고 신뢰할 수 있으며 명시 적 종료를 위해 더 이상 추가 코드 (및 관련 인터페이스 및 버그)가 필요하지 않습니다. 모든 소프트웨어는 안전하게 충돌하고 빠르게 복구 할 수 있어야하지만 충돌 전용 소프트웨어는 이러한 특성을 가져야합니다.

읽는 것이 좋습니다 릴리스 해요! Michael Nygard. 그는 생산 시스템에 영향을 미치는 많은 패턴과 패턴이 하나의 잘못된 구성 요소가 전체 시스템을 중단하지 못하게하는 패턴을 간략하게 설명합니다. 이 책은 세 가지 주요 영역을 다룹니다. 안정성, 용량 및 일반 설계 (네트워킹, 보안, 가용성 및 관리 커버).

나의 이전 직장은 거의 모든 단일 실패 시나리오 Nygard 개요 (각각의 중단에 대한 수익 손실)에 의해 물린 (한 번에)에 물렸다. 그가 제안한 일부 기술과 패턴을 구현하면 훨씬 더 안정적이고 예측 가능한 시스템이 생성되었습니다 (예,이 책은 약간의 Java 중심이지만 원칙은 많은 상황에서 적용 할 수 있습니다).

잘못된:

... 그리고 스토리지 서버가 있습니다

좋은:

... 그리고 그 앞에 (다중)로드 밸런서가있는 (다중) 스토리지 서버의 팜이 있습니다.

  • 로드 밸런서를 모든 것 앞에 두십시오. 지금은 4 개의 백엔드를 가질 수 있지만 앞으로 400 개를 가질 수 있으므로 백엔드를 사용하는 모든 앱이 아니라 LB에서만 관리하는 것이 좋습니다.

  • 여러 레벨의 캐시를 사용하십시오.

  • 속도를 높이기위한 인기있는 솔루션을 찾으십시오 (예 : Memcached).

  • 시스템을 갱신하려면 여러 가지 작은 단계로 부분별로 수행하십시오. 하나의 큰 단계에서 그것을한다면 (오래된 단계를 끄고, 새 것을 켜고 새로운 것을 켜고기도하면) 아마도 실패 할 것입니다.

  • 물건에 DNS 이름을 사용하십시오 storage-lb.servicename 모든 스토리지로드 밸런서의 주소로 해결됩니다. 하나를 추가하려면 DNS를 수정하면 모든 서비스가 자동으로 사용하기 시작합니다.

  • 간단하게 유지하십시오. 더 많은 시스템에 의존할수록 서비스가 더 많이 고통받을 것입니다.

고 가용성 (HA) 시스템 설계는 적극적인 연구 개발 영역입니다. ACM 또는 IEEE를 보면 서비스 품질 (가용성, 신뢰성, 확장 성 등) 및이를 달성하는 방법 (느슨한 커플 링, 적응 등)에 대한 연구 논문이 많이 있습니다. 실제 애플리케이션을 더 많이 찾고 있다면 클러스터링, 그리드 또는 클라우드 기능과 같은 클라우드를 허용하도록 구축 된 결함 허용 시스템 및 미들웨어를 살펴보십시오.

복제 및로드 밸런싱 (일명 리버스 프록시)은 HA 시스템을 달성하는 가장 일반적인 패턴 중 일부이며, 너무 단단히 결합되지 않았다고 가정하면 기본 소프트웨어를 코드 변경하지 않고 종종 수행 할 수 있습니다. 최근의 많은 클라우드 제품조차도 복제 및로드 밸런싱을 통해 본질적으로 달성되지만 광범위한 시스템 수요를 처리하기 위해 탄력성을 쌓는 경향이 있습니다.

상태 자체가 소프트웨어 구성 요소와 함께 복제 할 필요가 없기 때문에 소프트웨어 구성 요소를 무국적으로 만들면 복제의 부담이 완화됩니다. 무국적은 HTTP가 잘 늘어나는 주요 이유 중 하나이지만 종종 응용 프로그램이 자체 상태 (예 : 세션)를 추가 해야하는 경우 복제해야합니다.

따라서 밀접하게 결합 된 시스템보다 느슨하게 결합 된 시스템을 고도로 이용할 수있게하는 것이 더 쉽습니다. 시스템 구성 요소의 신뢰성은 전체 시스템 신뢰성을 결정하므로 신뢰할 수없는 구성 요소를 교체해야 할 수도 있습니다 (하드웨어 장애, 소프트웨어 버그 등). 런타임에서 동적 적응을 허용하면 이러한 실패한 구성 요소가 전체 시스템의 가용성에 영향을 미치지 않고 교체 할 수 있습니다. 느슨한 커플 링은 발신자와 수신기를 동시에 사용할 필요가 없지만 시스템 자체를 사용할 수있는 신뢰할 수있는 메시징 시스템을 사용하는 또 다른 이유입니다.

내가 알고있는 것처럼,당신이 찾고있는 특정 패턴에 사용하 java 응용 프로그램의 일부 HA 공합니다.물론 있는 수많은 패턴과 모범 사례 사용할 수 있는지만,이들은 정말로"하 패턴은".오히려,그들은 좋은 아이디어에서 활용할 수 있는 manys contexts.

내가 무슨 말 하려고 이:사용 가능성이 높은 건물로 구성되어 수많은 작은 부분입니다.우리가 하나를 선택의 이러한 작은 부분에 검토하고,그들을 우리는 아마도 찾을 수 없다는 마법의 하 특성을 이 작은 구성 요소입니다.만약 우리 모두 검사하여 다른 구성 요소리 같은를 찾을 것입니다.그 때 그들은 결합된 지능적인 방식으로 있길이 될 HA 응용 프로그램.

HA 응용 프로그램은 응용 프로그램을 계획하는 최악의 시작부터.만약 당신이 이제까지의 관점에서 생각"이 구성 요소가 그렇게 안정적인되지 않는 추가로 필요한 중복을 위해 그것을"그건 아마 HA 공합니다.후에도,그것은 쉬운 문제를 처리하기 위하여하는 시나리오를 예견합니다.그것은 하나 놀라움을 제공합니다.

에도 불구하고 모든 이가 있는 패턴을에 특히 유용 HA contexts.많은 그들의에 설명되어 있는 클래식 예약 "패턴은 기업의 애플리케이션 아키텍처" Martin Fowler.

나는 해석하고있다 "고 가용성" 처럼 "제로 다운 타임"`, 다른 SE 질문에 따라 구현할 수 있습니다.

Java Apps의 제로 다운 타임 배포

  1. A/B 스위치 : (롤링 업그레이드 + 폴백 메커니즘)
  2. 병렬 배포 - Apache Tomcat : (웹 응용 프로그램 만)
  3. 지연된 포트 바인딩
  4. 고급 포트 바인딩

이러한 개념 중 일부를 사용하여 소프트웨어 관점에서 고 가용성 시스템을위한 설계 패턴을 제시 할 것입니다.

사용할 패턴 :

대리/공장 :

프록시 객체가 있고 프록시는 요청을 리디렉션 할 위치를 결정합니다. 소프트웨어의 버전 1 및 버전 2가 있다고 가정하십시오. 클라이언트가 이전 프로토콜과 연결하는 경우 버전 1 소프트웨어로 리디렉션하십시오. 신규 고객은 버전 2에 직접 연결할 수 있습니다. 프록시는 새 버전의 소프트웨어를 렌더링하기 위해 공장 방법이나 추상적 인 요소를 가질 수 있습니다.

전략

알고리즘 패밀리에서 하나의 알고리즘을 선택하여 실행 시간에 알고리즘을 변경할 수 있습니다. 항공사의 예를 들어 보면 비 피크 및 피크 트래픽 동안 할인 혜택과 정상 페어 알고리즘을 전환 할 수 있습니다.

데코레이터:

실행 시간에 객체의 동작을 변경할 수 있습니다. 새로운 수업을 추가하고 추가 책임을 장식하십시오.

어댑터:

버전 1과 버전 2 사이에 인터페이스 또는 계약을 변경할 때 유용합니다. 어댑터는 구식 및 신규 클라이언트 요청에 적절하게 응답합니다.

일반 지침:

  1. 물체 사이의 느슨한 커플 링
  2. 따르다 단단한 응용 프로그램의 원칙

인용하다 사워 메이킹 더 나은 이해를위한 위의 패턴에 대한 웹 사이트 기사.

사용하지 않는 것 :

디자인 패턴 외에도 애플리케이션에 대한 다운 타임이 제로 가동을 얻으려면 몇 가지 예방 조치를 취해야합니다.

  1. 시스템에 단일 고장 지점을 소개하지 마십시오.
  2. 분산 캐시 (예 : 테라코타) /잠금 장치를 드물게 사용하십시오.
  3. 서비스 간의 하드 커플 링을 제거하십시오. 메시징 버스/ 프레임 워크 (JMS, ActiveMQ 등)를 사용하여 서비스간에 단단한 커플 링을 제거하십시오.

고가용성에 대한 자세한 하드웨어 가용성과 중복성보다는 코딩에 대해 있습니다.몇 가지가 있는 패턴을 사용하는 것이 거의 모든 하는 경우:나는 선택 단일 패턴 한 데이터베이스를 개체 및 사용 공장 패턴 을 만들 singleton.공장할 수 있는 다음을 처리하기 위한 논리성 문제 데이터베이스(어느 곳이 대부분 가용성 문제 발생).예를 들어,마스터는 아래로 연결한 다음 두 번째 마스터는 모두에 대해 읽기 및 쓰기를 할 때까지 마스터입니다.내가 알지 못하는 경우에 이들은 대부분 활용해 패턴 있지만,그들은 대부분의 레버리지에서는 나의 코드입니다.

물론 이 논리는 처리할 수 있에__구성하는 방법이지만,공장 패턴을 할 수 있도록 더 나은 제어 코드 및 의사 결정의 논리를 처리하는 방법은 데이터베이스 연결 문제 등이 있습니다.공장할 수 있습니다 또한 것입를 더 효율적으로 처리하기 위한 단일 패턴이다.

나는 절대적으로 피 장식 패턴, 고 관 패턴.그들은 모두를 만들이 복잡는 코드에서는 이를 유지 관리하기가 어렵습니다.들이 있는 경우 이러한 최고의 선택을 위해,당신의 요구 하지만 대부분의 시간을 그들은하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top