가장 연결 가능한브로커

마지막 업데이트: 2022년 7월 21일 | 0개 댓글
  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기
  • 카카오스토리 공유하기
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.

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이 아니기 때문에 예외 상황은 생길 수 있지만)에 한번 놀랐고, 내부 구조가 이렇게 복잡하다는데에 두번 놀랐다.

Azure HDInsight ID Broker(HIB)

이 문서에서는 Azure HDInsight ID Broker 기능을 설정하고 사용하는 방법을 설명합니다. 이 기능을 사용하면 Azure AD DS(Azure Active Directory Domain Services)에서 레거시 암호 해시 없이 다단계 인증을 적용하면서 Apache Ambari에 대한 최신 OAuth 인증을 가져올 수 있습니다.

HDInsight ID Broker는 다음과 같은 시나리오에서 복잡한 인증 설정을 간소화합니다.

  • 조직에서는 페더레이션을 사용하여 클라우드 리소스에 액세스하도록 사용자를 인증합니다. 이전에는 HDInsight Enterprise Security Package 클러스터를 사용하려면 온-프레미스 환경에서 Azure AD(Azure Active Directory)로 암호 해시 동기화를 사용하도록 설정해야 했습니다. 일부 조직에서는 이 요구 사항이 어렵거나 바람직하지 않을 수 있습니다.
  • 조직에서 Apache Ambari 및 기타 클러스터 리소스에 대한 가장 연결 가능한브로커 웹 기반 또는 HTTP 기반 액세스를 위한 다단계 인증을 적용하려고 합니다.

HDInsight ID Broker는 암호 해시를 Azure AD DS에 동기화할 필요 없이 OAuth(최신)에서 Kerberos(레거시)로 프로토콜을 전환할 수 있는 인증 인프라를 제공합니다. 이 인프라는 클러스터 게이트웨이 노드와 함께 HDInsight ID Broker 노드가 사용 설정된 Windows Server 가상 머신(VM)에서 실행되는 구성 요소로 구성됩니다.

다음 표를 사용하여 조직의 요구 사항에 가장 부합하는 인증 옵션을 확인하세요.

인증 옵션 HDInsight 구성 고려할 요인
완전 OAuth Enterprise Security Package + HDInsight ID Broker 가장 안전한 옵션입니다. (다단계 인증이 지원됩니다.) 암호 해시 동기화는 필요하지 ‘않습니다’. Azure AD DS에 암호 해시가 없는 온-프레미스 계정에 대한 ssh/kinit/keytab 액세스는 없습니다. 클라우드 전용 계정은 여전히 ssh/kinit/keytab을 통해 연결할 수 있습니다. OAuth를 통한 Ambari에 대한 웹 기반 액세스입니다. OAuth를 지원하려면 레거시 앱(예: JDBC/ODBC)을 업데이트해야 합니다.
OAuth + 기본 인증 Enterprise Security Package + HDInsight ID Broker OAuth를 통한 Ambari에 대한 웹 기반 액세스입니다. 레거시 앱은 기본 인증을 계속 사용합니다. 기본 인증 액세스를 위해서는 다단계 인증을 사용하지 않도록 설정해야 합니다. 암호 해시 동기화는 필요하지 ‘않습니다’. Azure AD DS에 암호 해시가 없는 온-프레미스 계정에 대한 ssh/kinit/keytab 액세스는 없습니다. 클라우드 전용 계정은 여전히 ssh/kinit를 통해 연결할 수 있습니다.
완전 기본 인증 Enterprise Security Package 온-프레미스 설정과 가장 유사합니다. Azure AD DS에 대한 암호 해시 동기화가 필요합니다. 온-프레미스 계정은 ssh/kinit 또는 keytab을 통해 연결할 수 있습니다. 백업 스토리지가 Azure 가장 연결 가능한브로커 Data Lake Storage Gen2인 경우 다단계 인증을 사용하지 않도록 설정해야 합니다.

다음 다이어그램은 HDInsight ID Broker를 사용하도록 설정한 후 페더레이션된 사용자를 포함하여 모든 사용자에 대한 최신 OAuth 기반 인증 흐름을 보여 줍니다.

Diagram that shows authentication flow with HDInsight ID Broker.

이 다이어그램에서 클라이언트(브라우저 또는 앱)는 먼저 OAuth 토큰을 획득해야 합니다. 그런 다음 HTTP 요청에서 게이트웨이에 토큰을 제공합니다. Azure Portal과 같은 다른 Azure 서비스에 이미 로그인한 경우 Single Sign-On 환경을 사용하여 HDInsight 클러스터에 로그인할 수 있습니다.

기본 인증(즉, 사용자 이름 및 암호)만 지원하는 많은 레거시 애플리케이션이 있을 수 있습니다. 이와 같은 시나리오의 경우 여전히 HTTP 기본 인증을 사용하여 클러스터 게이트웨이에 연결할 수 있습니다. 이 설정에서는 게이트웨이 노드에서 직접 시야를 확보할 수 있도록 게이트웨이 노드에서 AD FS(Active Directory Federation Services) 엔드포인트로의 네트워크 연결을 확인해야 합니다.

다음 다이어그램은 페더레이션된 사용자에 대한 기본 인증 흐름을 보여 줍니다. 먼저 게이트웨이는 ROPC 흐름을 사용하여 인증을 완료하려고 시도합니다. Azure AD에 동기화된 암호 해시가 없는 경우 AD FS 엔드포인트를 다시 검색하고 AD FS 엔드포인트에 액세스하여 인증을 완료합니다.

Diagram that shows architecture with basic authentication.

HDInsight ID Broker 사용

HDInsight ID Broker가 사용 설정된 Enterprise Security Package 클러스터를 만들려면:

    에 로그인합니다.
  1. Enterprise Security Package 클러스터에 대한 기본 만들기 단계를 수행합니다. 자세한 내용은 Enterprise Security Package로 HDInsight 클러스터 만들기를 참조하세요.
  2. 가장 연결 가능한브로커
  3. HDInsight ID Broker 사용을 선택합니다.

HDInsight ID Broker 기능은 클러스터에 하나의 추가 VM을 추가합니다. 이 VM은 HDInsight ID Broker 노드이며 인증을 지원하는 서버 구성 요소를 포함합니다. HDInsight ID Broker 노드는 Azure AD DS 도메인에 가입된 도메인입니다.

Diagram that shows option to enable HDInsight ID Broker.

Azure 리소스 관리자 템플릿 사용

다음 특성이 있는 idbrokernode 라는 새 역할을 템플릿의 컴퓨팅 프로필에 추가하면 HDInsight ID Broker 노드가 사용 설정된 클러스터가 생성됩니다.

ARM 템플릿의 전체 샘플을 보려면 여기에 게시된 템플릿을 참조하세요.

도구 통합

HDInsight 도구는 기본적으로 OAuth를 지원하도록 업데이트됩니다. 클러스터에 대한 최신 OAuth 기반 액세스에 이 도구를 사용하세요. HDInsight IntelliJ 플러그 인은 Scala와 같은 Java 기반 애플리케이션에 사용할 수 있습니다. Visual Studio Code용 Spark 및 Hive 도구는 PySpark 및 Hive 작업에 사용할 수 있습니다. 이 도구는 일괄 작업과 대화형 작업을 모두 지원합니다.

Azure AD DS에서 암호 해시가 없는 SSH 액세스

SSH 옵션 고려할 요인
로컬 VM 계정(예: sshuser) 클러스터를 만드는 동안 이 계정을 제공했습니다. 이 계정에 대한 Kerberos 인증이 없습니다.
클라우드 전용 계정(예: [email protected]) 암호 해시는 Azure AD DS에서 사용할 수 있습니다. Kerberos 인증은 SSH Kerberos를 통해 가능합니다.
온-프레미스 계정(예: [email protected]) SSH Kerberos 인증은 Azure AD DS에서 암호 해시를 사용할 수 있는 경우에만 가능합니다. 그렇지 가장 연결 가능한가장 연결 가능한브로커 브로커 않으면 이 사용자는 클러스터에 SSH를 통해 연결할 수 있습니다.

도메인 가입 VM에 SSH를 통해 연결하거나 kinit 명령을 실행하려면 암호를 제공해야 합니다. SSH Kerberos 인증을 사용하려면 Azure AD DS에서 해시를 사용할 수 있어야 합니다. 관리 시나리오에만 SSH를 사용하려는 경우 클라우드 전용 계정을 하나 만들어 클러스터에 SSH를 통해 연결하는 데 사용할 수 있습니다. 다른 온-프레미스 사용자는 Azure AD DS에서 암호 해시를 사용할 수 없는 경우에도 Ambari 또는 HDInsight 도구나 HTTP 기본 인증을 사용할 수 있습니다.

조직에서 Azure AD DS에 암호 해시를 동기화하지 않는 경우 Azure AD에서 하나의 클라우드 전용 사용자를 만드는 것이 가장 좋습니다. 그런 다음 클러스터를 만들 때 이를 클러스터 관리자로 할당하고 관리 목적으로 사용합니다. 이를 사용하면 SSH를 통해 VM에 대한 루트 액세스 권한을 가져올 수 있습니다.

인증 문제를 해결하려면 이 가이드를 참조하세요.

HDInsight ID Broker로 HDInsight 게이트웨이에 연결하기 위해 OAuth를 사용하는 클라이언트

HDInsight ID Broker 설정에서 게이트웨이에 연결하는 사용자 지정 앱 및 클라이언트를 업데이트하여 필요한 OAuth 토큰을 먼저 획득할 수 있습니다. 이 문서의 단계에 따라 다음 정보를 사용하여 토큰을 가져옵니다.

  • OAuth 리소스 uri: https://hib.azurehdinsight.net
  • AppId: 7865c1d2-f040-46cc-875f-831a1ef6a28a
  • 권한: (이름: Cluster.ReadWrite, id: 8f89faa0-ffef-4007-974d-4989b39ad77d)

OAuth 토큰을 획득한 후에는 클러스터 게이트웨이에 대한 HTTP 요청의 인증 헤더(예: https://-int.azurehdinsight.net)에 이 토큰을 사용합니다. Apache Livy API에 대한 샘플 curl 명령은 다음 예와 같이 표시될 수 있습니다.

Beeline 및 Livy를 사용하는 경우 여기에 제공된 샘플 코드를 따라 OAuth를 사용하도록 클라이언트를 설정하고 클러스터에 연결할 수도 있습니다.

AAD의 HDInsight에서 만든 앱은 무엇인가요?

각 클러스터에 대해 타사 애플리케이션은 identifierUri(예: https://clustername.azurehdinsight.net )로 클러스터 uri를 사용하여 AAD에 등록됩니다.

HIB가 사용 설정된 클러스터를 사용하기 전에 사용자에게 동의를 요청하는 이유는 무엇인가요?

AAD에서 사용자를 인증하거나 데이터에 액세스하기 전에 모든 타사 애플리케이션에 대한 동의가 필요합니다.

동의를 프로그래밍 방식으로 승인할 수 있나요?

Microsoft Graph API를 사용하면 동의를 자동화할 수 있습니다. API 문서를 참조하세요. 동의를 자동화하는 순서는 다음과 같습니다.

ACA 개인 및 가족 건강 보험 에 대해 살펴보세요.

가장 적합한 담당자와 연결시켜 드리고 온라인 도구 및 자료를 제공하여 나에게 딱 맞는 건강 보험 플랜을 찾을 수 있도록 도와드립니다.

건강 보험을 위한 피크의 Connect for Health 보조금을 받을 자격이 되시나요?

'오바마케어'라고도 불리는 ACA 덕분에 이제는 모든 사람이 건강 보험에 가입할 수 있습니다. 이것은 월 보험료가 대폭 절감될 수 있음을 의미합니다.

보조금 적용 플랜을 여기에서 확인하세요

피크의 개인 & 가족 건강 보험 마켓플레이스.

연방 정부는 개인 및 가족 건강 보험 마켓플레이스나 거래소에서 연중 내내 보험 가입자가 저렴하게 보험을 이용할 수 있도록 보조금을 제공합니다. 보험료가 매년 조정됨에 따라 가장 연결 가능한브로커 지원받을 수 있는 비용도 조정됩니다. 즉, 보험료가 오르면 이를 지원하는 보조금도 오르게 됩니다. 이러한 보조금은 의료비를 저렴하게 유지할 수 있도록 적절히 조정되는 하나의 안전망 역할을 한다고 볼 수 있습니다.

건강 보험 보조금은 다음과 같은 기준에 따라 자격 여부가 결정됩니다.

연방 보조금은 선급 보험료 세액 공제(APTC) 형태로 제공되며, 메디케이드 또는 메디케어 자격이 되거나 고용주를 통해 저렴한 보장을 제공받는 사람은 이용할 수 없습니다.

콜로라도주는 Connect for Health Colorado라는 자체 거래소를 통해 비용 절감 혜택을 제공합니다. 이 거래소에서 월 건강 보험료를 낮춰주는 보조금이 적용된 Bright HealthCare 상품이 판매됩니다. 더 궁긍한 점이 있더라도 걱정 마세요. Bright HealthCare에서 보조금 자격 여부를 파악할 수 있도록 도와드립니다.

IFP 특별 가입

IFP 특별 가입

인생은 빠르게 변할 수 있습니다. 보험에 가입하여 변화에 대비하세요!

출산을 하거나 고용주가 제공하는 건강 보험 플랜에서 탈퇴하는 등 커다란 삶의 변화로 인해 특별 가입 기간을 이용할 자격이 생길 수 있습니다. 지금 보험이 필요하시면 Bright HealthCare의 플랜을 확인하거나 브로커에게 연락하여 적절한 조언을 받으세요.

PubSub+
Event Broker

모든 환경에서 실행할 수 있는 소프트웨어, 목적지향적 하드웨어 및 관리형 서비스를 함께 활용하여 분산되어 있는 기업 전체에 event를 스트리밍할 수 있는 유일한 통합 event broker 기술입니다.

PubSub+ Event Broker는 처리량이 어마어마한 트랜잭션을 빛의 속도로 처리할 수 있게 해줍니다."

Harmeen, Airtel

Event-driven 혁신을 가능하게 하는 PubSub+ Event Broker

Solace PubSub+ Event Broker는 cloud, 온프레미스 및 IoT 환경 전반에서
event와 정보를 효율적으로 스트리밍합니다. PubSub+의 '+'는 게시/구독을 넘어 요청/응답, 스트리밍과 재생을 비롯한 다양한 message 교환 패턴뿐 아니라 최고의 전송과 전송 보장(guaranteed delivery) 등 다양한 서비스 품질을 지원한다는 의미입니다. PubSub+는 Appliance, 소프트웨어 및 서비스 형태로 제공되며, 모두 동일한 기능과 관리 환경을 제공합니다.

Event Mesh를 구축하여 어디서나 데이터 공유

PubSub+는 event broker에 연결하여 event mesh(비 cloud, 프라이빗 cloud, 퍼블릭 cloud 등 배포된 곳과 관계없이 애플리케이션 간 동적 event 라우팅을 가능하게 하는 아키텍처 레이어)를 생성할 수 있게 해주며, 이를 통해 microservice를 연결 및 조정하고, 온프레미스 기록 시스템의 event를 cloud 서비스로 푸시하고, LoB와 IoT 모두에서 디지털 혁신을 실현할 수 있습니다.

Solace PubSub+ Event Broker가 PaaS, iPaaS 및 기타 기술과 event mesh를 생성하는 방식을 보여주는 다이어그램

세 가지 적용 방식

Event Broker: Cloud

Cloud

Event Broker: Cloud는 관리형 서비스입니다. Messaging 인프라 운영은 Solace에게 맡기고 단 몇 분만에 event broker 서비스를 시작하여 원하는 만큼 확장해보세요. 지금 무료로 사용해보세요.

Event Broker: Software

소프트웨어

Event Broker: Software는 고객이 선호하는 cloud, 컨테이너와 iPaaS/PaaS 환경에 손쉽게 배포할 수 있습니다. 지금 바로 제작에 활용 가능한 무료 에디션을 사용해보세요.

Event Broker: Hardware

Event Broker: Hardware는 턴키 기기의 손쉬운 운영과 낮은 TCO로 최고의 성능과 용량을 제공하는 컴팩트한 형태의 서비스입니다.가장 연결 가능한브로커

[번역] 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)

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


0 개 댓글

답장을 남겨주세요