go: Fan-Out Pattern

项目结构:

image

 

/*
# 版权所有  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()
}

  

/*
# 版权所有  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,
}

  

调用:

/*
# 版权所有  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)
}

  

输出:

image

 

posted @ 2026-06-20 11:25  ®Geovin Du Dream Park™  阅读(4)  评论(0)    收藏  举报