项目结构:

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🎉 系统全部执行完成!")
}
输出:
