Go语言消息队列实战案例:订单系统与秒杀系统
Go语言消息队列实战案例:订单系统与秒杀系统
1. 订单系统架构
type OrderService struct { producer *KafkaProducer consumer *KafkaConsumer } func NewOrderService() *OrderService { return &OrderService{} } func (s *OrderService) CreateOrder(order *Order) error { msg, _ := json.Marshal(order) return s.producer.SendMessage(order.ID, msg) } func (s *OrderService) ProcessOrder(ctx context.Context, msg []byte) error { var order Order if err := json.Unmarshal(msg, &order); err != nil { return err } if err := s.payOrder(&order); err != nil { return s.publishPaymentFailed(order.ID, err) } return s.publishOrderCreated(order) } func (s *OrderService) payOrder(order *Order) error { return nil } func (s *OrderService) publishPaymentFailed(orderID string, err error) error { return nil } func (s *OrderService) publishOrderCreated(order Order) error { return nil }2. 秒杀系统架构
type SeckillService struct { producer *KafkaProducer stockClient *RedisClient rateLimiter *RateLimiter } func NewSeckillService() *SeckillService { return &SeckillService{} } func (s *SeckillService) Seckill(ctx context.Context, userID, productID string) error { if !s.rateLimiter.Allow(ctx, userID) { return ErrRateLimit } stock, err := s.stockClient.Decr(ctx, productID) if err != nil { return err } if stock < 0 { s.stockClient.Incr(ctx, productID) return ErrSoldOut } seckillMsg, _ := json.Marshal(&SeckillMessage{ UserID: userID, ProductID: productID, Timestamp: time.Now(), }) return s.producer.SendAsync(seckillMsg) }3. 总结
本文通过订单系统和秒杀系统的案例,展示了消息队列在实际业务中的应用场景和实现方法。
