package main import ( "context" "feedsystem_video_go/internal/config" "feedsystem_video_go/internal/db" "feedsystem_video_go/internal/social" "feedsystem_video_go/internal/worker" "log" "os" "os/signal" "strconv" "syscall" amqp "github.com/rabbitmq/amqp091-go" ) const ( socialExchange = "social.events" socialQueue = "social.events" socialBindingKey = "social.*" ) func main() { // 加载配置 log.Printf("Loading config from configs/config.yaml") cfg, err := config.Load("configs/config.yaml") if err != nil { log.Fatalf("Failed to load config: %v", err) } // 连接数据库 sqlDB, err := db.NewDB(cfg.Database) if err != nil { log.Fatalf("Failed to connect database: %v", err) } defer db.CloseDB(sqlDB) // 连接 RabbitMQ url := "amqp://" + cfg.RabbitMQ.Username + ":" + cfg.RabbitMQ.Password + "@" + cfg.RabbitMQ.Host + ":" + strconv.Itoa(cfg.RabbitMQ.Port) + "/" conn, err := amqp.Dial(url) if err != nil { log.Fatalf("Failed to connect rabbitmq: %v", err) } defer conn.Close() // 创建 RabbitMQ 通道 ch, err := conn.Channel() if err != nil { log.Fatalf("Failed to open rabbitmq channel: %v", err) } defer ch.Close() // 声明 Social 交换机和队列 if err := declareSocialTopology(ch); err != nil { log.Fatalf("Failed to declare social topology: %v", err) } if err := ch.Qos(50, 0, false); err != nil { log.Fatalf("Failed to set qos: %v", err) } repo := social.NewSocialRepository(sqlDB) worker := worker.NewSocialWorker(ch, repo, socialQueue) ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) defer stop() log.Printf("Social worker started, consuming queue=%s", socialQueue) if err := worker.Run(ctx); err != nil && err != context.Canceled { log.Fatalf("Worker stopped: %v", err) } log.Printf("Social worker stopped") } func declareSocialTopology(ch *amqp.Channel) error { if err := ch.ExchangeDeclare( socialExchange, "topic", true, false, false, false, nil, ); err != nil { return err } q, err := ch.QueueDeclare( socialQueue, true, false, false, false, nil, ) if err != nil { return err } if err := ch.QueueBind( q.Name, socialBindingKey, socialExchange, false, nil, ); err != nil { return err } return nil }