Add indexer cache with River queue for scheduled refresh

This commit is contained in:
Alexander
2026-05-07 21:41:17 +02:00
parent 2041c154cf
commit 79f3f145de
22 changed files with 686 additions and 26 deletions
+50 -1
View File
@@ -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()