Parcourir la source

graceful shutdown of redis client

master
Blaz Smehov il y a 2 mois
Parent
révision
e14d8e0d97
3 fichiers modifiés avec 29 ajouts et 7 suppressions
  1. +3
    -4
      cmd/server/main.go
  2. +24
    -3
      internal/pkg/common/appcontext/context.go
  3. +2
    -0
      internal/pkg/config/config.go

+ 3
- 4
cmd/server/main.go Voir le fichier

@@ -47,10 +47,7 @@ func main() {
locationReader := appState.AddKafkaReader(cfg.KafkaURL, "locevents", "gid-loc-server") locationReader := appState.AddKafkaReader(cfg.KafkaURL, "locevents", "gid-loc-server")
alertsReader := appState.AddKafkaReader(cfg.KafkaURL, "alertbeacons", "gid-alert-serv") alertsReader := appState.AddKafkaReader(cfg.KafkaURL, "alertbeacons", "gid-alert-serv")


client := redis.NewClient(&redis.Options{
Addr: "127.0.0.1:6379",
Password: "",
})
client := appState.AddValkeyClient(cfg.ValkeyURL)


// Separate channel for location change? // Separate channel for location change?
chLoc := make(chan model.HTTPLocation, 200) chLoc := make(chan model.HTTPLocation, 200)
@@ -150,6 +147,8 @@ eventLoop:
fmt.Println("All go routines have stopped, Beggining to close Kafka connections") fmt.Println("All go routines have stopped, Beggining to close Kafka connections")
appState.CleanKafkaReaders() appState.CleanKafkaReaders()
appState.CleanKafkaWriters() appState.CleanKafkaWriters()
fmt.Println("All kafka clients shutdown, starting shutdown of valkey client")
appState.CleanValkeyClient()
} }


func beaconsListSingleHandler(appstate *appcontext.AppState) http.HandlerFunc { func beaconsListSingleHandler(appstate *appcontext.AppState) http.HandlerFunc {


+ 24
- 3
internal/pkg/common/appcontext/context.go Voir le fichier

@@ -6,6 +6,7 @@ import (
"time" "time"


"github.com/AFASystems/presence/internal/pkg/model" "github.com/AFASystems/presence/internal/pkg/model"
"github.com/redis/go-redis/v9"
"github.com/segmentio/kafka-go" "github.com/segmentio/kafka-go"
) )


@@ -18,6 +19,7 @@ type AppState struct {
latestList model.LatestBeaconsList latestList model.LatestBeaconsList
kafkaReadersList model.KafkaReadersList kafkaReadersList model.KafkaReadersList
kafkaWritersList model.KafkaWritersList kafkaWritersList model.KafkaWritersList
valkeyDB *redis.Client
} }


// NewAppState creates a new application context AppState with default values // NewAppState creates a new application context AppState with default values
@@ -53,6 +55,25 @@ func NewAppState() *AppState {
} }
} }


func (m *AppState) AddValkeyClient(url string) *redis.Client {
valkeyDB := redis.NewClient(&redis.Options{
Addr: url,
Password: "",
})

m.valkeyDB = valkeyDB
return valkeyDB
}

func (m *AppState) CleanValkeyClient() {
fmt.Println("shutdown of valkey client starts")
if err := m.valkeyDB.Close(); err != nil {
fmt.Println("Error in shuting down valkey client")
}

fmt.Println("Succesfully shutting down valkey client")
}

func (m *AppState) AddKafkaWriter(kafkaUrl, topic string) *kafka.Writer { func (m *AppState) AddKafkaWriter(kafkaUrl, topic string) *kafka.Writer {
kafkaWriter := &kafka.Writer{ kafkaWriter := &kafka.Writer{
Addr: kafka.TCP(kafkaUrl), Addr: kafka.TCP(kafkaUrl),
@@ -72,14 +93,14 @@ func (m *AppState) AddKafkaWriter(kafkaUrl, topic string) *kafka.Writer {
} }


func (m *AppState) CleanKafkaWriters() { func (m *AppState) CleanKafkaWriters() {
fmt.Println("clean of kafka readers starts")
fmt.Println("shutdown of kafka readers starts")
for _, r := range m.kafkaWritersList.KafkaWriters { for _, r := range m.kafkaWritersList.KafkaWriters {
if err := r.Close(); err != nil { if err := r.Close(); err != nil {
fmt.Printf("Error in closing kafka writer %v", err) fmt.Printf("Error in closing kafka writer %v", err)
} }
} }


fmt.Println("Kafka writers graceful cleanup complete")
fmt.Println("Kafka writers graceful shutdown complete")
} }


func (m *AppState) AddKafkaReader(kafkaUrl, topic, groupID string) *kafka.Reader { func (m *AppState) AddKafkaReader(kafkaUrl, topic, groupID string) *kafka.Reader {
@@ -106,7 +127,7 @@ func (m *AppState) CleanKafkaReaders() {
} }
} }


fmt.Println("Kafka readers graceful cleanup complete")
fmt.Println("Kafka readers graceful shutdown complete")
} }


// GetBeacons returns thread-safe access to beacons list // GetBeacons returns thread-safe access to beacons list


+ 2
- 0
internal/pkg/config/config.go Voir le fichier

@@ -12,6 +12,7 @@ type Config struct {
DBPath string DBPath string
KafkaURL string KafkaURL string
RedisURL string RedisURL string
ValkeyURL string
} }


// getEnv returns env var value or a default if not set. // getEnv returns env var value or a default if not set.
@@ -32,5 +33,6 @@ func Load() *Config {
MQTTClientID: getEnv("MQTT_CLIENT_ID", "presence-detector"), MQTTClientID: getEnv("MQTT_CLIENT_ID", "presence-detector"),
DBPath: getEnv("DB_PATH", "/data/conf/presence/presence.db"), DBPath: getEnv("DB_PATH", "/data/conf/presence/presence.db"),
KafkaURL: getEnv("KAFKA_URL", "127.0.0.1:9092"), KafkaURL: getEnv("KAFKA_URL", "127.0.0.1:9092"),
ValkeyURL: getEnv("VALKEY_URL", "127.0.0.1:6379"),
} }
} }

Chargement…
Annuler
Enregistrer