惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

aimingoo的专栏
aimingoo的专栏
WordPress大学
WordPress大学
阮一峰的网络日志
阮一峰的网络日志
博客园 - 司徒正美
月光博客
月光博客
宝玉的分享
宝玉的分享
Recent Announcements
Recent Announcements
小众软件
小众软件
H
Hackread – Cybersecurity News, Data Breaches, AI and More
美团技术团队
博客园 - 三生石上(FineUI控件)
A
About on SuperTechFans
J
Java Code Geeks
云风的 BLOG
云风的 BLOG
罗磊的独立博客
大猫的无限游戏
大猫的无限游戏
IT之家
IT之家
Vercel News
Vercel News
量子位
Martin Fowler
Martin Fowler
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
Visual Studio Blog
腾讯CDC
有赞技术团队
有赞技术团队

博客园 - ®Geovin Du Dream Park™

go: Functional Options Pattern go:Timing Functions Pattern python: Timing Functions Pattern go: Steady-State Pattern python: Steady-State Pattern go: Handshaking Pattern python: Handshaking Pattern go: Fail-Fast Pattern python: Fail-Fast Pattern I go: Deadline Pattern python: Deadline Pattern go: Circuit-Breaker Pattern python: Circuit-Breaker Pattern go: Bulkheads Pattern python: Bulkheads Pattern go: Push & Pull Pattern python: Push & Pull Pattern python: Publish/Subscribe Pattern II go: Publish/Subscribe Pattern python: Publish/Subscribe Pattern go: Futures & Promises Pattern python: Futures & Promises Pattern go: Worker Pool Pattern go:Pipeline Pattern python: Worker Pool Pattern python: Pipeline Pattern go: Fan-Out Pattern python: Fan-Out Pattern python: Fan-In Pattern Fan-In go: Producer Consumer  Pattern
go: Fan-In Pattern
®Geovin Du Dream Park™ · 2026-06-20 · via 博客园 - ®Geovin Du Dream Park™

项目结构:

image

 Fan-In 模式本质:多数据源 → 统一接收器,完美匹配珠宝全流程「多环节、单数据中心」场景
架构设计
核心分层(5 层架构)
配置层(config):全局配置、常量
消息层(message):统一消息结构体、数据格式
业务层(process):各业务模块(单一职责)
核心层(core):Fan-In 队列、Sink 接收器、线程管理
启动层(main):项目入口、编排启动

/*
# 版权所有  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("==========================================================================================")
}
/*
# 版权所有  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{
			"钻戒免费清洗", "项链维修", "黄金首饰保养",
		},
	}
}

调用:

/*
# 版权所有  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🎉 系统全部执行完成!")

}

输出:

dce3973b722f380c082f49133d3270e6

哲学管理(学)人生, 文学艺术生活, 自动(计算机学)物理(学)工作, 生物(学)化学逆境, 历史(学)测绘(学)时间, 经济(学)数学金钱(理财), 心理(学)医学情绪, 诗词美容情感, 美学建筑(学)家园, 解构建构(分析)整合学习, 智商情商(IQ、EQ)运筹(学)生存.---Geovin Du(涂聚文)