Development Tip

2 개의 JVM이 서로 통신하도록하는 방법

yourdevel 2020. 11. 27. 21:32
반응형

2 개의 JVM이 서로 통신하도록하는 방법


다음과 같은 상황이 있습니다.

java로컬 시스템에서 2 개의 JVM 프로세스 (실제로 2 개의 스레드가 아닌 2 개의 프로세스가 별도로 실행 됨)가 실행되고 있습니다. 의 그들을 부르 자 ProcessAProcessB.

나는 그들이 서로 통신 (데이터 교환)하기를 원합니다 (예 : 무언가 ProcessAProcessB하기 위해 메시지를 보냅니다 ).

이제 임시 파일을 작성하여이 문제를 해결하고 이러한 프로세스는 주기적으로이 파일을 스캔하여 메시지를 얻습니다. 이 솔루션이 그렇게 좋지 않다고 생각합니다.

내가 원하는 것을 달성하기위한 더 나은 대안은 무엇입니까?


IPC를 위한 여러 옵션 :

소켓 기반 (베어 본) 네트워킹

  • 반드시 어렵지 는 않지만 :
    • 그다지 장황하지 않을 수도 있습니다.
    • 더 많은 코드를 작성하면 버그에 대해 더 많은 표면을 제공 할 수 있습니다.
  • Netty 와 같은 기존 프레임 워크에 의존 할 수 있습니다.

RMI

  • 기술적으로는 네트워크 통신이기도하지만 투명합니다.

완전한 메시지 전달 아키텍처

  • 일반적으로 RMI 또는 네트워크 통신을 기반으로하지만 복잡한 대화 및 워크 플로를 지원합니다.
  • 단순한 것에 비해 너무 무거울 수 있습니다.
  • ActiveMQ 또는 JBoss 메시징 과 같은 프레임 워크

JMX (Java Management Extensions)

  • more는 JVM 관리 및 모니터링을 위한 것이지만 한 프로세스가 데이터에 대해 다른 프로세스를 쿼리하도록하거나 너무 복잡하지 않은 경우 작업 요청을 보내려는 경우 원하는 것을 구현하는 데 도움이 될 수 있습니다.
  • RMI에서도 작동합니다 (다른 가능한 프로토콜 중에서).
  • 처음에는 머리를 감는 것이 그렇게 간단하지는 않지만 실제로 사용하기는 다소 간단합니다.

파일 공유 / 파일 잠금

  • 그게 당신이 지금하고있는 일입니다
  • 할 수 있지만 처리해야 할 많은 문제가 있습니다.

신호

  • 다른 프로젝트로 신호를 보내기 만하면됩니다.
  • 그러나, 그것은 상당히 제한이고 (이 번역 층을 구현하는 방법이 필요 하다 하지만 행할 수 있지만, 무엇보다 심각한 장난감에 오히려 미친 생각.

자세한 내용이 없으면 베어 본 네트워크 기반 IPC 접근 방식이 가장 좋은 것 같습니다.

  • 확장 성이 가장 뛰어납니다 (새로운 기능과 워크 플로를
  • 가장 가볍습니다 (앱의 메모리 공간 측면에서)
  • 가장 단순함 (디자인 측면에서)
  • 가장 교육적입니다 (IPC 구현 방법 학습 측면에서). (당신이 코멘트에서 "소켓은 어렵다"라고 언급했듯이, 그것은 당신이 작업하는 것이 아니고 그렇게되어야합니다)

즉, 귀하의 예를 기반으로 (간단히 다른 프로세스에 작업을 요청 함) JMX도 충분할 수 있습니다.


두 개 (또는 더 많은)의 Java 프로세스 / JVM이 메시지를 교환하여 통신 할 수 있도록하는 Mappedbus ( http://github.com/caplogic/mappedbus ) 라는 github에 라이브러리를 추가했습니다 . 라이브러리는 메모리 매핑 파일을 사용하고 가져 오기 및 추가 및 휘발성 읽기 / 쓰기를 사용하여 서로 다른 판독기와 기록기를 동기화합니다. 이 라이브러리를 사용하는 두 프로세스 간의 처리량을 단일 메시지 읽기 / 쓰기에 대한 평균 대기 시간 25ns로 4 천만 메시지 / 초로 측정했습니다.


당신이 찾고있는 것은입니다 inter-process communication. Java는 Java RMI API 형식으로 간단한 IPC 프레임 워크를 제공합니다 . 파이프, 소켓, 메시지 큐와 같은 프로세스 간 통신을위한 몇 가지 다른 메커니즘이 있습니다 (분명히 모든 개념이므로이를 구현하는 프레임 워크가 있습니다).

귀하의 경우 Java RMI 또는 간단한 사용자 정의 소켓 구현으로 충분할 것이라고 생각합니다.


Java 객체를 앞뒤로 보내기위한 DataInput (Output) Stream 소켓 이것은 디스크 파일을 사용하는 것보다 쉽고 Netty보다 훨씬 쉽습니다.


저는 jGroup을 사용하여 프로세스간에 로컬 클러스터를 형성하는 경향이 있습니다. 동일한 머신, 동일한 JVM 내 또는 다른 서버에있는 노드 (일명 프로세스)에 대해 작동합니다.

기본 사항을 이해하면 쉽게 작업 할 수 있으며 동일한 JVM에서 두 개 이상의 프로세스를 실제로 실행할 수있는 옵션이 있으면 이러한 프로세스를 쉽게 테스트 할 수 있습니다.

둘 다 동일한 시스템에있는 경우 오버 헤드와 지연 시간이 최소화됩니다 (일반적으로 작업 당 약 100ns의 TCP rountrip 만 있음).


소켓이 더 나은 선택 일 수 있습니다.


2004 년에 저는 소켓으로 작업을 수행하는 코드를 구현했습니다. 그때까지는 소켓 접근 방식이 방화벽을 트리거하고 클라이언트가 걱정하기 때문에 더 나은 솔루션을 여러 번 찾았습니다. 지금까지 더 나은 해결책은 없습니다. 클라이언트는 데이터를 직렬화하고 전송해야하며 서버는 수신 및 직렬화 해제해야합니다. 쉽습니다.

참고 URL : https://stackoverflow.com/questions/10942427/how-to-have-2-jvms-talk-to-one-another

반응형