瀏覽代碼

graceful shutdown of redis client

master
Blaz Smehov 4 天之前
父節點
當前提交
e14d8e0d97
共有 3 個文件被更改,包括 29 次插入7 次删除
  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 查看文件

@@ -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 查看文件

@@ -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 查看文件

@@ -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"),
} }
} }

Loading…
取消
儲存