go:Fan-In Pattern

项目结构:

Fan-In 模式本质:多数据源 → 统一接收器,完美匹配珠宝全流程「多环节、单数据中心」场景

架构设计

核心分层(5 层架构)

配置层(config):全局配置、常量

消息层(message):统一消息结构体、数据格式

业务层(process):各业务模块(单一职责)

核心层(core):Fan-In 队列、Sink 接收器、线程管理

启动层(main):项目入口、编排启动

Go 复制代码
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Fan-In Pattern Fan-In(扇入)模式
# 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 7:33
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : settings.go
*/
package config
 
// 配置层
const (
    QueueSize  = 100          // 通道容量
    MinProcess = 0.3          // 最小业务耗时
    MaxProcess = 1.2          // 最大业务耗时
    EndSignal  = "SYSTEM_END" // 结束标识
)
 
 
 
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Fan-In Pattern Fan-In(扇入)模式
# 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 7:34
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : business_msg.go
*/
package message
 
// 消息层 实体
// BusinessMessage 统一业务消息结构体
type BusinessMessage struct {
    ProcessName string  // 业务环节
    TaskName    string  // 任务名称
    TaskDetails string  // 任务详情
    Timestamp   float64 // 时间戳
    Status      string  // 状态
}
 
 
 
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Fan-In Pattern Fan-In(扇入)模式
# 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 7:35
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : fanin.go
*/
package core
 
import (
    "godesginpattern/fanin/config"
    "godesginpattern/fanin/message"
)
 
// 核心队列
// 全局单例 Fan-In 通道
var FanInChan = make(chan any, config.QueueSize)
 
// SendMsg 发送业务消息
func SendMsg(msg message.BusinessMessage) {
    FanInChan <- msg
}
 
// SendEndSignal 发送结束信号
func SendEndSignal() {
    FanInChan <- config.EndSignal
}
 
 
 
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Fan-In Pattern Fan-In(扇入)模式
# 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 7:36
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : sink.go
*/
package core
 
import (
    "fmt"
    "godesginpattern/fanin/config"
    "godesginpattern/fanin/message"
    "time"
)
 
// 工作接收器
// WorkSink 数据中心接收器(单例)
type WorkSink struct {
    TotalCount  int
    ProcessStat map[string]int
}
 
var Sink = &WorkSink{
    ProcessStat: make(map[string]int),
}
 
// Run 启动接收器
func (w *WorkSink) Run() {
    fmt.Println("==========================================================================================")
    fmt.Println("🏢 【企业级】珠宝业务数据中心已启动 - Fan-In 工作接收器")
    fmt.Println("==========================================================================================")
 
    for data := range FanInChan {
        switch val := data.(type) {
        case string:
            if val == config.EndSignal {
                w.printReport()
                return
            }
        case message.BusinessMessage:
            w.handleMsg(val)
        }
        time.Sleep(100 * time.Millisecond)
    }
}
 
// handleMsg 处理单条消息
func (w *WorkSink) handleMsg(msg message.BusinessMessage) {
    w.TotalCount++
    w.ProcessStat[msg.ProcessName]++
 
    fmt.Printf("📊 接收 | %-10s | 任务:%-20s | 状态:%s\n",
        msg.ProcessName, msg.TaskName, msg.Status)
}
 
// printReport 输出汇总报告
func (w *WorkSink) printReport() {
    fmt.Println("\n==========================================================================================")
    fmt.Println("📈 珠宝全流程业务汇总报告")
    fmt.Println("==========================================================================================")
    fmt.Printf("✅ 总处理任务数:%d\n", w.TotalCount)
    for name, count := range w.ProcessStat {
        fmt.Printf("   「%s」:%d 项\n", name, count)
    }
    fmt.Println("==========================================================================================")
}
Go 复制代码
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Fan-In Pattern Fan-In(扇入)模式
# 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 7:37
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : base.go
*/
package process
 
import (
    "godesginpattern/fanin/config"
    "godesginpattern/fanin/core"
    "godesginpattern/fanin/message"
    "math/rand"
    "time"
)
 
//业务基类
 
// Process 业务接口(所有业务环节必须实现)
type Process interface {
    Name() string
    TaskList() []string
    Execute()
}
 
// Prcess 基础业务逻辑
type BaseProcess struct {
    processName string
    tasks       []string
}
 
func NewBaseProcess(name string, tasks []string) BaseProcess {
    return BaseProcess{
        processName: name,
        tasks:       tasks,
    }
}
 
// Name 业务名称
func (b *BaseProcess) Name() string {
    return b.processName
}
 
// TaskList 任务列表
func (b *BaseProcess) TaskList() []string {
    return b.tasks
}
 
// Execute 执行业务(通用逻辑)
func (b *BaseProcess) Execute() {
    for _, task := range b.TaskList() {
        // 模拟业务耗时
        sleepTime := config.MinProcess + rand.Float64()*(config.MaxProcess-config.MinProcess)
        time.Sleep(time.Duration(sleepTime*1000) * time.Millisecond)
 
        // 构造消息
        msg := message.BusinessMessage{
            ProcessName: b.Name(),
            TaskName:    task,
            TaskDetails: task,
            Timestamp:   float64(time.Now().UnixMilli()) / 1000,
            Status:      "success",
        }
        core.SendMsg(msg)
    }
}
 
 
 
 
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Fan-In Pattern Fan-In(扇入)模式
# 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 7:39
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : purchase.go
*/
package process
 
// 原料采购
func NewPurchase() Process {
    return &BaseProcess{
        processName: "原料采购",
        tasks: []string{
            "采购1克拉南非钻石", "采购999足金500g", "采购红宝石10颗",
        },
    }
}
 
 
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Fan-In Pattern Fan-In(扇入)模式
# 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 7:39
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : design.go
*/
package process
 
// 珠宝设计
func NewDesign() Process {
    return &BaseProcess{
        processName: "珠宝设计",
        tasks: []string{
            "钻戒款式设计", "项链3D建模", "手镯图纸审核",
        },
    }
}
 
 
 
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Fan-In Pattern Fan-In(扇入)模式
# 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 7:40
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : produce.go
*/
package process
 
// 生产加工
func NewProduce() Process {
    return &BaseProcess{
        processName: "生产加工",
        tasks: []string{
            "钻石镶嵌加工", "黄金手镯抛光", "金饰铸造成型",
        },
    }
}
 
 
 
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Fan-In Pattern Fan-In(扇入)模式
# 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 7:41
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : quality.go
*/
package process
 
// QC
func NewQuality() Process {
    return &BaseProcess{
        processName: "质量检测",
        tasks: []string{
            "黄金纯度检测", "钻石工艺检测", "珠宝鉴定证书出具",
        },
    }
}
 
 
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Fan-In Pattern Fan-In(扇入)模式
# 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 7:41
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : warehouse.go
*/
package process
 
// 仓储管理
func NewWarehouse() Process {
    return &BaseProcess{
        processName: "仓储管理",
        tasks: []string{
            "钻戒入库登记", "黄金库存盘点", "宝石库存预警",
        },
    }
}
 
 
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Fan-In Pattern Fan-In(扇入)模式
# 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 7:42
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : sale.go
*/
package process
 
// 营销销售
func NewSale() Process {
    return &BaseProcess{
        processName: "销售环节",
        tasks: []string{
            "线上钻戒售出", "门店黄金手镯售出", "珠宝批发订单发货",
        },
    }
}
 
 
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Fan-In Pattern Fan-In(扇入)模式
# 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 7:42
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : after_sale.go
*/
package process
 
// 客户关系 CRM
func NewAfterSale() Process {
    return &BaseProcess{
        processName: "客户关系",
        tasks: []string{
            "钻戒免费清洗", "项链维修", "黄金首饰保养",
        },
    }
}

调用:

Go 复制代码
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Fan-In Pattern Fan-In(扇入)模式
# 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 7:44
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : faninbll.go
*/
package bll
 
import (
    "fmt"
    "godesginpattern/fanin/core"
    "godesginpattern/fanin/process"
    "sync"
)
 
// 加载所有业务流程(扩展只需在这里添加)
func getAllProcesses() []process.Process {
    return []process.Process{
        process.NewPurchase(),
        process.NewDesign(),
        process.NewProduce(),
        process.NewQuality(),
        process.NewWarehouse(),
        process.NewSale(),
        process.NewAfterSale(),
    }
}
func FanInMain() {
    fmt.Println("🚀 企业级珠宝 Fan-In 业务系统启动...\n")
 
    // 1. 启动接收器
    go core.Sink.Run()
 
    // 2. 启动所有业务 goroutine
    var wg sync.WaitGroup
    processList := getAllProcesses()
 
    wg.Add(len(processList))
    for _, p := range processList {
        go func(pro process.Process) {
            defer wg.Done()
            pro.Execute()
        }(p)
    }
 
    // 3. 等待所有业务完成
    wg.Wait()
 
    // 4. 发送结束信号
    core.SendEndSignal()
 
    // 5. 等待接收器输出完成
    close(core.FanInChan)
 
    fmt.Println("\n🎉 系统全部执行完成!")
 
}
  

输出: