perf(go): cache realtime plate lookups

This commit is contained in:
lingniu
2026-07-03 07:42:24 +08:00
parent 9345fe60b5
commit 1c0d7dc03e
5 changed files with 124 additions and 2 deletions

View File

@@ -73,7 +73,11 @@ func main() {
healthChecks = append(healthChecks, health.Check{Name: "mysql", Check: db.PingContext})
closeStats = func() { _ = db.Close() }
bindingTable := env("VEHICLE_IDENTITY_TABLE", "vehicle_identity_binding")
snapshotWriter := realtime.NewSnapshotWriterWithPlateResolver(db, realtime.NewBindingPlateResolver(db, bindingTable))
plateResolver := realtime.NewCachedPlateResolver(
realtime.NewBindingPlateResolver(db, bindingTable),
time.Duration(envInt("PLATE_CACHE_TTL_SECONDS", 600))*time.Second,
)
snapshotWriter := realtime.NewSnapshotWriterWithPlateResolver(db, plateResolver)
if env("MYSQL_REALTIME_SNAPSHOT_ENABLED", "true") != "false" {
if err := snapshotWriter.EnsureSchema(ctx); err != nil {
_ = db.Close()
@@ -81,7 +85,7 @@ func main() {
os.Exit(1)
}
updater = compositeRealtimeUpdater{primary: repository, secondary: snapshotWriter}
logger.Info("realtime mysql snapshot enabled", "table", "vehicle_realtime_snapshot", "plate_binding_table", bindingTable)
logger.Info("realtime mysql snapshot enabled", "table", "vehicle_realtime_snapshot", "plate_binding_table", bindingTable, "plate_cache_ttl_seconds", envInt("PLATE_CACHE_TTL_SECONDS", 600))
}
mux.Handle("/api/stats/daily-metrics", stats.NewMetricHandler(stats.NewMetricRepository(db)))
mux.Handle("/api/realtime/snapshots", realtime.NewSnapshotQueryHandler(realtime.NewSnapshotQueryRepository(db)))

View File

@@ -114,6 +114,18 @@ func TestRealtimeAPIDoesNotExposeDuplicateMileagePointRoute(t *testing.T) {
}
}
func TestRealtimeAPICachesBindingPlateResolver(t *testing.T) {
source, err := os.ReadFile("main.go")
if err != nil {
t.Fatalf("read main.go: %v", err)
}
for _, want := range []string{"NewCachedPlateResolver", "PLATE_CACHE_TTL_SECONDS"} {
if !strings.Contains(string(source), want) {
t.Fatalf("realtime api should configure cached plate resolver, missing %s", want)
}
}
}
type contextCheckingRealtimeUpdater struct {
ctxErr error
count int