2011-02-10 6 views
3

블로그를 읽었을 때 JMS의 컨텍스트에서 '대기열을 사용한다면 당신이 엉망입니다'라는 점 중 하나가 블로그를 읽었습니다.JMS Alternative

저는 JMS가 필요하다고 생각 했었습니까? 간단한 대안은 비동기 적으로해야 할 일이 있다면 어딘가에 테이블에 작업 요청을 넣는 것이 아니라 새로운 작업을 찾고있는 모든 X 시간 단위마다 db를 폴링 (polling)해야하는 이유는 무엇입니까?

이 방법은 이해하기 쉽고 기본적으로 응용 프로그램에서 종속성을 제거하는 JMS보다 간단합니다.

제가 설명한 대안을 사용하면 어떻게 될까요? 아마도 JMX를 사용하여 물건을 관리 할 수있는 가능성을 잃어 버렸지 만, 작업 '대기열'이 테이블에서 제외되면 처리를 관리하는 간단한 코드를 작성할 수 있습니다.

+5

이러한 접근 방식은 JMS보다 간단하게 들리지 않습니다. –

+0

@ kaleb, 아마도. JMS 접근법의 모든 부분을 대안으로 나란히 배치하는 것은 가치가있을 것입니다 ... – hvgotcodes

+1

어딘가에있는 테이블은 JMS와 마찬가지로 많은 의존성을 가지고 있습니다 – ChrisBlom

답변

2

내가 어디에서 읽었는지 정말 알고 싶습니다. JMS는 입증 된 기술이지만 모든 솔루션과 마찬가지로 오용 할 수도 있습니다. 작업을 예약해야하는 경우 많은 작업 예약 라이브러리 중 하나를 사용할 수 있습니다. 여기 개요입니다 : 내가 블로그를 읽고 있었다 http://java-source.net/open-source/job-schedulers

+0

여기를 읽으십시오 http://teddziuba.com/ – hvgotcodes

+1

확실히 Ted 모든 소비자/생산자 문제에 대해 JMS를 구형화하려는 시도가 있습니다. 태스크를 스케줄하기 만하면 JMS가 실제로 필요하지 않습니다. 그러나 '큐는 악이다'라고 말하는 것은 도발적입니다. –

+0

@jocen,이 기사에서 그는 덜 분석적입니다. 'http://teddziuba.com/2010/12/the-3-basic-tools-of-systems-engineering.html'대기열 검색 (언어 불량 경보) – hvgotcodes

3

하고 포인트 중 하나는 JMS의 맥락에서, '당신이 큐를 사용하는 경우, 당신이 엉망'입니다.

이것은 단순히 잘못된 것입니다.

큐가 적절하지 않을 때 큐를 사용하도록 선택하면 혼란 스럽지만 JMS 인 경우 좋은 선택입니다.

내가 너라면 인터넷에서 읽은 내용에 대해 더 분별력이 있습니다. 저자가 자신의 블로그를 자극하고 Google 애널리틱스 통계를 높이기 위해 선동적인 진술을 좋아하는 것처럼 나에게 들립니다. 그것은 한 사람의 의견입니다.

폴링 솔루션은 더 복잡하고 CPU 사이클을 낭비하며 실시간으로 볼 수 없습니다.

비동기 처리를 원하면 Executor 또는 FutureTask를 사용할 수 있습니다. asynch가 모두 필요한 경우 대기열에 대한 합리적인 대안이 될 것입니다.

+0

@duffymo, 나는 방금 대안을 생각하고 있었다. 나는 한 줄짜리 선언을 시스템을 설계 할 때 사용할 새로운 패러다임으로 받아들이지 않았다. 폴링 솔루션이 어떻게 더 복잡한 지 알지 못합니다. 그것의 SQL 조회. 아마 그것의 모든 JSP 기계를 덜 소모 cpu주기. – hvgotcodes

+0

하루 종일 5 분마다 폴링하고 표시 할 내용이없는 경우 메시지가 대기열에있을 때 해당 JMS 기계 만 작동하면 CPU 사이클을 덜 낭비 할 수 있습니까? JMS를 사용하는 대신 폴링 할 구실을 찾고있는 것 같습니다.계속해서 그렇게하십시오. – duffymo

+0

@duffymo, 전혀 아닙니다. Im 다만 그런 접근의 모든 찬성/반대를 통해 생각하는 것을 시도하는. 당신의 첫 번째 생각은 '그 바보 같은 생각'이라고 생각합니다. 그리고 나서 거기서부터는 분별력 있고 변명하는 것에 대해 냉담한 말을하고 싶습니다. 저를 믿으십시오. 저자가 '대기열을 사용한다면 당신은 엉망이됩니다.'라고 대답했을 때, 나의 첫 반응은 'whaaaaaaaat?'였습니다. - 그런 다음 그 아이디어에 기회를주고 싶었습니다. – hvgotcodes

0

매우 간단한 비동기 처리 요구 사항의 경우, java.util.concurrent 패키지의 적합한 클래스를 사용할 수 있습니다.

시스템 오류 (소프트웨어 또는 하드웨어 충돌)의 경우에도 제출 된 작업을 성공적으로 완료해야한다는 트랜잭션 또는 작업 처리가 필요하거나 작업 처리를 다른 프로세스로 오프로드하려는 경우 다른 해결책이 필요합니다 .

JMS 접근 방식은 비교적 적은 노력으로 매우 정교한 솔루션을 제공 할 수 있습니다.

메시징 (JMS)은 비동기 작업 제출을 유지하고 실제 처리에서 분리 된 작업 제출을 유지하는 문제를 해결할 수있는 매우 표준 통합 솔루션입니다. 메시징 기반 솔루션은 작업 대기열에서 청취하는 '작업 프로세서'스레드 수를 늘림으로써 쉽게 확장 할 수 있습니다. 트래픽은 자동으로로드 밸런싱됩니다. 메시징 시스템은 트랜잭션 지원을 제공 할 수도 있습니다. 즉, 작업 처리가 실패하여 재 시도 될 수있는 경우 자동으로 메시지를 대기열에 다시 넣을 수 있습니다.

많은 엔터프라이즈 통합 패턴은 메시징 시스템 (메시지 지향적 인 미들웨어)을 기반으로합니다. Enterprise Integration Patterns by Gregor Hohpe에 대한이 책에는 응용 프로그램에서 메시징을 사용하는 방법에 대한 가장 보편적 인 패턴이 있습니다. 작업 처리 중 작업의 행 상태를 업데이트 결국 처리 응용 프로그램 시작 때

데이터베이스 접근 방식은 '새로운 일자리'에 대한 테이블을 폴링 행의 상태를 업데이트

1)에 다른 프로세스가 필요합니다 '완료'(또는 테이블에서 작업을 모두 삭제). 2) 작업 처리 중에 문제가 발생하면 작업 상태를 테이블에서 '새'로 다시 변경해야하므로 '폴링'메커니즘이 작업을 다시 선택할 수 있습니다. 또한 시스템 시작시 '복구 스레드'를 작성하여 일관성없는 상태에있는 작업을 찾아서 '새'상태로 되돌려 처리를 다시 시작해야 할 필요성이 있습니다.

결론은 데이터베이스를 기반으로하는 통합 솔루션을 구축하는 데 많은 노력이 필요하다는 것입니다. 또한 '작업 제출자'및 '작업 프로세서'어플리케이션을 데이터베이스의 캡슐화를 깨는 데이터베이스 스키마와 긴밀하게 결합합니다. '작업 프로세서'에 다중 스레드가있는 경우 (규모를 조정하려면 필요할 것입니다) 하나의 스레드 만 작업을 선택하고 '그'행을 업데이트해야합니다.

JMS 솔루션은이 모든 로직을 직접 코딩하지 않아도이 문제를 매우 쉽게 해결합니다.

확실히 대기열을 사용하는 경우 엉망이 아닙니다. 그러나 메시징 미들웨어를 소개하는 데는 유효한 유스 케이스가 있어야합니다.

0

이 접근법은 JMS보다 간단하며 이해하기 쉽고 기본적으로 응용 프로그램에서 종속성을 제거합니다.

데이터베이스 배경에서 온 경우에만 해당됩니다. 나는 모든 국가 변화에 대한 메시지를 보내는 것보다 더 쉬운 것이 없다고 생각한다.

메시지 지향 미들웨어 (예 : JMS)의 장점 중 하나가 더 높은 성능입니다. 1Mms/초의 속도를 가질 수 있지만 대개 더 많은 이점은 여러 구성 요소가 연결된 메시지 버스입니다. 지금은 일대일 커뮤니케이션이 가능하지만 2 년 후에는 트래픽을 기록하고 3 년 후에는 오류를 모니터링하고 4 년 후에는 자동으로 기록 및 재생하고 테스트 할 수 있습니다.