반응형
모델 종류
- 발행/구독(publish - and - subscribe) 모델
1: 다 - 모든 클라이언트에게 모든 메시지의 사본을 전달.
publisher -> topic -> subscriber
-> subscriber
-> subscriber
- 지점간 연결(point - to - point) 모델
1:1 - 하나의 메시지는 하나의 클라이언트에만 전송(큐는 공유 가능)
sender -> queue -> receiver
위의 모델 중에 publish - and - subscribe(pub - sub) 모델에 대해서 알아보자!
pub/sub 구조
보통의 message queue들은 publisher - message broker(topic) - subscriber 구조를 사용한다.
publisher(message data)를 하면 가운데 있는 message broker가 메시지를 선택하고 처리하는 즉, 내부적으로 구독하고 있는
subscriber들을 찾아서 메시지를 보낸다.
pub/sub 구현(w/go lang)
그러면 pub/sub 모델을 구현한다고 생각해보자.
우선은 메시지큐 server가 필요하겠다. 그리고 그 서버를 붙는 client도 필요하다.
보통 jms, nats, amazon sqs 등등이 서버가 되겠다. client는 제공되어지는 publish()등의 함수가 있는 lib 정도.
ex) 메시지 큐 동작 과정
- 클라이언트가 NATS 서버와의 TCP / IP 소켓 연결을 설정.
- nc, _ := nats.Connect(nats.DefaultURL)
- 발행
- nc.Publish("foo", []byte("Hello World"))
- 구독 (subject가 구독대상 : foo)
// Simple Async Subscriber
nc.Subscribe("foo", func(m *nats.Msg) {
fmt.Printf("Received a message: %s\n", string(m.Data))
})
// Simple Sync Subscriber
sub, err := nc.SubscribeSync("foo")
m, err := sub.NextMsg(timeout)
- 구독 해제(Sync Subscriber 일 경우에만)
// Unsubscribe
sub.Unsubscribe()
5. defer nc.Close()
func TestNatsWorking(t *testing.T) {
nc, _ := nats.Connect(nats.DefaultURL)
defer nc.Close()
// Simple Publisher
nc.Publish("foo", []byte("Hello World"))
// Simple Async Subscriber
nc.Subscribe("foo", func(m *nats.Msg) {
fmt.Printf("Received a message: %s\n", string(m.Data))
})
}
|
반응형
'역량 UP! > Architecture' 카테고리의 다른 글
마이크로서비스 아키텍처(Microservice Architecture) (0) | 2021.02.03 |
---|---|
SOLID (object-oriented design) (0) | 2014.02.26 |
[소프트웨어 아키텍처 이론과 실체] 아키텍트로 가기 위한 필독서!! (0) | 2013.11.24 |
DTP(Distribution Transaction Processing) 관련 자료 (0) | 2013.06.08 |
ACE-T의 아키텍트 이야기 (0) | 2013.01.28 |