当前位置: 首页 > 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.jsqmd.com/news/892980/

相关文章:

  • cc/ds教学,计算机小白笔记(2.2)
  • alert - So
  • 南京少儿围棋考级培训推荐:南京棋院考级专长 - 19120507004
  • 一文读懂 Agent Skills:AI 智能体的 “超级技能包”
  • 想找靠谱的建站服务商?这6款高实用性工具别错过!
  • 奥迪改装维修保养较好的汽修店推荐选安迪安迪专修 - 资讯速览
  • 学Simulink——开关磁阻电机(SRM)的四象限运行与转矩脉动抑制仿真
  • 汇成广告7年数智营销全链路服务全景:资质与业务解析 - 资讯速览
  • 中小团队如何利用Taotoken实现多模型API的成本优化与统一调度
  • 2026 土工布工厂哪家批发最优惠:恒全土工材料批量特惠 - 13425704091
  • 2026 AI搜索优化白皮书:品牌信任链的重构与交付标准 - 资讯速览
  • 开源界报表扛把子:JimuReport积木报表到底是个什么产品?优势在哪,又有哪些竞品
  • 王铎行书立轴《赠静观长老方外友之二首》欣赏
  • 【深度解析】Open Human:Local-First 记忆树驱动的桌面 AI Agent 架构与实战
  • 对比直接使用官方API体验Taotoken在延迟与路由容灾方面的实际感受
  • 30亿GEO市场谁在领跑?2026年GEO优化公司综合权威实力排行榜 - GEO优化
  • 全国陪诊顾问报名条件详解,零基础、宝妈、上班族都能报名吗? - 深鉴新闻
  • 2026年苏州机械工厂GEO优化哪家好?| 行业排名新优势 - 资讯快报
  • AI大模型三种部署方式与企业落地全解析
  • 南京少儿围棋考级培训排名:南京棋院榜单领先 - 13724980961
  • Python全栈修炼之路 | 第6篇:条件判断与循环控制
  • 中山琪朗丨2026 精选推荐・实力工厂,酒店灯饰定制 + 高端定制灯饰 - 资讯速览
  • 2026年国内五大特色营销服务机构深度对比 - GEO优化
  • 数智营销服务商能力评估参考:四个维度看汇成广告的落地效果 - 资讯速览
  • ClaudeCode入门11-CLAUDE.md深度配置(小白入门:让AI真正“懂“你的项目,效率翻10倍的秘密武器)
  • KMS_VL_ALL_AIO:告别Windows和Office激活困扰的智能解决方案
  • 食品标签“文字游戏”何时休?——透视“名不副实”背后的标准与监管困局
  • AI智能体时代来了!一个让普通人也能1人运营一家公司的开源社区火了
  • 降权、预算归零、错失窗口期:2026年企业选择SEO服务商最容易踩的三个大坑 - GEO优化
  • 基于BCA特征选择与CNN-RNN混合模型的情感分析优化实践