当前位置: 首页 > news >正文

go: N-Barrier Pattern

项目结构:

image

 

/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:N-Barrier Pattern 屏障模式
# 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/5/26 22:06
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : config.go
*/
package configimport "time"// AppConfig 全局生产配置
type AppConfig struct {// 生产阶段ProductionSteps   intProductionTimeout time.Duration// 入库阶段WarehouseSteps   intWarehouseTimeout time.Duration// 发货阶段DeliverySteps   intDeliveryTimeout time.Duration// 重试MaxRetryCount intRetryInterval time.Duration
}func Load() *AppConfig {return &AppConfig{ProductionSteps:   5,ProductionTimeout: 10 * time.Second,WarehouseSteps:   5,WarehouseTimeout: 5 * time.Second,DeliverySteps:   1,DeliveryTimeout: 3 * time.Second,MaxRetryCount: 2,RetryInterval: 500 * time.Millisecond,}
}/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:N-Barrier Pattern 屏障模式
# 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/5/26 22:07
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : logger.go
*/
package loggerimport ("go.uber.org/zap""go.uber.org/zap/zapcore"
)var log *zap.Loggerfunc Init() {config := zap.NewProductionConfig()config.EncoderConfig.TimeKey = "time"config.EncoderConfig.EncodeTime = zapcore.ISO8601TimeEncoderconfig.DisableCaller = truel, _ := config.Build()log = l
}func Info(msg string, fields ...zap.Field) {log.Info(msg, fields...)
}func Error(msg string, fields ...zap.Field) {log.Error(msg, fields...)
}func Debug(msg string, fields ...zap.Field) {log.Debug(msg, fields...)
}func With(fields ...zap.Field) *zap.Logger {return log.With(fields...)
}func Sync() {_ = log.Sync()
}

  

 

 

/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:N-Barrier Pattern 屏障模式
# 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/5/26 22:06
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : barrier.go
*/
package barrierimport "sync"// StageBarrier 多阶段屏障
type StageBarrier struct {wg    *sync.WaitGroupstage string
}func NewStageBarrier(n int, stage string) *StageBarrier {wg := &sync.WaitGroup{}wg.Add(n)return &StageBarrier{wg: wg, stage: stage}
}func (s *StageBarrier) Done() {s.wg.Done()
}func (s *StageBarrier) Wait() {s.wg.Wait()
}func (s *StageBarrier) Stage() string {return s.stage
}/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:N-Barrier Pattern 屏障模式
# 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/5/26 22:08
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : model.go
*/
package modelimport "time"// Step 珠宝生产步骤
type Step stringconst (StepPurchase  = Step("原料采购")StepDesign    = Step("款式设计")StepProcess   = Step("工艺加工")StepQuality   = Step("品质质检")StepPackaging = Step("成品包装")
)// WarehouseStep 入库步骤
type WarehouseStep stringconst (WarehouseCheck   = WarehouseStep("入库核验")WarehouseLabel   = WarehouseStep("贴标入仓")WarehouseStock   = WarehouseStep("库存更新")WarehousePhoto   = WarehouseStep("成品拍照")WarehouseArchive = WarehouseStep("档案归档")
)// DeliveryStep 发货步骤
type DeliveryStep stringconst (DeliveryShip = DeliveryStep("批量发货")
)// TaskResult 任务执行结果
type TaskResult struct {Stage   stringStep    stringCost    time.DurationSuccess boolRetry   intError   error
}// GetProductionSteps 获取生产步骤
func GetProductionSteps() []Step {return []Step{StepPurchase, StepDesign, StepProcess, StepQuality, StepPackaging}
}// GetWarehouseSteps 获取入库步骤
func GetWarehouseSteps() []WarehouseStep {return []WarehouseStep{WarehouseCheck, WarehouseLabel, WarehouseStock, WarehousePhoto, WarehouseArchive}
}// GetDeliverySteps 获取发货步骤
func GetDeliverySteps() []DeliveryStep {return []DeliveryStep{DeliveryShip}
}// GetStepDuration 步骤耗时
func GetStepDuration(anyStep any) time.Duration {switch s := anyStep.(type) {case Step:switch s {case StepPurchase:return 2 * time.Secondcase StepDesign:return 3 * time.Secondcase StepProcess:return 4 * time.Secondcase StepQuality:return 2 * time.Secondcase StepPackaging:return 1 * time.Second}case WarehouseStep:return 1 * time.Secondcase DeliveryStep:return 2 * time.Second}return 1 * time.Second
}/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:N-Barrier Pattern 屏障模式
# 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/5/26 22:09
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : collector.go
*/
package resultimport ("godesginpattern/nbarrier/jewelry/model""sync"
)type Collector struct {mu      sync.Mutexresults []model.TaskResult
}func NewCollector() *Collector {return &Collector{}
}func (c *Collector) Add(res model.TaskResult) {c.mu.Lock()defer c.mu.Unlock()c.results = append(c.results, res)
}func (c *Collector) All() []model.TaskResult {c.mu.Lock()defer c.mu.Unlock()return c.results
}func (c *Collector) SuccessCount() int {c.mu.Lock()defer c.mu.Unlock()count := 0for _, r := range c.results {if r.Success {count++}}return count
}

  

/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:N-Barrier Pattern 屏障模式
# 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/5/26 22:09
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : worker.go
*/
package workerimport ("context""go.uber.org/zap""godesginpattern/nbarrier/barrier""godesginpattern/nbarrier/common/logger""godesginpattern/nbarrier/jewelry/model""godesginpattern/nbarrier/result""time"
)type Task interface {Run(ctx context.Context) (model.TaskResult, error)
}func RunWithRetryAndTimeout(ctx context.Context,task Task,b *barrier.StageBarrier,collector *result.Collector,maxRetry int,retryInterval time.Duration,
) {go func() {defer b.Done()stepLog := logger.With(zap.String("stage", b.Stage()))var res model.TaskResultfor retry := 0; retry <= maxRetry; retry++ {select {case <-ctx.Done():stepLog.Error("任务超时取消", zap.Int("retry", retry))returndefault:}result, err := task.Run(ctx)result.Retry = retryresult.Stage = b.Stage()if err == nil {res = resultstepLog.Info("步骤完成",zap.String("step", result.Step),zap.Duration("cost", result.Cost),zap.Int("retry", retry))break}stepLog.Error("步骤执行失败",zap.String("step", result.Step),zap.Int("retry", retry),zap.Error(err))if retry == maxRetry {res = resultbreak}time.Sleep(retryInterval)}collector.Add(res)}()
}

  

/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:N-Barrier Pattern 屏障模式
# 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/5/26 22:11
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : service.go
*/
package serviceimport ("context""go.uber.org/zap""godesginpattern/nbarrier/common/logger""godesginpattern/nbarrier/jewelry/model""time"
)type JewelryService struct{}func NewJewelryService() *JewelryService {return &JewelryService{}
}// ---------------- 生产任务 ----------------
type ProductionTask struct {Step model.Step
}func (t *ProductionTask) Run(ctx context.Context) (model.TaskResult, error) {start := time.Now()dur := model.GetStepDuration(t.Step)logger.Info("开始生产步骤", zap.String("step", string(t.Step)))time.Sleep(dur)return model.TaskResult{Step:    string(t.Step),Cost:    time.Since(start),Success: true,}, nil
}// ---------------- 入库任务 ----------------
type WarehouseTask struct {Step model.WarehouseStep
}func (t *WarehouseTask) Run(ctx context.Context) (model.TaskResult, error) {start := time.Now()dur := model.GetStepDuration(t.Step)logger.Info("开始入库步骤", zap.String("step", string(t.Step)))time.Sleep(dur)return model.TaskResult{Step:    string(t.Step),Cost:    time.Since(start),Success: true,}, nil
}// ---------------- 发货任务 ----------------
type DeliveryTask struct {Step model.DeliveryStep
}func (t *DeliveryTask) Run(ctx context.Context) (model.TaskResult, error) {start := time.Now()dur := model.GetStepDuration(t.Step)logger.Info("开始发货步骤", zap.String("step", string(t.Step)))time.Sleep(dur)return model.TaskResult{Step:    string(t.Step),Cost:    time.Since(start),Success: true,}, nil
}

  

调用:

/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:N-Barrier Pattern 屏障模式  go get -u go.uber.org/zap
#
# 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/5/26 22:30
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : nbarrierbll.gobarrier/
├── go.mod
├── go.sum
├── main.go    # 入口:依赖注入+启动
├── config/
│   └── config.go             # 全局配置
├──
│   ├── barrier/              # 多阶段屏障核心
│   │   └── barrier.go
│   ├── jewelry/              # 珠宝业务域
│   │   ├── model/            # 模型+枚举
│   │   └── service/          # 业务逻辑
│   ├── pkg/                  # 内部公共包
│   │   ├── logger/           # zap日志
│   │   └── worker/           # 并发+重试+超时
│   └── result/               # 结果收集器
└── scripts/                  # 部署脚本(预留)
*/
package bllimport ("context""go.uber.org/zap""godesginpattern/nbarrier/barrier""godesginpattern/nbarrier/common/logger""godesginpattern/nbarrier/common/worker""godesginpattern/nbarrier/config""godesginpattern/nbarrier/jewelry/model""godesginpattern/nbarrier/jewelry/service""godesginpattern/nbarrier/result""os/signal""syscall""time"
)func NbarrierMain() {// 初始化日志logger.Init()defer logger.Sync()// 加载配置cfg := config.Load()// 优雅关闭ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)defer stop()logger.Info("=== 珠宝全流程生产系统启动 ===")logger.Info("配置加载完成",zap.Int("生产步骤", cfg.ProductionSteps),zap.Int("入库步骤", cfg.WarehouseSteps),zap.Int("重试次数", cfg.MaxRetryCount))// 结果收集器collector := result.NewCollector()// ==========================================// 阶段1:生产屏障// ==========================================prodCtx, cancel1 := context.WithTimeout(ctx, cfg.ProductionTimeout)defer cancel1()prodBarrier := barrier.NewStageBarrier(cfg.ProductionSteps, "生产")steps := model.GetProductionSteps()for _, step := range steps {task := &service.ProductionTask{Step: step}worker.RunWithRetryAndTimeout(prodCtx, task, prodBarrier, collector,cfg.MaxRetryCount, cfg.RetryInterval)}logger.Info("=== 等待所有生产步骤完成 ===")prodBarrier.Wait()logger.Info("=== 【生产屏障通过】 ===")// ==========================================// 阶段2:入库屏障// ==========================================whCtx, cancel2 := context.WithTimeout(ctx, cfg.WarehouseTimeout)defer cancel2()whBarrier := barrier.NewStageBarrier(cfg.WarehouseSteps, "入库")whSteps := model.GetWarehouseSteps()for _, step := range whSteps {task := &service.WarehouseTask{Step: step}worker.RunWithRetryAndTimeout(whCtx, task, whBarrier, collector,cfg.MaxRetryCount, cfg.RetryInterval)}logger.Info("=== 等待所有入库步骤完成 ===")whBarrier.Wait()logger.Info("=== 【入库屏障通过】 ===")// ==========================================// 阶段3:发货屏障// ==========================================deliverCtx, cancel3 := context.WithTimeout(ctx, cfg.DeliveryTimeout)defer cancel3()dlBarrier := barrier.NewStageBarrier(cfg.DeliverySteps, "发货")dlSteps := model.GetDeliverySteps()for _, step := range dlSteps {task := &service.DeliveryTask{Step: step}worker.RunWithRetryAndTimeout(deliverCtx, task, dlBarrier, collector,cfg.MaxRetryCount, cfg.RetryInterval)}logger.Info("=== 等待发货完成 ===")dlBarrier.Wait()logger.Info("=== 【发货屏障通过】 ===")// ==========================================// 最终汇总// ==========================================time.Sleep(300 * time.Millisecond)logger.Info("========================================")logger.Info("✅ 全流程完成",zap.Int("总任务数", len(collector.All())),zap.Int("成功数", collector.SuccessCount()))logger.Info("✅ 珠宝成品 → 生产 → 入库 → 发货 全流程完成")logger.Info("========================================")
}

  

输出:

image

 

http://www.gsyq.cn/news/1396575.html

相关文章:

  • 南京少儿围棋考级培训推荐:南京棋院考级专长 - 19120507004
  • gitlab的一些使用异常记录
  • AI 智能体实训室:从大模型到教学落地的全链路实践
  • 2026 AI搜索优化白皮书:品牌信任链的重构与交付标准 - 资讯速览
  • 中小团队如何利用Taotoken实现多模型API的成本优化与统一调度
  • 2026 土工布工厂哪家批发最优惠:恒全土工材料批量特惠 - 13425704091
  • 30亿GEO市场谁在领跑?2026年GEO优化公司综合权威实力排行榜 - GEO优化
  • 南京少儿围棋考级培训排名:南京棋院榜单领先 - 13724980961
  • 中山琪朗丨2026 精选推荐・实力工厂,酒店灯饰定制 + 高端定制灯饰 - 资讯速览
  • cc/ds教学,计算机小白笔记(2.2)
  • 3步解锁网盘直链下载:一站式跨平台文件获取终极方案
  • 点云扫描 vs 高斯重建:数字孪生别再乱选!一个落地、一个只能看
  • AI大模型三种部署方式与企业落地全解析
  • 昇腾NPU上的NumPy兼容层:asnumpy如何让Python代码自动加速3倍
  • 【2026年郑州再生资源回收口碑推荐】 - 资讯速览
  • 【Lovable平台开发生死线】:3类致命本地化缺陷、5个合规雷区、1套GDPR+ISO 17100双认证落地模板
  • 5分钟掌握Zotero Style:让文献管理变得优雅高效的终极指南
  • 如何获取Reddit API credentials?(无法获取了)
  • 决策树算法|ID3、C4.5、CART区别详解
  • 避开 Agent 落地大坑,业内大咖复盘行业真相
  • 高誉 4+5 网红机油赋能青岛汽修门店,青岛莱茵特斯诚邀合作 - 资讯速览
  • pycharm虚拟环境同步/迁移
  • 自由学习记录(192)
  • CANN 日志系统:调试与性能分析的日志艺术
  • 2026 论文双降工具横评:从 paperxie 到 9 大神器,查重降 AIGC 全场景通关
  • 长沙靠谱训犬寄养优选指南|岳麓/雨花/开福/天心/星沙/望城5家店铺推荐 - 资讯速览
  • P16307 [蓝桥杯 2026 省 Java/Python 研究生组] 抓取卡牌 题解
  • ESP32内存不够用?手把手教你用Platformio开启4MB PSRAM(附串口验证代码)
  • 基于BCA特征选择与CNN-RNN混合模型的情感分析优化实践
  • 云原生技术学习日志Day01:Linux基础入门