가장 연결 가능한브로커

마지막 업데이트: 2022년 4월 17일 | 0개 댓글
  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기
  • 카카오스토리 공유하기
This allows sending many records in parallel without blocking to wait for the response after each one.

군사 및 방어 통신 방어 솔루션을 제공하는 CGS에서 국내 군, 정부 관련 파트너를 찾고 있습니다.

군사 및 방어 통신 방어 솔루션을 제공하는군사 및 방어 통신 방어 솔루션을 제공하는CGS에서 국내 군, 정부 관련 파트너를 찾고 있습니다.

CGS는 패킷 브로커(packet broker) 소프트웨어를 현대적이고 표준적이며, 확장 가능하고 강력한 서버 플랫폼에 배포하여 독점 플랫폼에 비해 우수한 성능과 경쟁력 있는 가격을 제공합니다. CGS Tower Networks는 100만 개의 IP 주소를 필터링하고 10만 개의 문자열 일치를 처리할 수 있는 유일한 패킷 브로커 공급 업체입니다.

예를 들어, IP 블랙리스트에서 생성된 트래픽에 대한 상세한 분석을 수행하거나 특정 문자열을 포함하는 등의 기능을 요구하는 가장 연결 가능한브로커 정부의 사이버 보안 활용 사례가 여러 가지 있습니다. URL 차단 또는 특정 IP 주소에 대한 분석 제외는 GDPR 데이터 개인 정보 보호 규정 위반을 방지합니다.

군사 및 국방 애플리케이션은 대개 성공에 필수적인 네트워크 인프라, 네트워크 트래픽 처리 및 네트워크 가시성에 의존합니다. CGS Tower Networks는 이러한 많은 애플리케이션을 지원하고 다음의 7가지 사용 사례를 해결할 수 있는 독특하고 최적화된 네트워크 가시성 계층을 개발했습니다.

1) 안전하고 신뢰할 수 있는 영상회의
신뢰할 수 있고 안전한 화상회의 통신을 보장하는 것은 군사, 비밀 서비스 및 원격지로부터 통신해야 하는 정부 관계자들에게 필수 불가결한 요소입니다. 문제는 세션 전반에서 최상의 서비스 수준을 제공할 수 있는 셀룰러 네트워크 공급자 및 WIFI를 포함한 여러 대안 중에서 네트워크 인프라를 선택하는 것입니다. CGS MINI-NB 휴대용 화상 회의 플랫폼을 사용하면 사용 가능한 네트워크 간에 동적으로 자동 전환하여 가장 안정적인 화상 회의 통신을 보장할 수 있습니다.

2) 추후 분석을 위한 의심스러운 트래픽 감지
사이버 공간은 새로운 전쟁터이며 의심스러운 텍스트를 포함하는 네트워크 트래픽과 세션을 추적할 수 있는 기능은 정부와 비밀 서비스 기관이 필요로 하는 강력한 기능입니다. 네트워크 대역폭과 데이터의 엄청난 증가는 기존의 패킷 브로커 공급 업체의 독점 하드웨어가 100G 네트워크에서 거대한 필터링, 패킷 처리 및 문자열 일치에 필요한 CPU 및 RAM 리소스가 부족하기 때문에 기술 장벽을 만듭니다. CGS Tower Networks는 100G 네트워크를 통해 수만 개의 문자열과 URL을 식별하고 해당 세션을 추적할 수 있는 뛰어난 성능과 더불어 강력하고 현대적이며 확장 가능한 ODM 하드웨어 기반 패킷 브로커를 제공하여 이러한 과제를 해결했습니다.

3) GDPR 준수
정부는 사이버 방어 활동과 병행하여 민간 개인 정보 보호 지침을 유지해야 합니다. 보안과 사생활 간의 충돌은 적대적인 사이버 테러 활동과 관련된 네트워크 트래픽을 분석해야 하며 GDPR 규칙에 정의된 민간인 개인 정보 보호 권리를 침해해서는 안 되는 비밀 서비스에 대한 주요 도전 과제입니다. 이 두 필수 조건 간의 차이를 좁히려면 IP 주소의 하이퍼 스케일 필터링이 필요하며, 이는 민간 교통과 비 민간인 교통을 구분할 수 있습니다. CGS 타워 네트워크는 이러한 과제를 해결하기 위해 100G 네트워크에서 1,000,000개의 필터를 고유하게 지원할 수 있는 가장 강력하고 확장 가능한 패킷 브로커를 개발했습니다.

4) 여러 사이트의 네트워크 트래픽 분석
군사 및 비밀 서비스 부서는 위험을 사전에 감지하고 정보를 수집하기 위해 네트워크 트래픽 데이터를 공유하고 실시간으로 분석해야 하는 경우가 많습니다. CGS는 네트워크 트래픽 복사본을 최대 16개까지 만들 수 있는 고유하고 경제적인 광통신 플랫폼을 개발, 1G에서 100G에 이르는 용량에서 수십 km 떨어진 곳에 위치한 16개 사이트를 제공합니다.

5) 네트워크 가시성
통신 사업자의 네트워크 트래픽을 분석하는 합법적 가로채기 및 유사한 정부 애플리케이션에는 TAP와 패킷 브로커를 포함하는 네트워크 가시성 계층이 필요합니다. FIX는 복잡한 패킷 처리(헤드퍼 스트라이핑, 중복제거, 데이터 마스킹, 패킷 슬라이싱, 시간 스램핑, 조각 제거, IP 추출, Regex 필터링)와 함께 방대한 필터링 및 집계 요구 사항을 충족해야 합니다. CGS 타워 네트워크는 네트워크 가시성 시장을 혼란시키고 독점 플랫폼과 제한된 성능에서 성능 요구 사항을 충족하는 개방적이고 현대적이고 강력하며 확장 가능한 패킷 브로커로 패킷 브로커 시장의 전환을 주도함으로써 이러한 목표를 달성했으며, 뛰어난 ROI와 탁월한 ROI를 제공합니다.

6) 모바일 사이버 보안 키트
정부 보안 팀은 종종 원격 군사 기지, 정부 기관, 대사관에서의 사이버 위협과 공격을 조사하고 건초더미에서 바늘을 찔러 넣는 임무를 위임받습니다. MINI-NPB 휴대용 및 소형 패킷 브로커는 이러한 작업을 지원하는 최고의 솔루션입니다. 또한, 구리선 및 광섬유 링크에 쉽게 연결하고, MAC/IP/PORT 주소, 사용자 정의 필터 및 문자열 일치를 기준으로 트래픽을 집계 및 필터링하고, 필터링 된 트래픽을 분석 툴로 리디렉션하거나 나중에 추가 분석을 위해 캡처할 수 있습니다.

7) 원격 사이트로 사이버 가장 연결 가능한브로커 보안 및 모니터링 확장
사이버 보안 및 모니터링 솔루션에 대한 투자는 일반적으로 데이터 센터를 대상으로 하지만, 정부 기관과 군사 기지의 분산적 특성은 이 체인의 취약점이 되었다. CGS는 사이버 보안 및 모니터링 팀이 고유하고 완벽한 기능과 소규모 네트워크 구축을 위해 설계된 MINI-NPB 패킷 브로커로 원격 지사까지 커버리지를 확장할 수 있도록 도와줍니다.

더 자세한 정보가 필요하시면 주한이스라엘대사관 경제무역대표부로 문의 주시기 바랍니다.(전화. 02-723-6123 / 이메일. [email protected]/)

[번역] 10가지 소프트웨어 아키텍처 패턴 요약

대형 엔터프라이즈 규모의 시스템들은 어떻게 설계되었는지에 대해 궁금해 한 적이 있나요? 우리는 주요 소프트웨어를 개발하기 전에 원하는 기능과 품질을 제공해줄 수 있는 적절한 아키텍쳐를 선택해야합니다. 따라서, 우리는 설계 단계에서 특정 아키텍쳐를 적용하기 전에, 몇 가지 다양한 아키텍쳐들에 대해 이해할 필요가 있습니다.가장 연결 가능한브로커

intro

아키텍쳐 패턴이란?

아키텍쳐 패턴이란 주어진 상황에서의 소프트웨어 아키텍쳐에서 일반적으로 발생하는 문제점들에 대한 일반화되고 재사용 가능한 솔루션이다. 아키텍쳐 패턴은 소프트웨어 디자인 패턴과 유사하지만 더 큰 범주에 속한다.

이 글에서는, 다음의 10가지 일반적인 소프트웨어 아키텍쳐 패턴들의 활용 사례와 장단점들을 간단하게 설명할 것이다.

  1. 계층화 패턴 (Layered pattern)
  2. 클라이언트-서버 패턴 (Client-server pattern)
  3. 마스터-슬레이브 패턴 (Master-slave pattern)
  4. 파이프-필터 패턴 (Pipe-filter pattern)
  5. 브로커 패턴 (Broker pattern)
  6. 피어 투 피어 패턴 (Peer-to-peer pattern)
  7. 이벤트-버스 패턴 (Event-bus pattern)
  8. MVC 패턴 (Model-view-controller pattern)
  9. 블랙보드 패턴 (Blackboard- pattern)
  10. 인터프리터 패턴 (Interpreter pattern)

1. 계층화 패턴 (Layered pattern)

이 패턴은 n-티어 아키텍쳐 패턴이라고도 불린다. 이는 하위 모듈들의 그룹으로 나눌 수 있는 구조화된 프로그램에서 사용할 수 있다. 각 하위 모듈들은 특정한 수준의 추상화를 제공한다. 각 계층은 다음 상위 계층에 서비스를 제공한다.

일반적인 정보 시스템에서 공통적으로 볼 수 있는 계층 4가지는 다음과 같다.

  • 프레젠테이션 계층 (Presentation layer) - UI 계층 (UI layer) 이라고도 함
  • 애플리케이션 계층 (Application layer) - 서비스 계층 (Service layer) 이라고도 함
  • 비즈니스 논리 계층 (Business logic layer) - 도메인 계층 (Domain layer) 이라고도 함
  • 데이터 접근 계층 (Data access layer) - 영속 계층 (Persistence layer) 이라고도 함
  • 일반적인 데스크톱 애플리케이션
  • E-commerce 웹 애플리케이션

layered pattern

2. 클라이언트-서버 패턴 (Client-server pattern)

이 패턴은 하나의 서버와 다수의 클라이언트, 두 부분으로 구성된다. 서버 컴포넌트는 다수의 클라이언트 컴포넌트로 서비스를 제공한다. 클라이언트가 서버에 서비스를 요청하면 서버는 클라이언트에게 적절한 서비스를 제공한다. 또한 서버는 계속 클라이언트로부터의 요청을 대기한다.

  • 이메일, 문서 공유 및 은행 등의 온라인 애플리케이션

client server pattern

3. 마스터-슬레이브 패턴 (Master-slave pattern)

이 패턴은 마스터슬레이브, 두 부분으로 구성된다. 마스터 컴포넌트는 동등한 구조를 지닌 슬레이브 컴포넌트들로 작업을 분산하고, 슬레이브가 반환한 결과값으로부터 최종 결과값을 계산한다.

  • 데이터베이스 복제에서, 마스터 데이터베이스는 신뢰할 수 있는 데이터 소스로 간주되며 슬레이브 데이터베이스는 마스터 데이터베이스와 동기화된다.
  • 컴퓨터 시스템에서 버스와 연결된 주변장치 (마스터 드라이버와 슬레이브 드라이버)

master slave pattern

4. 파이프-필터 패턴 (Pipe-filter pattern)

이 패턴은 데이터 스트림을 생성하고 처리하는 시스템에서 사용할 수 있다. 각 처리 과정은 필터 (filter) 컴포넌트에서 이루어지며, 처리되는 데이터는 **파이프 (pipes)**를 통해 흐른다. 이 파이프는 버퍼링 또는 동기화 목적으로 사용될 수 있다.

  • 컴파일러. 연속한 필터들은 어휘 분석, 파싱, 의미 분석 그리고 코드 생성을 수행한다.
  • 생물정보학에서의 워크플로우

pipe filter pattern

5. 브로커 패턴 (Broker pattern)

이 패턴은 분리된 컴포넌트들로 이루어진 분산 시스템에서 사용된다. 이 컴포넌트들은 원격 서비스 실행을 통해 서로 상호 작용을 할 수 있다. 브로커 (broker) 컴포넌트는 컴포넌트 (components) 간의 통신을 조정하는 역할을 한다.

서버는 자신의 기능들(서비스 및 특성)을 브로커에 넘겨주며(publish), 클라이언트가 브로커에 서비스를 요청하면 브로커는 클라이언트를 자신의 레지스트리에 있는 적합한 서비스로 리디렉션한다.

broker pattern

6. 피어 투 피어 패턴 (Peer-to-peer pattern)

이 패턴에서는, 각 컴포넌트를 **피어 (peers)**라고 부른다. 피어는 클라이언트로서 피어에게 서비스를 요청할 수도 있고, 서버로서 각 피어에게 서비스를 제공할 수도 있다. 피어는 클라이언트 또는 서버 혹은 둘 모두로서 동작할 수 있으며, 시간이 지남에 따라 역할이 유동적으로 바뀔 수 있다.

    나 G2와 같은 파일 공유 네트워크 나 PDTP와 같은 멀티미디어 프로토콜 와 같은 독점적 멀티미디어 애플리케이션

peer to peer pattern

7. 이벤트-버스 패턴 (Event-bus pattern)

이 패턴은 주로 이벤트를 처리하며 이벤트 소스 (event source), 이벤트 리스너 (event listener), 채널 (channel) 그리고 **이벤트 버스 (event bus)**의 4가지 주요 컴포넌트들을 갖는다. 소스는 이벤트 버스를 통해 특정 채널로 메시지를 발행하며 (publish), 리스너는 특정 채널에서 메시지를 구독한다 (subscribe). 리스너는 이전에 구독한 채널에 발행된 메시지에 대해 알림을 받는다.

  • 안드로이드 개발
  • 알림 서비스

event bus pattern

8. 모델-뷰-컨트롤러 패턴 (Model-view-controller pattern)

MVC 패턴이라고도 하는 이 패턴은 대화형 애플리케이션 (interactive application)을 다음의 3 부분으로 나눈다.

  1. 모델 (model) — 핵심 기능과 데이터를 포함한다
  2. 뷰 (view) — 사용자에게 정보를 가장 연결 가능한브로커 표시한다 (하나 이상의 뷰가 정의될 수 있음)
  3. 컨트롤러 (controller) — 사용자로부터의 입력을 처리한다

이는 정보가 사용자에게 제공되는 방식과 사용자로부터 받아 들여지는 방식에서 정보의 내부적인 표현을 분리하기 위해 나뉘어진다. 이는 컴포넌트를 분리하며 코드의 효율적인 재사용을 가능케한다.

  • 일반적인 웹 애플리케이션 설계 아키텍쳐
  • **Django**나 **Rails**와 같은 웹 프레임워크

model view controller pattern

9. 블랙보드 패턴 (Blackboard pattern)

이 패턴은 결정 가능한 해결 전략이 알려지지 않은 문제에 유용하다. 이 패턴은 3가지 주요 컴포넌트로 구성된다.

  • 블랙보드 (blackboard) — 솔루션의 객체를 포함하는 구조화된 전역 메모리
  • 지식 소스 (knowledge source) — 자체 표현을 가진 특수 모듈
  • 제어 컴포넌트 (control component) — 모듈 선택, 설정 및 실행을 담당한다

모든 컴포넌트는 블랙보드에 접근한다. 컴포넌트는 블랙보드에 추가되는 새로운 데이터 객체를 생성할 수 있다. 컴포넌트는 블랙보드에서 특정 종류의 데이터를 찾으며, 기존의 지식 소스와의 패턴 매칭으로 데이터를 찾는다.

  • 음성 인식
  • 차량 식별 및 추적
  • 단백질 구조 식별
  • 수중 음파 탐지기 신호 해석

blackboard pattern

10. 인터프리터 패턴 (Interpreter pattern)

이 패턴은 특정 언어로 작성된 프로그램을 해석하는 컴포넌트를 설계할 때 사용된다. 이는 주로 특정 언어로 작성된 문장 혹은 표현식이라고 하는 프로그램의 각 라인을 수행하는 방법을 지정한다. 기본 아이디어는 언어의 각 기호에 대해 클래스를 만드는 것이다.

Kafka Producer

이 글에서는 Kafka Client API를 사용하여 Kafka Producer를 만들어보고, 메시지가 실제로 어떤 과정을 거쳐 전달되는지 알아본다.

build.gradle에 Kafka Client 의존성 추가하기

build.gradle의 dependencies 블록에 아래 구문을 추가하여 Kafka Client API 의존성을 추가한다. 오늘 날짜(2020년 5월 2일) 기준으로 2.5.0 버전(Release: 2020/04)이 가장 최신의 API이며, 공식 문서에서도 사용을 권장한다.

KafkaProducer 객체 초기화

KafkaProducer 는 Kafka Cluster에 메시지를 발행하는 API를 제공하는 클래스이다.

KafkaProducer 객체를 생성할 때는 Kafka Cluster 연결 정보, Serializer 설정 등을 전달해주어야 한다. 이러한 정보들은 java.util.Properties 를 통해 전달한다.

  • bootstrap.servers : Kafka Cluster의 Broker 주소를 (host:port) 형식으로 넣어주면 된다. Kafka Cluster를 구성하는 Broker 중 하나의 주소만 넘겨줘도 연결 과정에서 다른 Broker들의 주소도 수신한다. 다만 운영 환경에서는 Producer 재시작 시 기입된 주소의 Broker가 다운되더라도 다른 Broker 주소를 통해 연결 가능하도록 2개 이상의 주소를 넣어주는 것을 권장한다.
  • key.serializer : 메시지의 Key를 직렬화 할 수 있는 Serializer 클래스를 설정한다.
  • value.serializer : 메시지의 Value를 직렬화 할 수 있는 Serializer 클래스를 설정한다.

Properties 객체 초기화가 완료되었다면, 이제 KafkaProducer 객체를 아래와 같이 초기화한다. Producer 의 Generic 값은 메시지를 구성하는 Key, Value 타입을 나타낸다.

참고로 Producer ( KafkaProducer )는 Thread-Safe한 객체이다. 따라서 해당 객체를 Singleton으로 유지하여 애플리케이션 내의 Thread들이 공유하도록 하는 가장 연결 가능한브로커 것이 좋다. 오히려 많이 만들수록 Kafka Broker Server와의 Connection만 많이 생성되기 때문에 좋지 않은 영향을 끼치게 된다.

send() 메서드로 메시지 보내기

KafkaProducer 의 초기화가 완료되었다면 send() 메서드를 통해 Kafka Broker로 메시지를 전송할 수 있다.

send 메서드로 전달하는 객체는 ProducerRecord 이다. 기본적으로 Topic명과 메시지의 Value 만으로도 ProducerRecord 객체를 만들어 전송이 가능하며, 추가적으로 Key, Partition ID, Timestamp, Header 등을 설정할 수 있다.

위와 같이 send 메서드를 통해 test Topic에 100개의 메시지를 발행하였다. kafka-console-consumer.sh 파일을 이용하여 Topic에 메시지가 정상적으로 전달되었는지 확인해보자.

총 100개의 메시지가 정상적으로 들어온 것을 확인할 수 있다.

send 는 비동기 메서드이다.

send 메서드는 비동기 메서드이다. Kafka Client Javadoc 에서의 send 메서드 주석을 보면 아래와 같이 설명되어 있다.

Asynchronously send a record to a topic and invoke the provided callback when the send has been acknowledged.

The send is asynchronous and this method will return immediately once the record has been stored in the buffer of records waiting to be sent.

send 메서드는 비동기로 동작하며, 전달된 ProducerRecord 메시지는 Broker로 즉시 전송되는 것이 아니라 Producer 프로세스의 buffer에 저장된 후 전송된다. 이와 같은 구현을 한 이유는 바로 다음 줄에 적혀있다.

This allows sending many records in parallel without blocking to wait for the response after each one.

동기 방식으로 메서드를 구현했다면 send 를 호출할 때마다 하나씩 메시지가 Broker로 전송될 것이다. 이는

  • send 메서드 호출 시 I/O Block이 발생하여 병렬성이 떨어짐
  • Bulk로 보내는 것보다 Network Overhead가 발생

때문에 KafkaProducer 의 send 를 호출하게 되면 ProducerRecord 를 KafkaProducer 의 내부 Buffer에 저장해놓은 후, 어느정도 메시지가 모이게 되면 여러 개의 메시지를 한번에 보내고 Callback을 호출한다.

send 의 Callback 활용하기

send 의 메서드 시그니처는 아래와 같다.

Future 가 반환되기 때문에 get 을 호출하면 해당 Call이 Block되어 동기 방식으로 메시지 전송결과를 알 수 있겠지만, 이는 Kafka Client 구현자의 의도가 아닐 것이다. 이상적인 메시지 전송 후처리 방식은 Callback을 이용하는 것이다.

CountDownLatch 를 통해 모든 메시지가 처리된 이후에 애플리케이션을 종료할 수 있도록 하였다. 프로덕션 환경에서는 위와 같이 익명 인터페이스로 구현하는 것보다는 실패 시 재시도 가능한 로직을 구현한 구체 클래스로 처리하는 것이 더 좋을 것 같다.

send 는 실제로 어떻게 동작하는가?

How kafka send message to broker

send 를 통한 메시지 전송에 관여하는 객체는 Sender 와 가장 연결 가능한브로커 RecordAccumulator 이다. send 를 호출하게 되면 간략히 아래와 같은 순서로 메시지 전송이 수행된다.

Kafka Cluster에서 Topic 관련 최신 메타데이터를 Fetch 한다.

KafkaProducer 는 자신이 데이터를 전송할 Topic과 파티션 등의 정보를 관리하기 위해 ProducerMetadata 를 유지한다. 메시지를 전송하기 전에 waitOnMetadata 메서드를 호출하여 최신 메타데이터를 Fetch한 뒤 ProducerMetadata 상태를 갱신한다.

업데이트 이전의 메타데이터

위의 데이터는 waitOnMetadata 호출 이전의 ProducerMetadata 이며, 아래의 데이터는 waitOnMetadata 호출 이후의 ProducerMetadata 이다.

업데이트 이후의 메타데이터

메시지를 전송할 Topic인 test 의 정보가 생겨난 것을 확인할 수 있다. 참고로 waitOnMetadata 가장 연결 가능한브로커 는 요청한 Topic에 대해서만 정보를 업데이트한다. 또한 waitOnMetadata 과정에서 Cluster 객체 또한 업데이트한다. 이 정보도 ProducerMetadata 와 유사하게 Topic이나 Partition 정보를 가지고 있다.

메시지의 Key와 Value를 지정된 Serializer를 통해 직렬화한다.

위 코드와 같이 지정된 KeySerializer와 ValueSerializer를 통해 가장 연결 가능한브로커 메시지의 데이터를 직렬화한다. 이 과정에서 오류가 발생할 경우 SerializationException 이 발생하게 된다.

메시지가 발행될 Partition을 결정한다.

partition 메서드를 통해 메시지를 전송할 Partition의 ID 값을 얻어온다.

이 partition 함수는 메시지의 Key가 설정되어 있는지 아닌지에 따라 완전히 동작방식이 달라지게 된다.

  • Key가 설정되어 있는 경우: Key의 해시 값을 통해 현재 사용 가능한 파티션 중 하나를 선택한다. 즉, 동일 Key를 가진 메시지는 동일한 파티션으로 전송된다.
  • Key가 설정되어 있지 않은 경우: StickyPartitionCache 객체를 통해 파티션이 결정된다. Topic 기준으로 매번 같은 파티션 번호를 반환하며, 첫 호출 시 Topic 별로 랜덤한 파티션 ID를 Cache하여 해당 값을 고정으로 사용한다.

Buffer 역할을 하는 RecordAccumulator 객체에 메시지를 저장한다.

RecordAccumulator 는 여러 개의 메시지를 배치 방식으로 전송하기 위해, 실제 Broker로의 전송 전에 임시로 보관해두는 Buffer이다. 내부적으로 TopicPartiton 을 키로 가지고 Deque 를 값으로 가지는 ConcurrentMap 타입의 객체(batches)에 메시지를 쌓아놓는다.

아래와 같이 메시지를 batches에 넣어두는 로직을 수행한다. batches의 키는 TopicPartition 이기 때문에, 동일한 토픽명과 파티션 ID를 가진 메시지들은 하나의 ProducerBatch 로 묶여 전송되고, Broker에서는 동일한 RecordBatch 로 저장된다.

여기까지가 send 를 호출하면 발생하는 과정이다. 실제 메시지의 전송은 별도 I/O Thread를 통해 Sender 라는 객체를 통해 이루어진다.

Sender 를 통한 메시지의 전송

Sender 는 I/O Thread에서 주기적으로 RecordAccumulator 의 메시지들을 Fetch하여 Kafka Broker로 전송하는 모듈이다. KafkaProducer 를 초기화하는 과정에서 I/O Thread가 생성되어 Sender 가 자동으로 시작된다.

Sender 클래스의 주석을 보면 Kafka Cluster로의 메시지 전송 요청을 관리하는 Background Thread라고 설명되어 있다.

실제 로직이 수행되는 run 메서드를 보면 아래와 같이 루프 내에서 runOnce 라는 메서드를 호출하는 것을 확인할 수 있다.

runOnce 라는 메서드 내에서도 실제로 RecordAccumulator 로부터 전송할 데이터를 Fetch하여 Broker로 전송하는 역할을 수행하는 sendProducerData 라는 메서드를 호출한다.

RecordAccumulator 의 drain 메서드를 호출하여 전송할 메시지 배치들을 Fetch하고, sendProduceRequests 함수를 호출하여 이 메시지 배치들을 전송하게 된다.

현업에서 Kafka를 사용하는 경우는 Spark Streaming이나 Druid 등의 오픈소스를 통해 활용하기 때문에, Kafka API를 직접 사용할 일이 없었다(물론 이러한 오픝소스들마저 최근에 사용해봤다).

일단 API 자체를 사용하면서 엄청 쉬운 사용법(물론 부가적인 설정이나 Production Level이 아니기 때문에 예외 상황은 생길 수 있지만)에 한번 놀랐고, 내부 구조가 이렇게 복잡하다는데에 두번 놀랐다.

MQTT Protocol

MQTT(Message Queue Telemetry Transport)는 IOT 기기간의 통신을 위한 프로토콜이다. MQTT 이외에도 IOT용으로 CoAP(Constrained Application Protocol), AMQP(Advanced Message Queuing Protocol), XMPP(eXtensible Messaging and Presence Protocol), DDS(Data Distribution Service), Stomp(Simple Text Orientated Messaging Protocol) 등의 다양한 프로토콜이 있고, 각각의 프로토콜은 활용 용도에 따라서 장단점을 가지고 있다.

여기에서는 MQTT의 특징에 대해서 정리하기로 한다.

MQTT의 특징

TCP 기반 프로토콜

UDP가 아닌 TCP 기반이라 작은 IOT 기기에서는 사용이 어려울 수 있다. MQTT 프로토콜에서 사용자 인증을 제공한다. 하지만 이를 위한 username, password 필드는 cleartext로 전달되므로 이들 정보와 송수신 데이타를 보호하기 위하여는 별도로 암호화를 하거나 SSL/TLS를 이용하여 암호화 채널을 이용하여야 한다. 결과적으로 public 망에서 운영되는 IOT 기기는 MQTT, TCP, TLS를 지원할 수 있는 OS와 메모리 사양이 되어야 한다.

Session Oriented

MQTT는 client-server protocol로, client는 센서 장치 또는 모니터링 가장 연결 가능한브로커 가장 연결 가능한브로커 장비(PC, 스마트 기기)가 될 수 있고, server는 broker라고 칭한다. Broker는 연결된 client 와의 session을 관리하고, 다른 broker와 연결하기도 한다. 초기 세션 수립은 client에서 broker로 MQTT CONNECT 메시지를 전송하여 이루어진다. 이후 이 TCP 세션은 client가 사용을 중단할 때까지 유지하여 메시지를 주고 받는 용도로 사용한다.

Exteremely Lightweight Publish / Subscribe Messaging Protocol

메시지 큐 프로토콜은 채팅과 유사한 개념이라고 생각하면 된다. IRC 채팅 개념과 비교하면 아래와 같다.

IRC 채팅MQTT
IRC ServerMQTT Broker
ChannelTopic
Join a channelSubscribe

IRC는 명시적인 channel에 join 하는 것이라면 MQTT는 wildcards 로 여러 topic을 한꺼번에 subscribe 할 수 있다.

Topic

Topic 은 아래의 예와 같이 계층적으로 구성할 수 있다. (아래 예는 HiveMQ 의 페이지 내용을 참고한 것으로 관련 내용을 읽어보는 것도 좋을 듯 하다)

여러 topic 을 한번에 subscribe 하기 위하여는 single level ’+’나 multi level ‘#’ 을 사용할 수 있다. Single level은 아래 처럼 topic 중간에 wildcard를 사용하는 것이다.

위와 같이 subscribe 하게 되면 다음과 같은 topic 이 포함된다.

  • myhome/groundfloor/livingroom/temperature
  • myhome/groundfloor/kitchen/temperature

Multi level wildcard는 마지막에 사용할 수 있다.

위와 같이 subscribe 하게 되면 다음과 같은 topic 이 포함된다.

  • myhome/groundfloor/livingroom/temperature
  • myhome/groundfloor/livingroom/brightness
  • myhome/groundfloor/kitchen/temperature

Subscribe / Publish

일반적인 센서 노드는 정보를 주기적으로 publish 한다(publisher). 반대로 모니터링을 위한 스마트 기기는 필요한 topic 을 subscribe 하여(receiver) 센서 노드에서 오는 정보를 활용한다.

단순한 예를 보면 다음과 같을 것이다.

  • Receiver는 수신 받기를 원하는 topic 을 subscribe 한다.
  • Publisher는 필요 시점마다 publish 하면 broker는 이를 subscribe 되어 있는 client 로 전달하여 준다.

다수의 receiver가 동일 topic 으로 subscribe 할 수 있고, 이 경우 broker는 모든 subscriber에게 publish message를 전송한다.

동작 방식은 프로토콜 이름 처럼 ‘message queue’ 방식이다. 개념적으로 보면 broker는 다음과 같은 절차로 수행한다.

  1. Publisher에서 수신된 message를 queue 에 저장
  2. 가장 연결 가능한브로커
  3. QoS 종류에 따라 publisher에 ack 응답
  4. Queue에 저장된 메시지를 subscriber에게 전송 및 QoS 에 따라 ack 응답 확인
  5. Queue에 저장된 메시지를 삭제하거나 설정에 따라 유지 (retain field)

메시지를 전송하는 경우 메시지의 특성 및 중요도에 따라서 수신측이 정확히 전송을 받았는지를 확인할 필요가 있다. MQTT 에서는 QoS level로 이와 같은 설정을 할 수 있다.

  • QoS 0 (at most once): 수신측 확인 없이 1회 전송
  • QoS 1 (at least once): 수신측의 ACK를 확인 및 재전송 (재전송으로 수신측에서는 중복된 message를 받을 수 있음)
  • QoS 2 (exactly once): 송신 및 수신측 모두 메시지가 정상적으로 전송되었는 지 확인

여기서 수신측이라 하는 것은 최종 receiver를 말하는 것이 아니라 client이면 broker를 broker이면 publish를 전달하는 client를 말한다.

각각의 QoS 레벨에 따라 전달되는 protocol 절차는 아래와 같다.

QoS0는 별도의 ACK 없이 전송하는 것이고, QoS1는 PUBACK(Publish Acknowledge)로 수신 확인을 한다. 만일 송신 측에서 PUBACK를 지정된 시간에 받지 못하면 PUBLISH를 동일한 ID로 duplicate flag를 설정하여 재전송한다. QoS2 의 경우 송신 측에서 응답을 받았는지도 확인하는 절차로 PUBREC(Publish Received), PUBREL(Publish Release), PUBCOMP(Publish Complete) 까지 4-way handshaking을 수행한다.

Lossless를 보장하는 TCP layer 위에서 운영하는 경우 이와 같은 QoS의 실효성이 의심스러울 수 있다. 또한 이 QoS 절차도 server-client 간의 절차로 아래처럼 QoS2를 사용하는 경우에도 최종단이 수신하기 전에 송신 절차는 종료된다.

이 부분은 다음과 같이 이해하여야 한다.

  • QoS0는 client가 전송한 메시지를 broker가 받았는지 확인이 불가능하다. 예를 들어 송신중 연결이 끊어진 경우 이 메시지가 상대방에 전달이 되었는지를 확인할 수 없다. 주기적으로 전송되는 온도 값과 같은 경우 이와 같은 방식으로 전달하여도 문제는 없을 것이다.
  • Broker 관점에서 QoS0 메시지는 별도로 queueing을 하지 않는다. QoS1/QoS2 의 경우 queueing 되어 offline 되어 있는 persistence session (아래 clean session 참고)이 이후 online 된 경우 전달할 수 있다.
  • QoS2의 경우 동일 메시지가 중복되어 전달되는 경우 심각한 문제를 야기할 수 있는 경우에 사용할 수 있다. QoS1의 경우 PUBACK를 broker가 응답하는 시점에서 연결이 끊어졌다면 송신측은 미전송이지만, 수신측은 정상적으로 수신한 상태가 된다.

WiFi와 같이 채널 연결이 쉽게 끊어질 수 있는 경우라면 QoS 설정에 대하여 충분한 고려가 되어야 할 것이나 보통은 서버의 queueing 필요성에 따라서 QoS0, QoS1 중 선택하여 보내면 될 것 같다.

각각의 client는 초기에 가장 연결 가능한브로커 MQTT CONNECT 시 자신이 받을 수 있는 최대 QoS를 지정할 수 있다. 이 경우 broker는 해당 client로 전송할 때 이 QoS보다 높은 경우 설정된 QoS로 낮추어 전송한다.

Others

Clean Session

Client는 CONNECT 시 cleanSession flag를 설정하여 보낼 수 있다. Persistence session을 유지하여야 하는 경우에는 이 flag를 false로 하여 보낸다. Broker는 이와 같은 persistence session을 요청하는 client에 대해서는 다음과 같은 정보를 저장 관리 하므로 연결이 끊어졌다 재 종료 시에도 재설정이 필요없다.

  • 모든 subscription
  • QoS1,2 (송수신) 메시지 중 해당 client가 응답하지 않은 메시지
  • Client가 offline 중 발생된 QoS1,2 메시지

표준에는 broker가 이들 정보를 얼마만큼의 시간동안 유지 시켜줄지는 규정되어 있지 않다. Client는 CONNECT ACK 메시지의 sessionPresent 필드로 이전 세션이 broker에 유지되고 있는지를 확인할 수 있다.

CONNECT 시 cleanSession을 true로 설정한 경우 broker는 해당 client에 대한 기존 유지되어 있던 session도 clear하고 향후 연결 종료시에도 session을 저장하지 않는다.

Retained Message

Client는 PUBLISH로 메시지를 전송 시 retained flag를 설정할 수 있다. 이 field가 true로 되어 있는 경우 broker는 해당 topic의 최종 메시지를 저장하여 차후 subscribe 되는 client가 있는 경우 이를 전송하여 준다.

새로 연결되어 subscribe하는 client 에게 최종 상태를 알려주는 용도로 사용할 수 있다.

lastWill

Client는 CONNECT 시 lastWill로 비정상용 publish 메시지를 설정할 수 있다. Client가 DISCONNECT와 같이 정상절차로 종료 되지 않고 비정상적으로 연결이 끊긴 경우 이 메시지를 subscriber에게 전송한다.

이를 이용하여 자신의 online, offline 여부를 알려주는 용도로 사용할 수 있을 것이다. 예를 들어 초기 connect시 lastWill message로 ’client/status’ topic 에 ‘offline’으로 payload를 설정해 두고, 처음에 ‘online’으로 publish를 한다면 비정상적으로 종료되는 경우 lastWill 메시지가 전송되어 subscriber는 상태를 알 수 있게 된다.

Keepalive

Client는 MQTT CONNECT 시 Keep Alive 필드를 이용하여 keep alive interval을 설정할 수 있다. 이 경우 client는 전송할 메시지가 없는 경우 connection 연장을 위하여 PINGREQ/PINGRESP 절차를 수행하여야 한다. Timeout이 되는 경우 broker는 연결을 끊고, lastWill 등의 처리를 해 줄 것이다.

참고로 여러 MQTT 서버를 연결하는 것도 bridge를 통하여 가능하다. Bridge는 MQTT client-server protocol 을 이용하여 MQTT broker 간의 메시지를 forwarding 하는 것으로 MQTT protocol 만으로 구현 가능하다. 물론 이 방법은 bridge로 forwarding 되는 메시지로 인하여 규모 확장에 문제가 될 수 있어 clustering 이 지원되는 broker를 검토해볼 필요가 있다.

기본적인 동작 시험은 설정이나 사용이 쉬운 Mosquitto MQTT broker를 이용하는 것이 좋다. Ubuntu 인 경우 아래처럼 mosquitto를 하거나, docker를 이용하여 설치해볼 수 있다.

Broker를 설치하면 같이 제공하는 mosquitto_sub, mosquitto_pub utility를 이용하여 subscribe, publish 를 시험해 볼 수 있다.

단말이 어느정도 제한된 리소스를 가진 기기이지만, proxy 등의 도움없이 직접 public internet 접속이 가능하고, TCP, TLS 사용이 가능한 경우라면 MQTT를 검토해 볼 수 있을 것이다. TCP 연결 방식이고 모든 연결은 broker를 통하는 방식이라 NAT 상에서도 문제없이 사용가능하다.

메타 트레이더 4 연결 마법사

EA

고위험 경고: 외환 거래는 모든 투자자에게 적합하지 않을 수 있는 높은 수준의 위험을 수반합니다. 레버리지는 추가적인 위험 및 손실 노출을 만듭니다. 외환 거래를 결정하기 전에 투자 목표, 경험 수준 및 위험 허용 오차를 신중하게 고려하십시오. 초기 투자의 일부 또는 전부를 잃을 수 있습니다. 잃을 여유가 없는 돈을 투자하지 마십시오. 외환 거래와 관련된 위험에 대해 스스로 교육하고 궁금한 점이 있으면 독립 금융 또는 세무사에게 조언을 구하십시오. 모든 데이터 및 정보는 정보 제공 목적으로만 있는 그대로 제공되며 거래 목적이나 조언을 위한 것이 아닙니다. 과거의 성과는 미래의 결과를 나타내는 것이 아닙니다.

EURUSD 1.02018 GBPUSD 1.22042
USDJPY 131.534 USDCAD 1.28719

We noticed that you're using an ad blocker. Myfxbook is a free website and is supported by ads. In order to allow us to keep developing Myfxbook, please whitelist the site in your ad blocker settings.


0 개 댓글

답장을 남겨주세요