Education*
Devops
Architecture
F/B End
B.Chain
Basic
Others
Books*
CLOSE
Search For:
Search
BY TAGS
linux
HTTP
golang
flutter
java
fintech
개발환경
kubernetes
network
Docker
devops
database
tutorial
cli
분산시스템
www
블록체인
AWS
system admin
bigdata
보안
금융
msa
mysql
redis
Linux command
dns
javascript
CICD
VPC
FILESYSTEM
S3
NGINX
TCP/IP
ZOOKEEPER
NOSQL
IAC
CLOUD
TERRAFORM
logging
IT용어
Kafka
docker-compose
Dart
NATS
Recommanded
Free
YOUTUBE Lecture:
<% selectedImage[1] %>
yundream
2022-10-29
2022-09-10
1420
## Overviews NATS는 분산 시스템을 지원하는 연결기술(connective technology)로 메시지의 주소 설정, 검색, 통신을 담당한다. 마이크로서비스아키텍처(MSA)에서의 메시지 교환, 스트림 처리를 위해서 사용한다. 주요 사용처는 아래와 같다. * 클라우드 메시징 * 서비스 (마이크로서비스, 서비스메시) * 이벤트 / 데이터 스트림(데이터 모니터링, 분석, ML/AI) * Command and Control * IoT & Edge * Telemetry / 센서 데이터 / Command and Control * 레거시 메시징 시스템의 확장 또는 교체 ## 디자인 NATS를 이용하면 애플리케이션의 위치에 상관없이 쉽게 메시지를 주고 받을 수 있다. 메시지는 토픽(Topic)을 기반으로 식별되며, 애플리케이션의 종류와 디바이스의 종류에 상관 없이 통신이 가능하다. 메시지는 PUB/SUB(게시/구독) 패턴을 따르며, 한명 이상의 구독자가 메시지를 수신 할 수 있다.  이런 단순한 디자인을 통해서 애플리케이션은 메시지 처리 코드를 공유하고 상호관심사항을 분리하며, 메시지 요청량의 증가를 쉽게 처리할 수 있도록 확장할 수 있다. ## QoS **NATS JetStream**기능을 활성화하여 애플리케이션 특성에 맞는 QoS 정책을 선택 할 수 있다. * **At most once QoS** : NATS는 **최대 한번**의 QoS를 제공한다. 구독자가 Topic에 연결하지 않은 상태에서 메시지가 전송되면, (나중에 접속하더라도) 수신되지 않는다. 이것은 TCP/IP가 제공하는 것과 동일한 수준의 QoS다. **Fire and Forget** 메시징 시스템인 것이다. 메시지는 메모리에만 저장되지 디스크에 쓰지는 않는다. * **At-least / exactly once QoS** : 메시지는 디스크에 저장되며, 이를 통하여 **최소한 한번 및 정확히 한번**과 같은 더 높은 QoS를 사용 할 수 있다. 이 QoS를 이용하면 안정적으로 메시지를 처리하는 애플리케이션을 개발 할 수 있다. ## Subject-Based messaging 기본적으로 NATS는 PUB/SUB 기반으로 작동하며, 이는 Subject(Topic 이라고 하기도한다)에 의존한다. ### Subject 란 게시자와 구독자가 서로를 찾는데 사용 할 수 있는 **이름(문자열)** 이다.  ### Subject 계층 Subject는 "." 을 이용해서 계층적으로 구성할 수 있다. 예를 들어 time subject는 아래와 같이 정의 할 수 있다. ``` time.us time.us.east time.us.east.atlanta time.eu.east time.eu.warsaw ``` ### Single Token 매칭 와일드카드(\*)는 단일 토큰과 일치한다. 예를 들어서 모든 지역의 동부(east)시간대를 구독하고 싶다면 **time.\*.east**를 설정하면 된다. 이 경우 time.us.east, time.eu.east 를 구독하게 된다.  ### Multiple Tokens 매칭 **>** 는 하나 이상의 토큰과 일치하며, subject의 마지막에만 사용 할 수 있다. 예를 들어 time.us.> 는 time.us.east, time.us.east.atlanta 와 일치한다. time.us.\* 은 single token만 매칭되기 때문에 time.us.east 만 구독 할 수 있다.  ## Publish - Subscribe NATS는 일대다 통신을 위한 publish-subscribe 메시지 배포 모델의 구현체다. 게시자는 subject에 메시지를 보내고, subject를 구독 중인 한명 이상의 구독자가 메시지를 받는다.  메시지는 아래와 같이 구성된다. 1. subject 2. 바이트 배열 형태의 페이로드(payload). 전송가능한 메시지의 크기는 1MB가 기본설정으로 64MB까지 늘릴 수 있다. 3. 헤더 필드 4. replay 주소 필드 : 옵션 ## JetStream NATS는 Publish-Subscribe의 구현체로 이는 NATS의 핵심(Core) 기능이다. 하지만 이 Core 기능은 **Fire and Forget**방식으로 작동하기 때문에 persistence 시스템, QoS와 같은 좀 더 나은 기능이 필요하다. **JetStream**은 내장형 분산 지속성(persistence) 시스템이다. 기본 내장되어 있기 때문에 필요할 때 활성화 해서 기능을 확장 할 수 있다. JetStream은 내용이 방대하기 때문에 별도의 문서에서 자세히 다루도록 하겠다. ## NATS 테스트 애플리케이션 예제 NATS 테스트를 위해서 간단한 채팅 프로그램을 만들었다. ### NATS Server 설치 docker 기반으로 설치했다. ``` # docker run --name nats-test -p 4444:4444 nats [1] 2022/09/10 06:02:56.134643 [INF] Starting nats-server [1] 2022/09/10 06:02:56.134661 [INF] Version: 2.8.4 [1] 2022/09/10 06:02:56.134663 [INF] Git: [66524ed] [1] 2022/09/10 06:02:56.134664 [INF] Cluster: my_cluster [1] 2022/09/10 06:02:56.134665 [INF] Name: NDKULCPLHUDJA7DFWEDKUDW5ALMSBL4PVHRDR54ZGUF7P5JKV3G35SXC [1] 2022/09/10 06:02:56.134666 [INF] ID: NDKULCPLHUDJA7DFWEDKUDW5ALMSBL4PVHRDR54ZGUF7P5JKV3G35SXC [1] 2022/09/10 06:02:56.134669 [INF] Using configuration file: nats-server.conf [1] 2022/09/10 06:02:56.135039 [INF] Starting http monitor on 0.0.0.0:8222 [1] 2022/09/10 06:02:56.135468 [INF] Listening for client connections on 0.0.0.0:4222 [1] 2022/09/10 06:02:56.135567 [INF] Server is ready [1] 2022/09/10 06:02:56.135584 [INF] Cluster name is my_cluster [1] 2022/09/10 06:02:56.135597 [INF] Listening for route connections on 0.0.0.0:6222 ``` ### NATS Chatting Application ```go package main import ( "bufio" "fmt" "log" "os" "strings" "sync" "time" "github.com/nats-io/nats.go" ) func main() { fmt.Print("Subject > ") reader := bufio.NewReader(os.Stdin) subject, err := reader.ReadString('\n') if err != nil { log.Fatal(err) } subject = strings.TrimSuffix(subject, "\n") fmt.Print("Name > ") name, err := reader.ReadString('\n') if err != nil { log.Fatal(err) } name = strings.TrimSuffix(name, "\n") nc, err := nats.Connect("nats://172.17.0.3:4222", nats.Name("Test")) if err != nil { log.Fatal(err) } wg := sync.WaitGroup{} wg.Add(1) go func() { defer wg.Done() sub, err := nc.SubscribeSync(subject) if err != nil { log.Fatal(err) } for { msg, err := sub.NextMsg(10 * time.Second) if err != nil { } else { _, err = fmt.Printf("%s > %s", subject, string(msg.Data)) } } }() go func() { reader := bufio.NewReader(os.Stdin) for { msg, _ := reader.ReadString('\n') nc.Publish(subject, []byte(name+":"+msg)) } }() wg.Wait() } ```  ## NATS 기반 분산 Architecture 예제  E-Commerce 애플리케이션으로 Kubernetes 와 Docker로 배포를 하고 각 서비스간 통신에 **NATS Stream(JetStream)** 을 사용했다. 1. Auth : Session을 관리한다. 사용자 정보는 MySQL로 Session은 REDIS로 관리한다. 2. Orders : 사용자 주문을 관리하는 서비스다. 주문은 만료시간이 지나면 삭제된다. 3. Payment : 결재를 관리한다. Stripe API 혹은 Payment Gateway 서비스를 이용한다. 4. Expiration : 주문은 특정 시간동안만 유효하다. ## 참고 * [Microservice e-commerce app](https://github.com/SarthakJha/TicketX) * [채널톡 실시간 채팅 서버 개선 여정 - 2편 : Nats.io로 Redis 대체하기](https://channel.io/ko/blog/real-time-chat-server-2-redis-pub-sub)
Recent Posts
클라우드 엔지니어 면접을 위한 지식들 - 데이터베이스 1
클라우드 엔지니어 면접을 위한 지식들 - 네트워크
MySQL ALTER TABLE
가트너 선정 2023 년 10대 전략 기술 트랜드 분석 - 산업 클라우드 플랫폼
가트너 선정 2023 10대 전략 기술 트랜드 분석 - 적응형 AI
MySQL INDEX 관리
가트너 선정 2023 10대 전략 기술 트랜드 분석 - AI 신뢰, 위험, 보안관리
가트너 선정 2023 10대 전략 기술 트랜드 분석 - 슈퍼 앱
Minikube 와 함께하는 Kubernetes Study - 목차
Minikube 와 함께하는 Kubernetes Study 5 - Helm
Archive Posts
2023 (30)
1Q (30)
2022 (56)
1Q (1)
2Q (1)
3Q (33)
4Q (21)
2021 (39)
1Q (4)
2Q (14)
3Q (16)
4Q (5)
2020 (71)
1Q (19)
2Q (19)
3Q (19)
4Q (14)
2019 (97)
1Q (10)
2Q (30)
3Q (42)
4Q (15)
2018 (93)
1Q (16)
2Q (28)
3Q (38)
4Q (11)
2017 (136)
1Q (44)
2Q (31)
3Q (30)
4Q (31)
2016 (2237)
1Q (2189)
2Q (21)
3Q (12)
4Q (15)
2015 (21)
1Q (21)
Tags
cloud
messaging
msa
분산시스템
Copyrights © -
Joinc
, All Rights Reserved.
Inherited From -
Yundream
Rebranded By -
Joonphil
Recent Posts
Archive Posts
Tags