[nats] Request-Reply
Request-Reply ํจํด์ ๊ธฐ์กด์ ๋ฉ๋ชจ๋ฆฌ ํ ์์คํ ๊ณผ ์ฐจ๋ณํ๋๋ nats์ pub/sub ํ์ฅ๊ธฐ๋ฅ ์ค ํ๋๋ค.
์ด๋ฅผ ์ด์ฉํ๋ฉด ์น์๋ฒ์ฒ๋ผ ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ต์ ๋ฐ์์ค๋ ์์ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
๋๊ธฐ์ ์ผ๋ก ์ฌ์ฉํ ์๋, ๋น๋๊ธฐ์ ์ผ๋ก ์ฌ์ฉํ ์๋ ์๋ค.

๋จผ์ CLI๋ฅผ ์ฌ์ฉํด์ ์๋ต ํํ๋ฅผ ๋ง๋ค์ด๋ณด๊ฒ ๋ค.
์๋๋ help.please๋ผ๋ ์์ฒญ์ด ๋ ๋ผ์ฌ ๊ฒฝ์ฐ 'OK, I CAN HELP!!!'๋ฅผ ์๋ต์ผ๋ก ๋ฐํํด์ฃผ๋ ์๋ต์ด๋ค.
nats reply --server nats://localhost:4222 help.please 'OK, I CAN HELP!'
์ด๋ฌ๋ฉด ์ผ๋จ ๋๊ธฐ์ค์ด ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์๊ณผ ๊ฐ์ด ์์ฒญ์ ๋ ๋ฆฐ๋ค.
nats request --server nats://localhost:4222 help.please 'I need help!'
๊ทธ๋ฌ๋ฉด reply์์ ๋ณด๋ด์ค ๋ฉ์ธ์ง๊ฐ request ์ธก์์ ๋ณด์ผ ๊ฒ์ด๊ณ
request์์ ๋ณด๋ด์ค ๋ฉ์ธ์ง๋ reply ์ธก์์ ๋ณด์ผ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๊ฑด pub/sub๊ณผ ๋ค๋ฅด๊ฒ, reply๊ฐ ์ฌ๋ฌ๊ฐ๋ผ๋ ํ๋๋ง ์ ์ ๋ผ์ ์ฒ๋ฆฌ๋๋ค.
์๋๋ ํ ์ฃผ์ ์ ๋ํด 2๊ฐ์ง "reply"๋ฅผ ์ ์ํ๊ณ request๋ฅผ ๋ ๋ ธ์ ๋ ๋ฐ์ํ๋ ๋์์ด๋ค.
๊ทธ๋ฅ ๋๋ค์ผ๋ก ํ๋์ฉ ํธ์ถํด์ ๋ฐ์์จ๋ค.
์ด๊ฑธ ์ด์ฉํ๋ฉด HTTP ์๋ฒ์ ๋น์ค๋ฌด๋ฆฌํ ๊ธฐ๋ฅ๋ค์ ๊ตฌํํ ์๋ ์๋ค.
์๋๋ ๋ง์
์ ์ํํด์ฃผ๋ "add"๋ผ๋ ์ฃผ์ ๋ฅผ ๋ง๋ค๊ณ ์ฌ์ฉํ๋ ๊ฐ๋จํ ์์ ๋ค.
์ธ์ด๋ Go๋ค. ํน๋ณํ ์ด์ ๋ ์๋ค.
reply ํ๋ก์ธ์ค๋ ์์ฒญ์ด ์์ ๊ฒฝ์ฐ์ ์๋ต์ ์ฒ๋ฆฌํ๋ค.
๋ฉ์ธ์ง์์ ์ธ์ ๋ชฉ๋ก์ ์ผํ ๊ตฌ๋ถ์ผ๋ก ๋ฐ๊ณ , ๋ํด์ ๊ฒฐ๊ณผ๋ฅผ ์๋ ค์ค๋ค.
package main
import (
"fmt"
"strconv"
"strings"
"github.com/nats-io/nats.go"
)
func main() {
client, _ := nats.Connect(nats.DefaultURL)
// Reply
client.Subscribe("add", func(m *nats.Msg) {
input := string(m.Data)
operands := strings.Split(input, ",")
lhs, lhsErr := strconv.ParseInt(operands[0], 10, 64)
rhs, rhsErr := strconv.ParseInt(operands[1], 10, 64)
if lhsErr != nil || rhsErr != nil {
client.Publish(m.Reply, []byte("I can't help!"))
return
}
sum := lhs + rhs
pubMessage := fmt.Sprintf("Sum is %d", sum)
pubError := client.Publish(m.Reply, []byte(pubMessage))
if pubError != nil {
fmt.Println(pubError)
}
})
fmt.Println("replier is running")
for {
}
}
request ํ๋ก์ธ์ค๋ ์ด์ ๋นํด ๊ฐ๋จํ๋ค.
์ฃผ์ ๋ช
๊ณผ ๋ฉ์ธ์ง, ํ์์์์ ์ ๋ฌํ๋ค.
ํ์์์ ์๊ฐ๋์์ reply๊ฐ ๊ตฌ์ฑ๋์ด์์ง ์๊ฑฐ๋ ๋ต์ด ์ค์ง ์๋๋ผ๋ ๊ธฐ๋ค๋ฆฐ๋ค.
package main
import (
"fmt"
"time"
"github.com/nats-io/nats.go"
)
func main() {
client, _ := nats.Connect(nats.DefaultURL)
message, err := client.Request("add", []byte("10,20"), 100*time.Millisecond)
fmt.Println("replier received a reply")
fmt.Println(string(message.Data))
if err != nil {
fmt.Println(err)
panic(err)
}
}
reply๋ฅผ ์คํํด๋๊ณ

๋ฉ์ธ์ง๊ฐ ์ด๋ ๊ฒ ๋ ๋ผ์ค๋ฉด ์ ๋ ๊ฒ์ด๋ค.

์ฐธ์กฐ
์์ฒญ-ํ์ - NATS ๋ฌธ์