분산 시스템에서의 모든 통신의 기반은 메시지 송수신이다.
컴퓨터 그룹이 네트워크를 통해 통신하려면, 통신에 사용될 프로토콜에 대해 모두 동의해야만 한다.
기본 네트워크 모델
레이어드 프로토콜
OSI 7계층은, 메시지 패싱에 집중한 오픈 시스템 상호연결 관련 모델이다.
하위 계층에서 수행되는 작업이 상위 계층에 투명하게 처리된다.
낮은 레벨의 계층에는 Pysical, Data-link, Network 계층이 포함된다.
Pysical layer는 bit의 설명과 구현을 담당하고 있으며, 송신자와 수신자에게 bit를 전송하는 역할이다.
Data-link layer는 에러와 흐름제어를 허용하기 위해 전송되는 bit 그룹들을 frame으로 바꾸라는 지시를 내리는 역할이다.
Network layer(Internet Protocol)는 네트워크 상의 컴퓨터들에 어떻게 패킷을 라우팅할 것인지 설명하는 역할이다.
보통 분산 시스템에서는, 낮은 계층의 레이어를 통상 네트워크 레이어라고 부른다.
대부분의 분산 시스템에서 실제 통신이 이루어지는 계층이 Transport layer이다.
표준 인터넷 프로토콜에는 TCP와 UDP가 있다.
TCP(Transmission Control Protocol)는 연결 지향 서비스로, 신뢰할 수 있고 데이터는 연속적인 스트림 형태로 전송된다.
UDP(User Datagram Protocol)는 비연결형 서비스로, 각 데이터그램이 독립적으로 전송되기 때문에 신뢰할 수 없다.
높은 레벨의 계층에는 Session, Presentation, Application 계층이 포함된다.
Session layer는 애플리케이션 사이의 세션을 지원해준다.
Presentation layer는 통신 중인 애플리케이션의 호스트와는 별개로 데이터의 표현 방식을 규정한다. 즉, 서로 다른 시스템 간의 데이터 형식, 인코딩, 암호화 등을 표준화하여 통신이 원활하게 이루어지도록 한다.
Application layer는 그 외의 모든 것(e.g. HTTP, FTP)을 포함한다.
추가적으로 미들웨어 계층이 존재하는데,
미들웨어는 다양한 애플리케이션들이 사용할 수 있는 공통 서비스와 프로토콜을 제공하기 위해 발명되었다.
풍부한 통신 프로토콜을 포함하며, 통합 시스템에 필요한 마샬링을 수행하며, 자원을 쉽게 공유할 수 있는 네이밍 프로토콜을 지원한다. 또한, 안전한 통신을 보장하는 보안 프로토콜과 복제 및 캐싱 기능을 제공하는 확장 메커니즘을 갖고있다.
대표적으로 DNS(Domain Name System)이 있는데, 도메인 이름과 관련된 네트워크 주소를 조회하는데 사용되는 서비스다. 논리적으로는 애플리케이션 계층에 위치하지만, 애플리케이션에 독립적인 서비스를 제공하므로 미들웨어의 일부로 간주된다.
개조된 레퍼런스 모델
OSI 7계층 모델을 변형하거나 확장한 모델이다.
현대의 네트워크 환경은 OSI 모델이 설계되었을 당시보다 복잡하고 다양해졌기 때문에, 새로운 기술을 적용시켜 확장된 모델을 만들었다.
통신의 종류
일시적인(Transient) 통신 vs 지속적인(Presistent) 통신
일시적인 통신은, 메시지가 통신 시스템에 저장되는 시간은 송신 및 수신 애플리케이션이 실행되는 동안에만 유지되는 통신이다.
지속적인 통신은, 전송을 위해 제출된 메시지가 수신자에게 전달될 때까지 통신 미들웨어에 의해 저장되는 통신이다.
이메일을 예시로 들어보자면,
클라이언트가 이메일을 송신하겠다고 요청 제출하면 미들웨어에서 ACK신호가 바로 돌아오는데, 이를 일시적인 통신이라 한다.
반면 송신된 이메일은 수신자가 확인할 때까지 서버에 저장되는데, 이를 지속적인 통신이라 한다.
비동기식(Asynchronous) 통신 vs 동기식(Synchronous)통신
비동기식 통신에서 송신자는 메시지를 전송한 즉시 다른 작업을 수행할 수 있다. 이는 메시지가 전송되자마자 미들웨어에 의해 일시적으로 저장된다는 것을 의미한다.
동기식 통신에서 송신자는 수신자가 요청을 받아들일 때까지 차단(blocked)된다. 차단된 동안에는 다른 작업을 수행할 수 없다.
동기화가 이루어지는 구간은 총 세군데가 있다.
- 요청 제출 시(at request synchronization): 송신자(클라이언트)는 미들웨어가 요청의 전송을 받아들였다는 것을 알려줄 때까지 차단된다. 송신자는 요청이 미들웨어 의해 처리될 것이라는 확인을 받기 전까지 다른 작업을 수행할 수 없다.
- 요청 전달 시(at request delivery): 송신자는 요청이 수신자에게 전달될 때까지 동기화된다. 송신자는 요청이 수신자에게 도달했는지 확인할 때까지 기다린다.
- 요청 처리 시(at request processing): 송신자(미들웨어)는 자신의 요청이 완전히 처리될 때까지 기다린다. 송신자는 요청이 수신자에 의해 처리되고 응답이 돌아올 때까지 차단된다.
클라이언트-서버 컴퓨팅
일반적으로 일시적 동기 통신 (transient synchronous communication)모델에 기반한다.
클라이언트와 서버는 통신 시점에 모두 실행 중이여야하며, 클라이언트는 요청을 보내고 응답을 받을 때까지 차단된다.
서버는 기본적으로 들어오는 요청을 기다리고, 요청을 받으면 이를 처리한다.
그러므로 클라이언트는 응답을 기다리는 동안 다른 작없을 할 수 없다는 단점이 존재한다. 또한 장애가 발생했을 때, 클라이언트가 기다리고 있기 때문에 장애의 즉각적인 처리가 필요하다. 이메일, 뉴스 같은 서비스는 이 모델이 적절하지 않을 수 있다.
메세징(messaging)
메시지 지향 미들웨어는 높은 수준의 지속적인 비동기 통신을 위한 시스템이다.
프로세스들은 서로에게 메시지를 보내고, 그 메시지들은 큐에 저장된다. 송신자는 즉각적인 응답을 기다릴 필요가 없으며, 다른 작업을 수행할 수 있다. 따라서 미들웨어는 종종 장애를 허용하는 경우도 있다.
전 시간에 배웠던 Pub/Sub 시스템이 적절한 예시이다.
발생한 이벤트는 미들웨어에 지속적으로 저장되어 있으며, Pub이나 Sub 중 한 개가 실행중이지 않더라도 정보 전송이 가능하다.
기본 RPC 작업
현대의 애플리케이션 개발자들은 간단한 프로시저 모델에 익숙하다.
잘 설계된 프로시저는 독립적으로 동작하며, 프로시저 호출 메커니즘을 사용하여 클라이언트-서버 통신을 숨길 수 있다.
프로시저를 다른 컴퓨터에서 실행하지 못할 근본적인 이유는 없다.
클라이언트가 원격 프로시저를 호출하면, 호출이 서버에게 전달되어 서버가 로컬 프로시저를 호출하고 결과를 받아와 응답한다.
전 시간에 배웠던 내용인데, 클라이언트가 원격 프로시저를 호출하면 stub이 메시지 형태로 만들어서 전송한다. 서버의 stub은 메시지를 언패킹해서 클라이언트가 호출한 프로시저를 실행하게 된다. 이때, 클라이언트의 stub를 proxy, 서버의 stub를 skeleton이라고 한다.
RPC: 파라미터 패싱
원격 프로시저를 호출할 때, 메시지의 패킹・언패킹을 통해 통신한다는 것은 알겠다.
그렇다면 매개변수의 값은 어떻게 넘기는 걸까?
매개변수의 값을 단순히 패킹만해서 보내기에는 클라이언트와 서버가 서로 다른 데이터 표현방식을 사용할 수 있기 때문에, 데이터를 일관된 방식으로 인코딩하고 해석하는 과정이 필요하다.
클라이언트와 서버는 동일한 인코딩 방식에 동의해야한다.
기본 데이터 값(정수, 실수, 문자)는 어떻게 표현할 것이며, 복합 데이터 값(배열, 구조체, 유니언)을 어떻게 표현할 것인가에 대해 동의해하야 한다. 클라이언트와 서버는 메시지를 해석하고, 이를 각각의 기계 의존적인 표현 방식으로 올바르게 변환해야 한다.
Copy-In/Copy-Out 의미론
RPC에서 매개변수를 전달할 때, 모든 데이터가 복사되어 전달되고, 실행이 끝나면 다시 복사되는 방식이다.
정수 배열 a가 있을 때, 배열a의 각각의 요소들을 전부 모아서 패킹해서 전송하는 방식으로 작동한다.
프로시저가 실행되는 동안에는 값에 대해 가정을 할 수 없으며, 작업할 모든 데이터는 매개변수로 전달되고 글로벌 데이터에 대한 참조는 전달되지 않는다.
원격 참조 메커니즘은 접근 투명성을 향상시킨다.
원격 참조는 원격 데이터에 대한 통합된 접근 방법을 제공하고, RPC에서의 원격 참조는 매개변수로 전달될 수 있다. 원격 참조는 로컬과 원격 데이터를 동일한 방식으로 접근할 수 있도록 지원하기 때문에, 프로그래머가 로컬 객체와 원격 객체의 차이를 신경쓰지 않도록 만들기 때문에 접근 투명성이 향상된다.
또한, 때때로 스텁(stub)이 참조 역할을 할 수도 있다.
하지만 원격 참조와 스텁을 사용하더라도 네트워크 지연이나 장애는 여전히 존재하기 때문에, 완전한 접근 투명성은 보장하지 못한다.
Asynchronous RPC
비동기 RPC는 엄격한 request-reply(요청-응답)행동을 제거한 방식이다.
클라이언트가 서버로부터 응답을 기다리지 않고 계속 작업을 수행할 수 있다.
Multicast RPC
멀티캐스트 RPC는 하나의 RPC요청을 여러개의 서버 그룹에 동시에 보내는 방식이다.
약간 devide and conquer 알고리즘처럼 작동하는 것 같다.
Message-oriented Communication
Transient messaging(일시적인 메시징) : Sockets
소켓 통신은 비교적 저수준의 작업을 요구하며, 프로그래밍 실수가 쉽게 발생할 수 있다.
그러나 소켓의 사용 방식은 대부분 동일하다. (e.g. client-server setting)
때문에 ZeroMQ를 사용하는데, ZeroMQ는 소켓을 쌍으로 연결하여 더 높은 수준의 표현을 제공한다.
프로세스 P에 메시지를 보내는 소켓과, 프로세스 Q에서 메시지를 받는 소켓을 짝지어서 사용한다.
이때, 모든 통신은 비동기적으로 이루어진다.
ZeroMQ가 소켓 프로그래밍보다 쉬운 이유는, 클라이언트-서버환경에서 자주 사용되는 통신 패턴들을 제공하기 때문이다.
- Request-reply
- Publish-subscribe
- Pipeline(push-pull)
Message-oriented Middleware
미들웨어-레벨 큐의 지원을 받아 비동기적이고 지속적인 통신을 제공한다.
큐는 통신 서버의 버퍼에 해당합니다.
Message-Queuing System: General Model
큐들은 큐 매니저에 의해 관리되며, 애플리케이션은 메시지를 오직 로컬 큐에만 집어넣을 수 있다.
메시지를 가져오는 것 또한 로컬 큐에서 적출해야만 가능하다.
큐 매니저는 메시지를 라우팅해야한다.
Message Broker
메시지 큐잉 시스템은 공통의 메시지 프로토콜을 가정해야하기 때문에,
모든 애플리케이션은 메시지 형식(구조, 데이터 표현)에 대해 동의해야한다.
메시지 브로커는 애플리케이션들이 서로 다른 메시지 형식을 사용할 때, 메시지 큐(MQ) 시스템에서 애플리케이션의 이질성을 처리한다.
들어오는 메시지를 타겟한 형식으로 변환하여 수신자가 이해할 수 있게 동작한다. 종종 애플리케이션 게이트웨이 역할을 하며, subject-based 라우팅 기능을 제공할 수 있다. (e.g. publish-subscribe capabilities)
** 대학교 수업을 듣고 이해한 부분을 최대한 풀어서 작성한 글입니다.
틀린 정보가 존재할 수 있으며, 언제나 피드백은 환영입니다. **
'DKU > 분산처리' 카테고리의 다른 글
Distributed System 8 (7) | 2024.10.07 |
---|---|
Distributed System 7 (2) | 2024.09.30 |
Distributed System 5 (2) | 2024.09.23 |
Distributed System 4 (1) | 2024.09.20 |
Distributed System 3 (5) | 2024.09.18 |