go: Fan-Out Pattern

项目结构:

Go 复制代码
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Fan-Out Pattern Fan-Out 模式 扇出模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/20 10:38
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : config.go
*/
package config
 
// 配置层
// 全局任务通道(Fan-Out 核心队列)
var TaskQueue = make(chan interface{}, 100)
 
// 业务配置
const (
    OrderInterval = 1 // 下单间隔秒
)
 
// 彩色定义 无红色
// 全局颜色常量 统一管理
const (
    COLOR_CYAN   = "\033[36m"
    COLOR_BLUE   = "\033[34m"
    COLOR_YELLOW = "\033[33m"
    COLOR_GREEN  = "\033[32m"
    COLOR_RESET  = "\033[0m"
)
 
 
 
 
 
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Fan-Out Pattern Fan-Out 模式 扇出模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/20 10:38
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : order.go
*/
package models
 
// 模型层:类型安全
// JewelryOrder 珠宝订单结构体(强类型)
type JewelryOrder struct {
    OrderID  string
    Product  string
    Material string
    Style    string
}
 
 
 
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Fan-Out Pattern Fan-Out 模式 扇出模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/20 10:40
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : producer.go
*/
package core
 
import (
    "godesginpattern/fanout/config"
    "godesginpattern/fanout/models"
    "time"
)
 
// 生产者:单一职责
const (
    colorYellow = "\033[33m"
    colorBlue   = "\033[34m"
    colorReset  = "\033[0m"
)
 
// OrderProducer 订单生产者
type OrderProducer struct{}
 
func NewOrderProducer() *OrderProducer {
    return &OrderProducer{}
}
 
// Produce 生成订单并发送到通道
func (p *OrderProducer) Produce() {
    println(config.COLOR_BLUE + "\n===== 客户订单开始生成 =====" + config.COLOR_RESET)
    orders := []models.JewelryOrder{
        {"J2025001", "18K金钻石戒指", "18K金+50分钻石", "经典六爪"},
        {"J2025002", "翡翠玉镯", "A货翡翠", "复古圆条"},
        {"J2025003", "铂金项链", "PT950铂金", "简约锁骨链"},
    }
    for _, o := range orders {
        println(config.COLOR_YELLOW + "📝 新订单:" + o.Product + " | " + o.OrderID + config.COLOR_RESET)
        config.TaskQueue <- o
        time.Sleep(time.Duration(config.OrderInterval) * time.Second)
    }
    close(config.TaskQueue)
    println(config.COLOR_BLUE + "===== 所有订单生成完成 =====" + config.COLOR_RESET)
}
 
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Fan-Out Pattern Fan-Out 模式 扇出模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/20 10:40
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : dispatcher.go
*/
package core
 
import (
    "godesginpattern/fanout/config"
    "godesginpattern/fanout/models"
    "godesginpattern/fanout/workers"
    "sync"
)
 
// 扇出分发器:Go 高并发核心
 
const (
    colorCyan = "\033[36m"
    // colorReset = "\033[0m"
)
 
// FanOutDispatcher 扇出分发器
type FanOutDispatcher struct{}
 
func NewFanOutDispatcher() *FanOutDispatcher {
    return &FanOutDispatcher{}
}
 
// Start 启动分发器监听通道
func (d *FanOutDispatcher) Start() {
    for task := range config.TaskQueue {
        order, ok := task.(models.JewelryOrder)
        if !ok {
            continue
        }
 
        println(colorCyan + "\n===== 订单" + order.OrderID + " 扇出分发启动 =====" + colorReset)
        d.executeParallel(order)
        println(colorCyan + "===== 订单" + order.OrderID + " 全流程完成 =====" + colorReset)
    }
}
 
// executeParallel 并行执行所有工作器(Go 原生 goroutine + WaitGroup)
func (d *FanOutDispatcher) executeParallel(order models.JewelryOrder) {
    var wg sync.WaitGroup
 
    for _, worker := range workers.AllWorkers {
        wg.Add(1)
        // 异步执行(Go 高并发核心)
        go func(w workers.WorkerFunc) {
            defer wg.Done()
            w(order)
        }(worker)
    }
 
    wg.Wait()
}
Go 复制代码
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Fan-Out Pattern Fan-Out 模式 扇出模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/20 10:39
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : material.go
*/
package workers
 
import (
    "godesginpattern/fanout/config"
    "godesginpattern/fanout/models"
    "time"
)
 
const (
    colorGreen = "\033[32m"
    colorReset = "\033[0m"
)
 
func MaterialCheck(order models.JewelryOrder) {
    println(config.COLOR_GREEN + "[原料核验] 订单" + order.OrderID + ":检查" + order.Material + "库存、GIA证书" + config.COLOR_RESET)
    time.Sleep(1 * time.Second)
    println(config.COLOR_GREEN + "[原料核验] 订单" + order.OrderID + ":核验完成 ✅" + config.COLOR_RESET)
}
 
 
 
 
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Fan-Out Pattern Fan-Out 模式 扇出模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/20 10:39
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : design.go
*/
package workers
 
import (
    "godesginpattern/fanout/config"
    "godesginpattern/fanout/models"
    "time"
)
 
func Design(order models.JewelryOrder) {
    println("[设计制图] 订单" + order.OrderID + ":生成" + order.Style + "3D图")
    time.Sleep(1500 * time.Millisecond)
    println(config.COLOR_RESET + "[设计制图] 订单" + order.OrderID + ":设计定稿 ✅" + config.COLOR_RESET)
}
 
 
 
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Fan-Out Pattern Fan-Out 模式 扇出模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/20 10:39
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : production.go
*/
package workers
 
import (
    "godesginpattern/fanout/config"
    "godesginpattern/fanout/models"
    "time"
)
 
func Production(order models.JewelryOrder) {
    println(config.COLOR_BLUE + "[加工生产] 订单" + order.OrderID + ":" + order.Product + "铸造镶嵌" + config.COLOR_RESET)
    time.Sleep(2 * time.Second)
    println(config.COLOR_YELLOW + "[加工生产] 订单" + order.OrderID + ":生产完成 ✅" + config.COLOR_YELLOW)
}
 
 
 
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Fan-Out Pattern Fan-Out 模式 扇出模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/20 10:39
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : quality.go
*/
package workers
 
import (
    "godesginpattern/fanout/config"
    "godesginpattern/fanout/models"
    "time"
)
 
func QualityCheck(order models.JewelryOrder) {
    println("[品质质检] 订单" + order.OrderID + ":纯度/净度/工艺检测")
    time.Sleep(1 * time.Second)
    println(config.COLOR_GREEN + "[品质质检] 订单" + order.OrderID + ":质检合格 ✅" + config.COLOR_GREEN)
}
 
 
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Fan-Out Pattern Fan-Out 模式 扇出模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/20 10:39
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : logistics.go
*/
package workers
 
import (
    "godesginpattern/fanout/config"
    "godesginpattern/fanout/models"
    "time"
)
 
func Logistics(order models.JewelryOrder) {
    println("[物流发货] 订单" + order.OrderID + ":生成顺丰保价快递")
    time.Sleep(500 * time.Millisecond)
    println(config.COLOR_CYAN + "[物流发货] 订单" + order.OrderID + ":已发货 ✅" + config.COLOR_CYAN)
}
 
 
 
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Fan-Out Pattern Fan-Out 模式 扇出模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/20 10:40
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : packaging.go
*/
package workers
 
import (
    "godesginpattern/fanout/config"
    "godesginpattern/fanout/models"
    "time"
)
 
func Packaging(order models.JewelryOrder) {
    println("[礼盒包装] 订单" + order.OrderID + ":定制礼盒+证书装订")
    time.Sleep(800 * time.Millisecond)
    println(config.COLOR_BLUE + "[礼盒包装] 订单" + order.OrderID + ":包装完成 ✅" + config.COLOR_BLUE)
}
 
 
 
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Fan-Out Pattern Fan-Out 模式 扇出模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/20 10:40
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : registry.go
*/
package workers
 
import "godesginpattern/fanout/models"
 
// 工作器注册:可扩展核心
// WorkerFunc 工作器统一函数类型
type WorkerFunc func(models.JewelryOrder)
 
// AllWorkers 所有工作器列表(新增工序只需在这里添加)
var AllWorkers = []WorkerFunc{
    MaterialCheck,
    Design,
    Production,
    QualityCheck,
    Packaging,
    Logistics,
}

调用:

Go 复制代码
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Fan-Out Pattern Fan-Out 模式 扇出模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/20 10:41
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : fanoutbll.go
*/
package bll
 
import "godesginpattern/fanout/core"
 
const (
    colorCyan   = "\033[36m"
    colorYellow = "\033[33m"
    colorGreen  = "\033[32m"
    colorBlue   = "\033[34m"
    colorReset  = "\033[0m"
)
 
func FanOutMain() {
 
    println(colorCyan + "============================================================")
    println("   珠宝行业企业级 Fan-Out 分布式任务系统(Go 彩色版)启动成功")
    println("============================================================" + colorReset)
 
    // 初始化核心组件
    producer := core.NewOrderProducer()
    dispatcher := core.NewFanOutDispatcher()
 
    // 启动分发器(后台 goroutine)
    go dispatcher.Start()
 
    // 启动生产者
    producer.Produce()
 
    println("\n" + colorGreen + "============================================================")
    println("   所有订单处理完成,系统安全退出")
    println("============================================================" + colorReset)
}

输出: