2012-03-20 2 views
4

최근에는 핫 전개 기능이있는 얼랑 (Erlang)에 관한 책을 읽었습니다. 시스템을 중단하지 않고도 배포를 수행 할 수 있습니다. 모든 기존 요청은 이전 버전의 코드에 의해 처리되며 배포 후 모든 새 요청은 새 코드에 의해 제공됩니다. 이 경우, 런타임에서 모든 이전 요청이 제공 될 때까지 두 버전의 코드를 사용할 수 있습니다. Java에서 2 가지 버전의 jar 파일을 유지할 수있는 방법이 있습니까? 어떤 app/web 서버가 이것을 지원합니까?자바 - 핫 전개

+0

프로덕션 환경에서 조언을 받았는지 모르겠지만 Tomcat이 1을 지원한다고 생각합니다. – cdeszaq

+0

클러스터 된 환경에서 Glassfish/Websphere/Weblogic과 같은 대부분의 Java 응용 프로그램 서버에서이 작업을 수행 할 수 있습니다. –

+1

JBoss도 이것을 지원합니다. 그러나 그것이 바람직 할 지 여부는 논쟁의 여지가 있습니다. – mcfinnigan

답변

1

Java 세계에서 뜨거운 배포를 수행하는 방법은 여러 가지가 있으므로, 상황과 구현하려는 내용을 조금 더 구체적으로 설명해야합니다. 여기

은 좋은 리드/옵션을 고려해야 할 :

  • OSGi
  • Clojure 런타임 상호 작용을 많이 할 수있는 동적 JVM 언어입니다 핫 배포를 지원하는 범용 모듈 시스템이다. Clojure는 종종 "실시간 코딩"에 사용됩니다. 런타임시 핫 스왑 및 재 정의가 가능한 것은 거의 없습니다. Clojure는 불변성과 동시성에 중점을 둔 함수 언어이므로 얼얼 (Erlang)과 몇 가지 흥미로운 점이있다. Clojure는 웹 스레 버 코드를 핫 스왑하는데 적합한 Noir과 같은 아주 멋진 웹 프레임 워크를 가지고 있습니다.
  • Play Framework은 생산성상의 이유로 (웹 서버 재시작을 피하기 위해) 핫 스와핑 코드를 사용하도록 설계되었습니다. 주로 핫 스와핑 웹 응용 프로그램을보고있는 경우 관련성이 있습니다.
  • JBoss과 같은 대부분의 Java 응용 프로그램 서버는 웹 응용 프로그램에 대한 몇 가지 형태의 핫 스와핑을 지원합니다.
1

기술적으로이 작업을 직접 수행 할 수 있습니다. 그것이 빨리 복잡해질 수 있기 때문에, 나는 그것을 추천하지 않겠지 만. 그러나 클래스 로더를 만들고 클래스의 새 버전을로드 할 수 있다는 아이디어가 있습니다. 그런 다음 실행중인 코드가 새 ClassLoader에 대해 알고 있는지 확인하십시오.

JBoss를 사용하고 jar 및 war를 다시 배포하는 것이 좋습니다. 멋지고 간단합니다.

어느 경우 든 몇 가지 재배포 후에 PermGen 공간이 부족하기 때문에 메모리 누출이 없는지 확인해야합니다.

4

개발을 가속화하려는 경우 JRebel은 이러한 목적을위한 도구입니다. 그러나 프로덕션 시스템을 패치하는 데는 사용하지 않는 것이 좋습니다.

JRebel은 클래스 파일이 변경 될 때마다이를 감지하고 이전 상태를 버리지 않고 실행중인 응용 프로그램 서버로 다시로드합니다. 전체 초기화 프로세스를 재실행해야하는 전체 전쟁/귀를 재배포 할 때 대부분의 응용 프로그램이 수행하는 작업에 비해 훨씬 빠릅니다.

+0

라이센스는 생산 시스템에서 JRebel의 사용을 금지합니다 –

+0

은 금지합니까 ??? 나는 왜 ...? –

+0

JRebel은 개발 도구입니다. 프로덕션을 위해 LiveRebel (http://liverebel.com) –

2

프로덕션 응용 프로그램에서 최신 업데이트를하는 유일한 이유는 사용자에게 중단 시간을 제공하지 않기위한 것입니다.

LiveRebel (JRebel 기준)은 Jenkins와 함께 사용할 수있는 도구입니다. 프로덕션 클러스터에서 세션을 소모하는 동안 안전한 핫 패칭과 롤링 재시작을 수행 할 수 있습니다.

0

도구 상자에 RelProxy을 추가하면 RelProxy는 Java (및 Groovy)의 프로덕션 환경에서의 개선을위한 핫 클래스 리로드로 한 가지 중요한 제한 사항이 있습니다. 다시로드는 코드의 하위 집합에서만 가능합니다.