개요
jms는 자바에서 제공하는 메시징 서비스이다. 메시징 서비스는 서로 다른 네트워크를 갖는 서비스(애플리케이션)들간에 데이터를 비동기적으로 받을 수 있게 해준다. 다시 말해 서비스 1과 서비스 2 사이에 직접적인 통신이 일어나는 것이 아니라 서비스 1과 서비스 2 사이에 서비스 버스라고 하는 큐(Queue)가 있어서 서비스 1과 서비스 2 사이의 통신을 받아들이고 저장하는 역할을 한다.
서비스 1에서 특정 로직이 끝나고 서비스 버스로 완료된 데이터가 담겨있는 문자열을 보내면 서비스 버스에 해당 데이터가 '메시지(레터)'라는 이름으로 쌓이게 할 수 있다. 그럼 서비스 2가 서비스 버스에 접근해서 이 데이터를 확인하고 서비스 2의 특정 로직을 실행하거나 관련 데이터베이스에 정보를 저장할 수 있게 된다. 서비스 2에서는 서비스 버스에 접근을 수동으로 할 수도 있지만, 구독의 형태로 설정하면 특정 시간마다 서비스 버스를 확인하고 데이터를 가져오게 할 수도 있다.
서비스 1과 서비스2가 직접적으로 연결된다면 서로의 시스템을 잘 알고 있어야 된다. 그리고 그에 맞게 시스템이 구성되어야 하며, 하나의 서비스에 문제가 생기면 두 서비스가 모두 영향을 받게될 수 있다. 하지만 서비스 버스를 통해 약한 결합성(loose coupling)을 갖고 있으면 두 서비스의 안정성이 커진다. 서비스1은 (받는 서비스가 서비스2든 서비스3이든) 서비스버스에 메시지를 쏘기만 하면 되고 서비스2는 서비스버스에서 메시지를 가져오기만 하면된다. 이렇게 메시징 서비스를 이용하면 신뢰성 있고 유연한 시스템을 만들 수 있게 된다.
jms는 비동기적인 방식의 통신에 해당하는 방법이다. 이메일, 채팅 등 제공자(발신자, Provider, Sender)가 데이터를 전송하면 무조건 큐에 쌓이고 이를 소비자(수신자, Consumer, Receiver)가 원할 때 소비할 수 있다. 상대되는 개념으로 동기식 통신 방식은 소켓 통신이다. 이 방법은 제공자가 전달한 정보를 소비자가 받아야만 통신이 이루어진 것으로 보는 방식이다.
대부분의 프로그램 언어는 메시징 서비스를 할 수 있는 인터페이스 집합(미리 코딩해놓은 세트 정도로 이해해도 됨)을 제공한다. 그리고 이를 활용하는 서비스들은 각 언어의 메시징 인터페이스에 맞게 api를 설정해두었다. 예를 들어 참조1)의 마이크로소프트 Azure에서는 아래 사진과 같이 Java, Python, JavaScript에 본인들의 메시징 서비스를 적용할 수 있는 방법을 기술해놓았다.
이 글에서는 자바, Azure를 중심으로 Service Bus 메시징을 공부한다.
JMS 구동 방식
JMS Message Model
point-to-point 방식과 publish/subscribe 방식이 있다.
point-to-point
발신자가 여러 명의 수신자 중 1명의 수신자를 특정하여 메시지를 전달하는 방식이다.
publish/subscribe
발신자가 토픽을 통해 많은 구독자들에게 메시지를 전달하는 방식이다. 구독자가 메시지를 받으려고 토픽에 따로 요청을 하지 않아도 자동으로 전달되는 푸시 기반 모델이다. 만약 구독자가 구독을 끊었다가 요청하면 그 동안 쌓인 메시지를 한번에 받을 수 있게 된다.
참조
https://docs.microsoft.com/ko-kr/azure/service-bus-messaging/
https://javacan.tistory.com/entry/13
https://waspro.tistory.com/124
'Programming-[Backend] > Java' 카테고리의 다른 글
[링크] isAssignableFrom 과 instanceof의 차이 (0) | 2022.03.03 |
---|---|
[TIL][링크][작성중] 자바 어노테이션 및 리플렉션(Java Annotation, Reflection) (0) | 2022.02.22 |
[자바 기초] [작성중] 5. 자바의 동작원리 : JVM의 ClassLoader (0) | 2021.12.19 |
[자바 기초] 4. 자바의 동작원리 : JVM, JRE, JDK 구분과 차이점 (0) | 2021.12.19 |
자바 Json 파싱, 값 추출하기 : JSONObject, JSONArray (0) | 2021.12.19 |