feat: add protobuf message compression and decompression for Redis; refactor product fetching logic

This commit is contained in:
2025-08-17 06:16:15 +03:00
parent 38acc4a443
commit abbcc0a81a
1396 changed files with 609 additions and 451436 deletions

View File

@@ -1,8 +1,10 @@
package client
import (
"github.com/hibiken/asynq"
"sipro-mps/internal/config"
"sipro-mps/internal/tasks/types"
"github.com/hibiken/asynq"
)
var Client *asynq.Client
@@ -23,3 +25,15 @@ func CloseClient() {
}
}
}
func EnqueueFetchProductsTask(taskType string, marketplaceId int) error {
task, err := types.NewFetchProductsTask(taskType, marketplaceId)
if err != nil {
return err
}
_, err = Client.Enqueue(task)
if err != nil {
return err
}
return nil
}

View File

@@ -2,16 +2,17 @@ package ozon
import (
"context"
"encoding/json"
"fmt"
"github.com/hibiken/asynq"
"github.com/jackc/pgx/v5/pgxpool"
"github.com/samber/lo"
pb "sipro-mps/api/generated/v1/ozon/products"
"sipro-mps/internal/marketplace"
"sipro-mps/internal/ozon/products/mapping/generated"
"sipro-mps/internal/redis"
"sipro-mps/internal/tasks/types"
"github.com/hibiken/asynq"
"github.com/jackc/pgx/v5/pgxpool"
"github.com/samber/lo"
"sipro-mps/internal/ozon/products"
)
@@ -52,15 +53,12 @@ func (p *FetchProductsProcessor) ProcessTask(ctx context.Context, task *asynq.Ta
productsProto := lo.Map(productsRaw, func(item products.OzonProduct, _ int) *products.PbProduct {
return converter.ToProto(&item)
})
productsJson, err := json.Marshal(productsProto)
redisKey := fmt.Sprintf("ozon:products:%s", identifier)
err = redis.WriteProtoMessage(ctx, redisKey, &pb.GetListOfProductsResponse{Products: productsProto})
if err != nil {
return nil
}
redisClient := *redis.Client
productsKey := fmt.Sprintf("ozon:products:%s", identifier)
err = redisClient.Do(ctx, redisClient.B().Set().Key(productsKey).Value(string(productsJson)).Build()).Error()
if err != nil {
return err
fmt.Printf("Failed to write products to Redis for marketplace %s: %v\n", identifier, err)
return asynq.RevokeTask
}
return nil
}

View File

@@ -4,15 +4,16 @@ import (
"context"
"encoding/json"
"fmt"
"github.com/hibiken/asynq"
"github.com/jackc/pgx/v5/pgxpool"
"github.com/samber/lo"
pb "sipro-mps/api/generated/v1/wb/products"
"sipro-mps/internal/marketplace"
"sipro-mps/internal/redis"
"sipro-mps/internal/tasks/types"
"sipro-mps/internal/wb/products"
"sipro-mps/internal/wb/products/mapping/generated"
"github.com/hibiken/asynq"
"github.com/jackc/pgx/v5/pgxpool"
"github.com/samber/lo"
)
type FetchProductsProcessor struct {
@@ -22,7 +23,7 @@ type FetchProductsProcessor struct {
func (p *FetchProductsProcessor) ProcessTask(ctx context.Context, task *asynq.Task) error {
var payload types.FetchProductsTask
if err := json.Unmarshal(task.Payload(), &payload); err != nil {
return asynq.SkipRetry
return asynq.RevokeTask
}
marketplaceRepo := marketplace.NewDBRepository(p.Dbpool)
repo := products.NewAPIRepository(marketplaceRepo)
@@ -38,7 +39,7 @@ func (p *FetchProductsProcessor) ProcessTask(ctx context.Context, task *asynq.Ta
_, cancel, err := locker.TryWithContext(ctx, fmt.Sprintf("wb:products:marketplace:%s:lock", sellerId))
if err != nil {
fmt.Printf("Failed to acquire lock for marketplace %s: %v\n", sellerId, err)
return asynq.SkipRetry
return asynq.RevokeTask
}
fmt.Println("Working on marketplace", payload.MarketplaceId, "with seller ID", sellerId)
@@ -54,15 +55,11 @@ func (p *FetchProductsProcessor) ProcessTask(ctx context.Context, task *asynq.Ta
productsProto := lo.Map(productsRaw, func(item products.WbProduct, _ int) *pb.Product {
return converter.ToProto(&item)
})
redisClient := *redis.Client
productsJson, err := json.Marshal(productsProto)
err = redis.WriteProtoMessage(ctx, redisKey, &pb.GetProductsResponse{Products: productsProto})
if err != nil {
return fmt.Errorf("failed to marshal products: %w", err)
fmt.Printf(
"Failed to write products to Redis for marketplace %s: %v\n")
return asynq.RevokeTask
}
err = redisClient.Do(ctx, redisClient.B().Set().Key(redisKey).Value(string(productsJson)).Build()).Error()
if err != nil {
return err
}
return nil
}