2010-04-07 2 views
18

동일한 물리적 컴퓨터에있을 수있는 JVM 간의 마스터 - 슬레이브 통신이 필요한 Java 응용 프로그램을 만들고 있습니다. Java EE 응용 프로그램 서버 (예 : JBoss) 내부에서 실행되는 "마스터"서버가 "슬레이브"클라이언트에 연결되어 통신을 위해 동적으로 등록됩니다 (즉 마스터는 해당 서버의 IP 주소/포트를 알지 못합니다). 노예는 미리 구성 할 수 없습니다). 마스터 서버는 슬레이브로 작업을 수행 할 컨트롤러 역할을하며 슬레이브는 주기적으로 알림으로 응답하므로 양방향 통신이 가능합니다.Java 기반의 마스터 - 슬레이브 통신 메커니즘은 무엇입니까?

원래 각 측이 서버가 될 RPC 기반 시스템을 생각했지만 복잡 할 수 있으므로 개방형 소켓이있는 메커니즘을 선호하며 앞뒤로 이야기합니다.

메시지가 대부분 기본 유형이기 때문에 대기 시간이 짧은 통신 메커니즘을 찾고 있으므로 심각한 직렬화가 필요하지 않습니다.

  • JMS

    • RMI : 내장 된 자바의 "노예"클라이언트가 애플리케이션 서버의 기존 ConnectionFactory를 연결할 것 여기에 내가 검토 한 것입니다.
    • JAX-WS/RS : 마스터와 슬레이브 모두 양방향 통신을 위해 RPC 인터페이스를 제공하는 서버입니다.
    • JGroups/Hazelcast : 공유 분산 데이터 구조를 사용하여 통신을 용이하게합니다.
    • Memcached/MongoDB : 클라이언트가 폴링해야 대기 시간이 생길 수 있지만 통신을 용이하게하기 위해이를 "대기열"로 사용하십시오.
    • 드리프트 : 이것은 영구 연결을 유지하는 것처럼 보인다, 그러나 /는
    • 웹 소켓/원자재 소켓이 보스로 드리프트 서버 포함 통합하는 방법을 잘 : 이것은 일 것이다, 그러나 더 많은 사용자 정의 코드를 필요로 나보다이 좋겠 처럼.

    누락 된 기술이 있습니까?

    편집 :

    • JMX : 또한 바라 보았다 클라이언트가 JBoss의 'JMX 서버에 연결하고 양방향 COMMS에 대한 JMX 알림을받을 수 있나요.
  • +3

    두 앱과 SafeWord 프로토콜 둘레에 가죽 또는 PVC 층이 필요하다고 상상해보십시오. – FrustratedWithFormsDesigner

    답변

    0

    우리는 비슷한 응용 프로그램을 가지고 있으며, 우리는 JBoss에서 서블릿을 사용하여 "슬레이브"가 타이머 구동 방식으로 타격을가했습니다. 이것은 괜찮지 만 낮은 대기 시간에는 최적이 아닙니다.

    이제 Netty를 살펴보고 있습니다. 사용할 프로토콜은 무엇이든 사용할 수 있습니다. 아마도 HTTP와 JAXB를 사용할 것입니다. 나는 이것이 "WebSocket/Raw Socket"으로 분류 될 수 있다고 생각하지만, 원시 소켓을 사용하는 것보다 훨씬 낫습니다.

    0

    Activatable을 살펴볼 수 있습니다. 작업이 완료되었을 때 슬레이브가 응답하면 rmi와 Activatable은이 경우에 좋은 해결책이 될 수 있습니다. 컨트롤러에서 rmiregistry를 사용하면 모든 슬레이브가 컨트롤러에 쉽게 등록 할 수 있으며 필요한 경우 활성화 될 수 있습니다.

    +0

    그건 재미있어 보이네. 필자는 Java RMI를 많이 사용하지 않았으므로이 기능을 인식하지 못했습니다. –

    3

    두 더 많은 옵션 :

    사육사 (http://hadoop.apache.org/zookeeper/는) 그것을 사용하지만, 여기에 적절한 소리를하지 않았습니다. RabbitMQ (http://www.rabbitmq.com/) 대기 시간이 짧은 메시지 대기열입니다. 여기에는 많은 유연성이 있습니다.

    +0

    사육사는 완벽하게 들어 맞는 것처럼 보이지만 그 정도의 능력이 필요한 것은 확실하지 않습니다. 나는 주말에 그것을 가지고 놀아야 할 수도 있습니다. –

    4

    솔직히 말해서, 저는 JMS를 고수 할 것입니다. 슬레이브가 메시지를 보낼 수있는 하나의 큐와 큐에 하나의 큐가 있습니다. 봉투에서 각 메시지를 처리 ​​한 사람 (계정 용)에 대한 등록 정보를 설정할 수 있습니다. 많은 J2EE 제공 업체 (glassfish, jboss)와 함께 지속성을 확보 할 수 있습니다.

    더하기 프로그래밍없이 다중 서버 분산 JVM으로 쉽게 이동할 수 있습니다.

    그러나 경우에 따라 "저 대기 시간"의 정의에 맞지 않을 수 있습니다.

    +0

    나는 JMS가 충분히 낮은 대기 시간이라고 생각한다. 이것은 어떤 스트레칭으로도 실시간 시스템이 아니지만,> 1 초 타이머를 사용하여 폴링하는 가상 대기열에서 벗어나고 싶었습니다. 이것은 내 원래의 생각이었습니다. 그러나 나는 거기에있는 모든 멋진 기술들에 의해 유혹되었습니다. –

    +0

    이것이 최선의 선택입니다. 요구 사항이 맞는지는 모르지만 마스터 작업 항목이 JMS로 보장되는 하나의 슬레이브로 이동하는 각 작업 항목을 얻는 지 여부는 확실하지 않습니다. – sMoZely

    5

    Java를 기반으로하는 무언가를 찾고 있다면 JMS를 제안합니다. 그것은 당신이 찾고있는 모든 기능과 JBoss와 같은 강력한 응용 프로그램 서버를 가지고 있습니다. 그러나 완전히 java 기반이 아니며 대기열을 사용하지 않는 또 다른 옵션은 HTTP 프로토콜과 JAXB (RESTful 웹 서비스)를 사용하는 것입니다. 이것은 양측 간의 의사 소통의 매우 가벼운 방법입니다. 여러분의 객체는 JAXB를 사용하여 XML로 변형되고 다른 측면으로 전송 될 것이고 객체를 받으면 그것을 객체로 다시 캐스트 할 것입니다.

    1

    Mule도 확인할 수 있습니다. 나는 그것이 당신의 문제에 대한 완벽한 해결책이라고 느낀다.

    3

    성능을 찾고 있고 두 응용 프로그램이 모두 자바가되어 방화벽을 사용하지 않으면 즉시 모든 XML 기반 프로토콜을 제외 할 수 있습니다. 통신이 동기 인 경우 (마스터가 작업을 완료하기 위해 슬레이브를 기다리는 경우) RMI를 사용하고, 그렇지 않으면 JMS를 사용하십시오. 성능을 최대화하기 위해 TCP를 직접 사용할 수도 있습니다. 동일한 메시지를 수신하는 슬레이브가 많은 경우 JGroups 또는 Spread (빠르지 만 100 % Java가 아님)와 같은 그룹 통신 툴킷을 조사 할 수 있습니다. 궁극적으로 다른 사람들이 이미 빌드하려는 것을 빌드했을 수 있습니다. Gridgain을 살펴보십시오.

    0

    요구 사항에 따라 Raw 소켓의 코드가 보다 작고 다른 접근 방식보다 코드가 작습니다. 확실히 최저 대기 시간을 갖습니다. 루프 백을 통해 약 20 마이크로 초까지 줄일 수 있습니다.

    더 많은 요구 사항을 가질수록 높은 수준의 솔루션을 원할 가능성이 높아집니다. 그러나 원하는 모든 것이 가벼운 것이라면 원시 소켓이 가장 간단 할 수 있습니다.

    0

    절약 용으로는 TServlet을 쓰래드 서비스의 진입 점으로 사용할 수 있습니다. Activemq 나 zookeeper로 해결해야 할 문제가 더 많다고 당신이 묘사 한 내용.

    0

    웹 소켓은 두 개의 JVM 사이가 아닌 웹 서버와 클라이언트 간의 통신을 도와줍니다. 그것이 실제로 당신이 원하는 것이라면, http://fermiframework.org은 자바 스크립트 (서버에서 클라이언트) 로의 RMI를 제공합니다.

    0

    프로젝트에 게시/가입 및 기타 필요한 분산 공유 데이터 구조가있는 Redisson 프로젝트를 살펴볼 수도 있습니다.

    관련 문제