Skip to content

Commit 44746d5

Browse files
authored
refactor(api): replace AssetRefWriter with goroutine for stateless asset ref increments (#470)
Remove the Redis-buffered AssetRefWriter package entirely and replace it with a simple goroutine fire-and-forget in StoreMessage. This makes the API server fully stateless — no background goroutine, no Start/Close lifecycle, no Redis buffering layer.
1 parent a4bc0e1 commit 44746d5

7 files changed

Lines changed: 29 additions & 795 deletions

File tree

src/server/api/go/cmd/server/main.go

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import (
2424
"github.com/gin-gonic/gin"
2525
"github.com/memodb-io/Acontext/internal/bootstrap"
2626
"github.com/memodb-io/Acontext/internal/config"
27-
"github.com/memodb-io/Acontext/internal/infra/assetrefwriter"
2827
"github.com/memodb-io/Acontext/internal/infra/cache"
2928
dbpkg "github.com/memodb-io/Acontext/internal/infra/db"
3029
"github.com/memodb-io/Acontext/internal/modules/handler"
@@ -141,12 +140,5 @@ func main() {
141140
log.Sugar().Errorw("server shutdown", "err", err)
142141
}
143142

144-
// Flush buffered asset reference writes before exit
145-
if writer := do.MustInvoke[*assetrefwriter.AssetRefWriter](inj); writer != nil {
146-
if err := writer.Close(ctx); err != nil {
147-
log.Sugar().Errorw("asset ref writer shutdown", "err", err)
148-
}
149-
}
150-
151143
log.Sugar().Info("server exited")
152144
}

src/server/api/go/internal/bootstrap/container.go

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import (
99

1010
"github.com/memodb-io/Acontext/configs"
1111
"github.com/memodb-io/Acontext/internal/config"
12-
"github.com/memodb-io/Acontext/internal/infra/assetrefwriter"
1312
"github.com/memodb-io/Acontext/internal/infra/blob"
1413
"github.com/memodb-io/Acontext/internal/infra/cache"
1514
"github.com/memodb-io/Acontext/internal/infra/db"
@@ -217,26 +216,6 @@ func BuildContainer() *do.Injector {
217216
), nil
218217
})
219218

220-
// AssetRefWriter — buffers asset reference increments in Redis for async batch flush
221-
do.Provide(inj, func(i *do.Injector) (*assetrefwriter.AssetRefWriter, error) {
222-
cfg := do.MustInvoke[*config.Config](i)
223-
if !cfg.AssetRefWriter.Enabled {
224-
return nil, nil
225-
}
226-
interval := time.Duration(cfg.AssetRefWriter.FlushIntervalMs) * time.Millisecond
227-
if interval <= 0 {
228-
interval = time.Second
229-
}
230-
w := assetrefwriter.New(
231-
do.MustInvoke[*redis.Client](i),
232-
do.MustInvoke[repo.AssetReferenceRepo](i),
233-
do.MustInvoke[*zap.Logger](i),
234-
assetrefwriter.WithFlushInterval(interval),
235-
)
236-
w.Start()
237-
return w, nil
238-
})
239-
240219
do.Provide(inj, func(i *do.Injector) (repo.SessionRepo, error) {
241220
return repo.NewSessionRepo(
242221
do.MustInvoke[*gorm.DB](i),
@@ -290,7 +269,6 @@ func BuildContainer() *do.Injector {
290269
do.MustInvoke[repo.SessionRepo](i),
291270
do.MustInvoke[repo.SessionEventRepo](i),
292271
do.MustInvoke[repo.AssetReferenceRepo](i),
293-
do.MustInvoke[*assetrefwriter.AssetRefWriter](i),
294272
do.MustInvoke[*zap.Logger](i),
295273
do.MustInvoke[*blob.S3Deps](i),
296274
do.MustInvoke[*mq.Publisher](i),

src/server/api/go/internal/config/config.go

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -101,25 +101,19 @@ type ArtifactCfg struct {
101101
MaxUploadSizeBytes int64 // Maximum file upload size in bytes
102102
}
103103

104-
type AssetRefWriterCfg struct {
105-
Enabled bool // Enable async buffered writes for asset references (default true)
106-
FlushIntervalMs int // Flush interval in milliseconds (default 1000)
107-
}
108-
109104
type Config struct {
110-
App AppCfg
111-
Root RootCfg
112-
Log LogCfg
113-
Database DBCfg
114-
Redis RedisCfg
115-
RabbitMQ MQCfg
116-
S3 S3Cfg
117-
Core CoreCfg
118-
Metrics MetricsCfg
119-
Telemetry TelemetryCfg
120-
Supabase SupabaseCfg
121-
Artifact ArtifactCfg
122-
AssetRefWriter AssetRefWriterCfg
105+
App AppCfg
106+
Root RootCfg
107+
Log LogCfg
108+
Database DBCfg
109+
Redis RedisCfg
110+
RabbitMQ MQCfg
111+
S3 S3Cfg
112+
Core CoreCfg
113+
Metrics MetricsCfg
114+
Telemetry TelemetryCfg
115+
Supabase SupabaseCfg
116+
Artifact ArtifactCfg
123117
}
124118

125119
func setDefaults(v *viper.Viper) {
@@ -157,8 +151,6 @@ func setDefaults(v *viper.Viper) {
157151
v.SetDefault("supabase.apiKey", "")
158152
v.SetDefault("supabase.authURL", "")
159153
v.SetDefault("artifact.maxUploadSizeBytes", 16777216) // Default 16MB (16 * 1024 * 1024 bytes)
160-
v.SetDefault("assetRefWriter.enabled", true)
161-
v.SetDefault("assetRefWriter.flushIntervalMs", 1000)
162154
}
163155

164156
func Load() (*Config, error) {

0 commit comments

Comments
 (0)