Как настроить реконект к nats на golang
пишу pub-sub сервис на golang с брокером nats, Мне необходимо настроить бесконечный реконнект в моём приложении. Часть кода приведена ниже.
func main(){
go ReadNats()
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
<-c
}
func ReadNats() {
var err error
durable := "backend"
stanCon, err := stan.Connect("ibis",uuid.NewV4().String(),stan.NatsURL("nats://172.16.16.250:4222"),stan.SetConnectionLostHandler(func(sc stan.Conn, reason error) {
fmt.Println("Connection lost, reason:", reason)
for reason != nil {
sc, reason = stan.Connect("ibis",uuid.NewV4().String(),stan.NatsURL("nats://172.16.16.250:4222"))
time.Sleep(time.Second)
}
}))
if err != nil {
fmt.Println("Cant connect")
} else {
fmt.Println("Connected")
}
sub, err := stanCon.QueueSubscribe("event","", func(msg *stan.Msg) {
mes := generator.Msg{}
json.Unmarshal(msg.Data, &mes)
fmt.Println(mes)
},stan.StartAtTimeDelta(time.Minute*10),
stan.DurableName(durable),
)
if err != nil {
fmt.Println(err)
}
fmt.Println(sub.ClearMaxPending())
signalChan := make(chan os.Signal, 1)
cleanupDone := make(chan bool)
signal.Notify(signalChan, os.Interrupt)
go func() {
for {
for range signalChan {
fmt.Printf("\nReceived an interrupt, unsubscribing and closing connection...\n\n")
if durable == "" {
sub.Unsubscribe()
}
stanCon.Close()
cleanupDone <- true
}
}
}()
<-cleanupDone
}
проблема в том, что приложение отказывается корректно реконнетиться спустя какой-то промежуток времени, то есть если nats упадет и поднимется в течении первых ~10 секунд, то всё пройдет успешно, но потом реконнект вроде как пройдет тоже, но сообщения уже приходить не будут.
Библиотеки для взаимодействия с nats, которые я использую:
"github.com/nats-io/stan.go"
"github.com/satori/go.uuid"
Ответы (1 шт):
Скорее всего проблема в количестве реконнектов.
Период реконнекта и количество попыток задаются при получении соединения. Если они не указаны явно, то есть дефолтные значения:
Default Nats Connection Constants
const (
Version = "1.9.1"
DefaultURL = "nats://127.0.0.1:4222"
DefaultPort = 4222
DefaultMaxReconnect = 60 - здесь меняется на оч большое число
DefaultReconnectWait = 2 * time.Second
DefaultTimeout = 2 * time.Second
DefaultPingInterval = 2 * time.Minute
DefaultMaxPingOut = 2
DefaultMaxChanLen = 8192 // 8k
DefaultReconnectBufSize = 8 * 1024 * 1024 // 8MB
RequestChanLen = 8
DefaultDrainTimeout = 30 * time.Second
LangString = "go"
)
Видно что дефолтных значений хватит на 2 мин отсутствия соединения.
Чтобы исправить ситуацию надо просто запросить больше реконнектов:
import (
nats "github.com/nats-io/nats.go"
stan "github.com/nats-io/stan.go"
)
bigInt := 1<<63 - 1 // очень большое число
nc, err := nats.Connect(natsURL, nats.MaxReconnects(bigInt))
nsc, err := stan.Connect(clusterID, clientID, stan.NatsConn(nc))