go: Bulkheads Pattern
项目结构/* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Bulkheads 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/6/27 22:36 # User : geovindu # Product : GoLand # Project : godesginpattern # File : config.go */ package config // 舱壁配置各业务域独立并发数、超时时间 var BulkheadConfig map[string]BulkheadConf{ inventory: {MaxWorkers: 2, Timeout: 3}, // 库存2并发3秒超时 order: {MaxWorkers: 3, Timeout: 3}, // 订单3并发 logistics: {MaxWorkers: 2, Timeout: 3}, // 物流2并发 } type BulkheadConf struct { MaxWorkers int Timeout int } /* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Bulkheads 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/6/27 22:37 # User : geovindu # Product : GoLand # Project : godesginpattern # File : logger.go */ package common import ( log os ) var Logger log.New(os.Stdout, [Jewelry] , log.LstdFlags|log.Lmsgprefix) /* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Bulkheads 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/6/27 22:37 # User : geovindu # Product : GoLand # Project : godesginpattern # File : errors.go */ package core import errors var ErrBulkheadTimeout errors.New(舱壁执行超时已隔离保护) /* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Bulkheads 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/6/27 22:38 # User : geovindu # Product : GoLand # Project : godesginpattern # File : bulkhead.go */ package core import ( context time ) // Bulkhead 舱壁隔离并发、超时、故障 type Bulkhead struct { sem chan struct{} // 信号量控制并发 timeout time.Duration } func NewBulkhead(maxWorkers int, timeoutSec int) *Bulkhead { return Bulkhead{ sem: make(chan struct{}, maxWorkers), timeout: time.Duration(timeoutSec) * time.Second, } } // Execute 带舱壁隔离 超时执行 func (b *Bulkhead) Execute(fn func() interface{}) interface{} { // 并发限流 b.sem - struct{}{} defer func() { -b.sem }() // 超时控制 ctx, cancel : context.WithTimeout(context.Background(), b.timeout) defer cancel() // 执行结果通道 done : make(chan interface{}, 1) go func() { defer func() { recover() }() done - fn() }() select { case -ctx.Done(): return map[string]interface{}{success: false, code: 504, msg: ErrBulkheadTimeout.Error()} case res : -done: return res } } /* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Bulkheads 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/6/27 22:40 # User : geovindu # Product : GoLand # Project : godesginpattern # File : service.go */ package inventory import ( godesginpattern/bulkheads/common godesginpattern/bulkheads/config godesginpattern/bulkheads/core time ) var bulkhead core.NewBulkhead( config.BulkheadConfig[inventory].MaxWorkers, config.BulkheadConfig[inventory].Timeout, ) type InventoryService struct{} // QueryGemStock 查询宝石库存模拟超时故障 func (i *InventoryService) QueryGemStock(jewelryID string) interface{} { return bulkhead.Execute(func() interface{} { common.Logger.Println(查询珠宝库存 ID:, jewelryID) time.Sleep(5 * time.Second) // 故意超时 return map[string]interface{}{ success: true, code: 200, data: map[string]interface{}{jewelry_id: jewelryID, stock: 15}, } }) } // QueryGoldStock 查询黄金库存正常 func (i *InventoryService) QueryGoldStock(jewelryID string) interface{} { return bulkhead.Execute(func() interface{} { common.Logger.Println(查询黄金库存 ID:, jewelryID) time.Sleep(300 * time.Millisecond) return map[string]interface{}{ success: true, code: 200, data: map[string]interface{}{jewelry_id: jewelryID, stock: 32}, } }) } /* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Bulkheads 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/6/27 22:40 # User : geovindu # Product : GoLand # Project : godesginpattern # File : service.go */ package order import ( godesginpattern/bulkheads/common godesginpattern/bulkheads/config godesginpattern/bulkheads/core time ) var bulkhead core.NewBulkhead( config.BulkheadConfig[order].MaxWorkers, config.BulkheadConfig[order].Timeout, ) type OrderService struct{} func (o *OrderService) CreateOrder(orderNo string, amount float64, userID string) interface{} { return bulkhead.Execute(func() interface{} { common.Logger.Println(创建订单:, orderNo, 用户:, userID) time.Sleep(500 * time.Millisecond) return map[string]interface{}{ success: true, code: 200, data: map[string]interface{}{order_no: orderNo, status: 待支付}, } }) } func (o *OrderService) OrderSettle(orderNo, channel string) interface{} { return bulkhead.Execute(func() interface{} { common.Logger.Println(订单结算:, orderNo, 渠道:, channel) time.Sleep(400 * time.Millisecond) return map[string]interface{}{ success: true, code: 200, data: map[string]interface{}{order_no: orderNo, pay_status: 已支付}, } }) } /* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Bulkheads 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/6/27 22:41 # User : geovindu # Product : GoLand # Project : godesginpattern # File : service.go */ package logistics import ( godesginpattern/bulkheads/common godesginpattern/bulkheads/config godesginpattern/bulkheads/core time ) var bulkhead core.NewBulkhead( config.BulkheadConfig[logistics].MaxWorkers, config.BulkheadConfig[logistics].Timeout, ) type LogisticsService struct{} func (l *LogisticsService) ShipJewelry(orderNo, addr string) interface{} { return bulkhead.Execute(func() interface{} { common.Logger.Println(订单发货:, orderNo, 地址:, addr) time.Sleep(400 * time.Millisecond) return map[string]interface{}{ success: true, code: 200, data: map[string]interface{}{order_no: orderNo, express_no: SF123456}, } }) } func (l *LogisticsService) TrackExpress(expressNo string) interface{} { return bulkhead.Execute(func() interface{} { common.Logger.Println(查询物流:, expressNo) time.Sleep(200 * time.Millisecond) return map[string]interface{}{ success: true, code: 200, data: map[string]interface{}{express_no: expressNo, location: 深圳转运中心}, } }) }调用# encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述Bulkheads Pattern 舱壁模式 # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2024.3.6 python 3.11 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/6/26 23:31 # User : geovindu # Product : PyCharm # Project : pydesginpattern # File : BulkheadsBll.py import threading import time from BulkheadsPattern.common.logger import logger from BulkheadsPattern.business.inventory.inventory_service import InventoryService, inventory_bulkhead from BulkheadsPattern.business.order_pay.order_service import OrderPayService, order_bulkhead from BulkheadsPattern.business.logistics.logistics_service import LogisticsService, logistics_bulkhead class BulkheadsBll(object): # 实例化各业务服务 inv_svc InventoryService() ord_svc OrderPayService() log_svc LogisticsService() def run_scene(self): 模拟珠宝门店高并发流量场景 logger.info( 珠宝行业舱壁模式压测开始 ) start time.time() task_list [ # 库存域会超时故障 threading.Thread(targetlambda: logger.info(self.inv_svc.query_gem_stock(D001))), threading.Thread(targetlambda: logger.info(self.inv_svc.query_gem_stock(D002))), # 库存正常接口 threading.Thread(targetlambda: logger.info(self.inv_svc.query_gold_stock(G001))), # 订单支付域 threading.Thread(targetlambda: logger.info(self.ord_svc.create_order(O2026062601, 16888, U10086))), threading.Thread(targetlambda: logger.info(self.ord_svc.create_order(O2026062602, 9999, U10087))), threading.Thread(targetlambda: logger.info(self.ord_svc.order_settle(O2026062601, 微信支付))), # 物流域 threading.Thread(targetlambda: logger.info(self.log_svc.ship_jewelry(O2026062601, 深圳福田珠宝大厦))), threading.Thread(targetlambda: logger.info(self.log_svc.track_express(SF12345678))), ] # 启动所有并发任务 for t in task_list: t.start() for t in task_list: t.join() cost round(time.time() - start, 2) logger.info(f 压测结束总耗时 {cost}s ) def run_example(self): :return: try: self.run_scene() finally: # 优雅释放所有舱壁线程池资源 inventory_bulkhead.shutdown() order_bulkhead.shutdown() logistics_bulkhead.shutdown() logger.info(所有舱壁线程池已安全关闭) staticmethod def demo(): bll BulkheadsBll() bll.run_example()输出

相关新闻

第15篇 · Spring Boot自动配置探秘:约定优于配置的底层逻辑

第15篇 · Spring Boot自动配置探秘:约定优于配置的底层逻辑

在前面十多篇里,我们拆解了 IoC 容器、Spring MVC、AOP、事务管理——这些是 Spring 框架的核心能力。但你有没有想过一个问题:在 Spring Boot 出现之前,配置这些东西有多麻烦? 你需要写 web.xml 配置 DispatcherServlet&#xf…

2026/6/28 1:33:10阅读更多 →
unity 认识英语单词游戏 限时免费开源

unity 认识英语单词游戏 限时免费开源

unity认识英语单词游戏限时免费开源资源-CSDN下载

2026/6/28 1:33:10阅读更多 →
长时间运行应用开发的 Harness 设计

长时间运行应用开发的 Harness 设计

长时间运行应用开发的 Harness 设计 作者: Prithvi Rajasekaran(Anthropic Labs) 发布日期: 2026年3月24日 来源: Anthropic Engineering Blog Harness 设计是 Agent 编程前沿性能的关键。本文展示了我们如何在前端设计和长时间自主软件工程中进一步推动 Claude 的能力边界。…

2026/6/28 1:28:09阅读更多 →
“原型谬误”:语法正确与语义正确的混淆

“原型谬误”:语法正确与语义正确的混淆

为什么“AI 精神病”极易在公司高管层蔓延,而一线的技术负责人对此则表现的相当警惕?因为决策者混淆了“原型”与“生产系统”的边界。 非技术背景的决策者在评估 AI 能力时,通常是在完全受控的方式下进行的。比如 AI 在几秒钟内生成一个可运…

2026/6/28 3:03:15阅读更多 →
MCP(Model Context Protocol)深度解读:为什么 AI Agent 都需要一个标准化的“连接器“

MCP(Model Context Protocol)深度解读:为什么 AI Agent 都需要一个标准化的“连接器“

最近刷到 AI Agent 时,我第一反应不是"又一个热点",而是它已经开始改变普通开发者每天工作的顺序。 一、先看现场:AI Agent发生了什么 1.1 事件、产品或趋势的核心上下文 2024 年底,Anthropic 推出 Model Context Pr…

2026/6/28 3:03:15阅读更多 →
工业化交付的基石:深度拆解 3DGS 全能预处理工厂 —— GSBox

工业化交付的基石:深度拆解 3DGS 全能预处理工厂 —— GSBox

1. 引言:渲染器只是冰山一角 在 3D Gaussian Splatting (3DGS) 的热潮中,大家往往把目光聚焦在“谁的渲染器更快、更亮”上。然而,对于真正做项目交付的开发者来说,最头疼的问题往往发生在渲染之前: 训练出来的原始 .p…

2026/6/28 3:03:15阅读更多 →
Ollama部署和LLama Factory框架安装教程

Ollama部署和LLama Factory框架安装教程

目录 一、什么是Ollama, LLama Factory 1. Ollama:本地大模型运行器 2. Qwen、Gemma、DeepSeek:模型本身 3. Miniconda:Python 环境管理工具 4. PyTorch:训练和推理的计算库 5. LLaMA-Factory:大模型微调框架 二…

2026/6/28 3:03:15阅读更多 →
智能锡膏管理技术哪家强?看这3项指标就懂

智能锡膏管理技术哪家强?看这3项指标就懂

好的,遵照您的指示,以下是基于您提供的角色、任务和规范的行业分析文章。在SMT(表面贴装技术)行业,锡膏作为关键的焊接材料,其存储、管理与使用直接关系到最终电子产品的焊接质量与可靠性。传统的“冰箱人工…

2026/6/28 3:03:15阅读更多 →
现场直击:那场让人崩溃的深夜生产事故相信很多研发和运维朋友都经历过这样的“生死时刻”:

现场直击:那场让人崩溃的深夜生产事故相信很多研发和运维朋友都经历过这样的“生死时刻”:

凌晨两点,手机突然疯狂震动,监控系统的告警短信像连珠炮一样炸开: [FATAL] 02:14:15 Core-Service CPU Usage > 92% [ERROR] 02:15:02 API Gateway 504 Gateway Timeout rate > 15%你睡眼惺忪地打开电脑,一边在群里回复“收…

2026/6/28 2:58:15阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/6/28 0:08:01阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/6/28 0:08:01阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/6/28 0:08:01阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/6/28 0:08:01阅读更多 →