Add indexer cache with River queue for scheduled refresh
This commit is contained in:
@@ -10,12 +10,17 @@ import (
|
||||
|
||||
"github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/logging"
|
||||
"github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/recovery"
|
||||
"github.com/jackc/pgx/v5"
|
||||
"github.com/jackc/pgx/v5/pgxpool"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"github.com/prometheus/client_golang/prometheus/promhttp"
|
||||
"github.com/riverqueue/river"
|
||||
"github.com/riverqueue/river/riverdriver/riverpgxv5"
|
||||
"github.com/rs/zerolog"
|
||||
"github.com/rs/zerolog/log"
|
||||
"google.golang.org/grpc"
|
||||
"google.golang.org/grpc/codes"
|
||||
"google.golang.org/grpc/reflection"
|
||||
"google.golang.org/grpc/status"
|
||||
"gopkg.in/yaml.v2"
|
||||
|
||||
@@ -63,6 +68,38 @@ func interceptorLogger(l zerolog.Logger) logging.Logger {
|
||||
})
|
||||
}
|
||||
|
||||
func setupRiver(ctx context.Context, cfg config.Config) (*river.Client[pgx.Tx], *pgxpool.Pool) {
|
||||
if !cfg.Indexer.Cache.Enabled {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
dbPool, err := pgxpool.New(ctx, cfg.Database.URL)
|
||||
if err != nil {
|
||||
log.Fatal().Err(err).Msg("failed to connect to database for River")
|
||||
}
|
||||
|
||||
workers := river.NewWorkers()
|
||||
river.AddWorker(workers, &indexer.CacheRefreshWorker{})
|
||||
|
||||
riverClient, err := river.NewClient(riverpgxv5.New(dbPool), &river.Config{
|
||||
Queues: map[string]river.QueueConfig{
|
||||
river.QueueDefault: {MaxWorkers: 2},
|
||||
},
|
||||
Workers: workers,
|
||||
})
|
||||
if err != nil {
|
||||
log.Fatal().Err(err).Msg("failed to create River client")
|
||||
}
|
||||
|
||||
if err := riverClient.Start(ctx); err != nil {
|
||||
log.Fatal().Err(err).Msg("failed to start River client")
|
||||
}
|
||||
|
||||
log.Info().Msg("River queue started")
|
||||
|
||||
return riverClient, dbPool
|
||||
}
|
||||
|
||||
func serveGrpc(config config.Config) {
|
||||
srvMetrics := grpcprom.NewServerMetrics(
|
||||
grpcprom.WithServerHandlingTimeHistogram(
|
||||
@@ -94,7 +131,17 @@ func serveGrpc(config config.Config) {
|
||||
),
|
||||
)
|
||||
|
||||
indexerServer, err := indexer.NewIndexerServer(config)
|
||||
ctx := context.Background()
|
||||
riverClient, dbPool := setupRiver(ctx, config)
|
||||
if dbPool != nil {
|
||||
defer dbPool.Close()
|
||||
}
|
||||
|
||||
musiscAgregatorSeerver, err := internal.NewMusicAgregatorServer(config, riverClient)
|
||||
if err != nil {
|
||||
log.Fatal().Err(err).Msg("failed to create MusicAgregatorServer")
|
||||
}
|
||||
indexerServer, err := indexer.NewIndexerServer(config, riverClient)
|
||||
if err != nil {
|
||||
log.Fatal().Err(err).Msg("failed to create IndexerServer")
|
||||
}
|
||||
@@ -112,6 +159,7 @@ func serveGrpc(config config.Config) {
|
||||
indexerServer,
|
||||
torrentServer,
|
||||
metadataServer,
|
||||
musiscAgregatorSeerver,
|
||||
}
|
||||
|
||||
for _, service := range services {
|
||||
@@ -120,6 +168,7 @@ func serveGrpc(config config.Config) {
|
||||
|
||||
srvMetrics.InitializeMetrics(server)
|
||||
prometheus.MustRegister(srvMetrics)
|
||||
reflection.Register(server)
|
||||
|
||||
go func() {
|
||||
mux := http.NewServeMux()
|
||||
|
||||
Reference in New Issue
Block a user