自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

编程是艺术,极致是信仰,分享是连接世界的方式。

编码为乐,极致为标,分享为桥 —— 聚焦实用技术,传递纯粹热爱,共赴编程进阶之旅。

  • 博客(81)
  • 收藏
  • 关注

原创 架构破局 - Redis 不再做缓存!替代 MySQL 做主存储

本文给出一套可执行的、面向高并发核心链路的方案,将 Redis 从“缓存/加速”上升为“主存储/首选读写层”(Redis-First)。结论:在明确场景边界(高并发、数据模型适配、可接受的持久化策略)下,该方案可行且能显著提升吞吐与延迟,同时通过主从复制 + 持久化 + 热冷分层等措施,可将数据安全性和成本控制在可接受范围。下文给出关键论证、风险与缓解、以及较为落地的实现步骤供落地参考

2026-01-28 16:54:25 572

原创 AI 编程 - 提示词技巧

本文介绍了如何编写高效的AI提示词(prompt)以提升编程效率和质量。文章首先阐述了学习提示词的重要性,指出好的提示词能缩短开发周期、提高代码质量。接着详细讲解了提示词的结构要素,包括角色定义、任务描述、输入上下文等,并提供了通用模板和基础示例。在进阶技巧部分,文章分享了分步式提示、少样本示范、格式约束等实用方法。最后给出了编程场景下的高质量提示示例,并解答了常见问题,建议通过实战练习、构建个人Prompt库等方式持续优化提示词技能。

2026-01-20 16:45:38 567

原创 Anthropic Agent Skills深度解析:模块化技能如何重塑AI智能体落地能力

摘要: Anthropic推出的Agent Skills是一种模块化技能框架,通过结构化、可复用的技能包(包含元数据、指令和脚本)提升AI智能体(如Claude)的复杂任务执行能力。其核心特点包括渐进式披露(按需加载技能)、跨平台开放标准(agentskills.io)和可组合性(多技能协同)。相比传统工具调用,Skills优化了Token使用和复用性,支持团队协作与版本控制。实现时需规范SKILL.md元数据,拆分通用技能模块,并注意安全性与灰度发布。该框架为智能体生产级开发提供了标准化解决方案。

2026-01-18 11:20:35 658

原创 2026 年 AI 革命性趋势与未来展望

AI领域2026年三大趋势:1)物理AI崛起,AI将从语言/图像工具升级为能理解并作用于现实世界的系统(黄仁勋);2)算力普及化,AI将向终端设备和边缘计算扩展(苏姿丰);3)空间智能突破,AI将具备三维世界理解与构建能力(李飞飞)。这些发展标志着AI正从实验室研究转向实用化、规模化阶段,涉及自动驾驶、机器人、工业仿真等多个领域。基础设施厂商与研究机构正通过生态合作推动这一变革,软硬融合将成为未来AI发展的关键特征。

2026-01-14 17:23:08 626

原创 Spring WebFlux 入门指南(初学者快速上手)

Spring WebFlux 响应式编程实践 摘要:Spring WebFlux 是Spring 5.x引入的异步非阻塞Web框架,基于Reactive Streams规范和Project Reactor实现。核心特点包括响应式编程模型(Mono/Flux)、背压机制和非阻塞I/O。本文重点介绍了WebFlux在实际业务中的三大基础设施应用:1) 使用R2DBC实现响应式数据库访问;2) 通过Reactive RedisTemplate操作缓存;3) 集成Kafka实现消息队列的响应式生产消费。同时提供了注

2026-01-06 14:56:32 879

原创 Go语言环形队列:原理剖析、编程技巧与核心优势

本文探讨了环形队列在高性能Go系统开发中的核心优势与实现方法。环形队列通过固定长度的数组和指针绕回机制实现空间复用,具有O(1)读写效率、固定内存占用和低GC压力等特点。文章详细解析了环形队列的核心原理、状态判断方法,并展示了Go语言实现的关键技巧,包括泛型支持、并发安全处理等。相比普通队列和channel,环形队列在高频读写场景下性能更优,可通过无锁设计进一步提升吞吐量,是日志收集、流式数据处理等高性能场景的理想选择。

2025-12-15 16:00:40 738 1

原创 揭秘NSQ核心设计:NSQD、Topic与Channel的关系及消息流转精髓

本文深入分析了NSQ分布式消息队列的核心设计,重点解析了NSQD、Topic和Channel三大实体之间的层级关系与交互逻辑。通过源码片段展示了NSQ采用“内存+后端”混合存储保障性能与可靠性,并利用读写锁实现并发安全。文章详细阐述了消息从Topic到Channel再到客户端的全链路流转过程,包括Topic的messagePump分发机制和Channel的消息推送逻辑。这些设计使NSQ兼具高并发处理能力、消息可靠性和扩展性,为构建高效分布式系统提供了重要参考。

2025-12-08 11:44:22 889

原创 Go 语言 interface 详解:从源码到实践

本文深入解析Go语言中interface的核心机制,从底层实现到最佳实践。主要内容包括:1)interface的两种底层数据结构(空接口eface和非空接口iface);2)接口定义、实现、组合及类型断言等基本用法;3)接口设计原则(小而专、依赖抽象)和使用技巧;4)常见陷阱如nil接口和接收者类型问题。文章强调接口在实现多态、组件解耦和测试中的价值,同时指出过度使用空接口和嵌套过深的弊端。通过源码分析和代码示例,全面展示了interface在Go语言中的工作原理和最佳实践。

2025-12-03 10:48:42 528 1

原创 NSQ 磁盘持久队列 DiskQueue 设计思想全解析

NSQ的DiskQueue通过巧妙设计实现高性能、强一致的磁盘队列:1)单协程ioLoop串行处理所有操作,天然线程安全无需加锁;2)采用"长度+数据"的紧凑二进制格式,实现高效顺序读写;3)文件滚动策略优化IO性能;4)元数据原子持久化确保崩溃恢复。这些设计使其成为高可靠、高性能的持久化队列典范,适用于消息队列、WAL等场景。代码精简而优雅,是工程实践的优秀范例。

2025-11-27 08:44:31 894

原创 深入 NSQ 延迟消息实现原理:设计巧思与性能优化

NSQ通过复用现有消息流转流程和优先级队列调度实现延迟消息功能。客户端使用DPUB命令发送延迟消息,服务端接收后标记消息延迟属性。Topic层统一存储延迟和普通消息,Channel层使用优先级队列+哈希表实现延迟调度,到期消息会被重新分发。这种设计简洁高效,无需单独架构即可实现延迟消息功能,展现了NSQ的轻量级优势。

2025-11-22 11:45:20 776

原创 NSQ 如何用自定义协议破解 TCP 黏包拆包难题?原理与设计剖析

本文探讨了TCP通信中的"黏包"问题及NSQ消息队列的自定义协议解决方案。黏包问题源于TCP流式传输的无边界特性,导致接收方难以区分消息边界。NSQ通过混合使用分隔符和长度前缀两种方式,为消息划定明确边界:文本命令部分采用换行符分隔,二进制消息体部分使用4字节长度前缀。这种设计兼具易读性和高效性,严格的消息长度校验机制和缓冲区复用进一步提升了协议健壮性和性能。NSQ的协议设计案例表明,解决TCP黏包问题的核心在于为消息建立明确的边界标识,这一思路可广泛应用于各类TCP通信场景。

2025-11-19 09:07:33 570

原创 一个「巧思」线程池:用单协程无锁控 Worker,动态扩缩容 + 优雅关闭全拿捏

一个高性能、功能丰富的 Go 语言协程池(Goroutine Pool)库,支持动态调整大小、结果订阅、优雅关闭等特性。

2025-11-17 08:46:38 776

原创 NSQ 消费者优雅关闭:源码拆解不丢消息的底层逻辑

NSQ 消费者优雅关闭的实现原理 NSQ 消费者优雅关闭通过客户端与服务端协作完成,主要分为三个阶段: 客户端发起关闭:调用 Consumer.Stop() 发送 CLS 命令,告知服务端准备关闭,并设置 30 秒超时保护。 服务端响应关闭:nsqd 收到 CLS 后,将客户端的 ReadyCount 设为 0,标记为关闭状态,停止发送新消息,并返回 CLOSE_WAIT 响应。 客户端完成清理:收到 CLOSE_WAIT 后关闭连接,停止消息处理器,等待所有协程退出,最终调用 exit() 完成关闭流程。

2025-11-15 13:35:55 987

原创 数据库设计黄金规范:从命名到索引的系统化最佳实践

本文摘要提出了一套数据库设计规范,涵盖命名规则、结构设计和字段类型三大核心板块。在命名规范部分,强调采用小写字母+下划线命名法,并对表名、字段名、索引名等对象提出具体标准;结构设计部分建议平衡范式与反范式,给出大表拆分、字段扩展等优化策略;字段设计部分则针对时间类、状态类、关联类等常见字段制定了详细规范,包括数据类型选择、命名格式和默认值设置等。该规范旨在提升数据库的可读性、一致性和维护性,指导开发人员构建更健壮的数据库架构。

2025-11-12 17:06:50 574

原创 Go 优雅关闭实践指南:从原理到框架落地

本文探讨了分布式系统中优雅关闭的重要性与实现方案。首先分析了三类典型错误:直接终止进程导致请求丢失、忽略超时控制导致服务无法关闭、资源释放顺序错误导致任务失败。然后提出优雅关闭四步原则:停止接收新请求、清理存量任务、释放资源、平稳退出。最后针对HTTP和gRPC服务给出了正确实现方法:HTTP服务使用Shutdown配合超时控制,gRPC服务使用GracefulStop而非强制Stop。通过系统化的错误案例与正确实践对比,帮助开发者构建高可用的服务终止机制。

2025-11-11 14:07:51 778 3

原创 重塑 exec.Command:打造更可控的 Go 命令执行器

executor 是一个专为解决 Go 命令执行痛点的开源组件,主要特性包括: 实时流式捕获命令输出,避免内存溢出 精准超时控制和上下文取消 彻底清理子进程无残留 输出截断保护防止OOM 简洁易用的Option API 快速安装: go get github.com/itart-top/executor 基础示例: result := executor.Run(ctx, "echo", executor.WithArgs("Hello")) fmt.Println(result.Stdout) // 输出:

2025-11-10 13:50:53 717

原创 深入理解 Context:从概念到实践,避开那些坑

Context是用于跨组件传递全局信息的容器,核心价值在于解耦和避免参数污染。最佳实践包括:将Context作为函数首个参数、控制数据存储量、及时取消避免泄漏、传递有效Context、自定义键类型防止冲突。应用场景广泛,如Gin框架传递请求数据、etcd客户端控制超时等。合理使用Context能提升代码可维护性和资源管理效率。

2025-11-10 07:42:04 909

原创 Go Channel 深度指南:规范、避坑与开源实践

本文系统梳理了Go语言Channel使用中的常见错误及最佳实践。常见错误包括:未初始化的nil Channel导致永久阻塞、无缓冲Channel的自阻塞、忘记关闭Channel引发Goroutine泄漏,以及过度依赖Channel造成的性能陷阱。最佳实践包括:明确无缓冲与有缓冲Channel的适用场景、合理设置缓冲大小、使用select处理超时与关闭、遵循"谁创建谁关闭"原则。文章还提供了主流开源项目中的典型案例,帮助开发者规避并发编程中的常见问题,正确高效地使用Channel。

2025-11-09 17:07:25 742

原创 Go+DDD 对象全家桶:DO/VO/DTO 等概念 + 实践

本文为Go开发者提供领域驱动设计(DDD)中各类对象的明确定义和实践指南。核心内容包括: 详细定义DO(领域对象)、VO(值对象)、DTO(数据传输对象)、PO(持久化对象)等概念,说明其核心特征和推荐存放位置 提出四大设计原则: 保持领域模型纯净性 明确转换责任边界 遵循依赖倒置 确保命名唯一性 提供标准项目目录结构 包含典型代码示例: 领域层实体(DO)和值对象(VO)的实现 基础设施层PO的定义 PO与DO间转换的映射函数 该指南旨在帮助开发者构建清晰的领域模型,正确处理各层对象转换,避免常见反模式。

2025-11-07 07:28:45 930

原创 Git 使用规范文档(最佳实践版)

本文详细介绍了团队Git协作规范,涵盖分支管理、提交信息、协作流程等核心环节。采用"主分支+支持分支"的分层模型,明确各分支职责与命名规则。提交信息遵循Conventional Commits规范,保证历史可读性。完整描述了功能开发流程,从分支准备到代码审查与合并。规范强调保护分支、定期同步代码、小步提交等最佳实践,旨在建立高效协作共识,解决分支混乱、冲突频发等问题。通过统一标准提升代码质量,降低维护成本。

2025-11-06 11:31:38 838

原创 在 Go 中用 DDD 风格组织代码:实践、目录与命名规范(可落地)

本文给出一个落地可执行的 Go + DDD 代码组织方案。包含:分层含义、推荐目录树、包命名与文件命名规范、典型代码片段(领域实体、仓储接口、应用服务、适配器/实现)、防坑注意项与代码风格建议。侧重 最小侵入、依赖倒置、包循环避免 与 Go 风格(gofmt、小写包名、单一职责、内建 internal 与 pkg 约束)。

2025-11-06 07:32:55 1123

原创 Go 语言依赖注入实战指南:从基础到高级实践

依赖注入解决无它时的紧耦合、性能差、难测试等问题,核心是分离依赖的创建与使用。Go 中可通过构造函数等方式实现,便于测试,大型项目可用 Wire,能解耦并提升代码可维护性。

2025-11-05 13:23:40 868 1

原创 Go Error 全方位解析:原理、实践、扩展与封装

Go 错误处理核心要点与工程实践 核心原理:Go 错误通过 error 接口实现,1.13+ 支持错误链(%w包装、errors.Is/As解析)。基础错误用 errors.New 或 fmt.Errorf,复杂场景可自定义错误类型。 最佳实践: 绝不忽略错误,需显式处理并记录上下文 区分错误类型(可重试/不可重试),通过接口标记可恢复错误 避免裸返回错误,用 %w 包装添加上下文(如参数、操作步骤) 错误日志标准化,包含时间戳、堆栈等关键信息 遵循这些原则可显著提升代码健壮性和可维护性。

2025-11-05 07:04:51 943

原创 nsqd Producer 高可用封装实践:从单点故障到自动故障转移

NSQ生产者池实现高可用消息发布 本文介绍了基于NSQ消息队列的高可用生产者池实现方案。该方案针对NSQ生产者在节点故障时的可用性问题,设计了一个自动故障切换的ProducerPool,具有以下核心特性: 自动故障切换:当活跃nsqd节点不可用时,自动尝试其他健康节点 并发安全设计:通过原子操作和无锁编程保证多goroutine并发安全 智能重连机制:采用指数退避+随机抖动策略控制重连节奏 优先级管理:支持为不同nsqd节点配置优先级 完善的可观测性:提供健康状态、失败率等监控指标 实现上通过Produce

2025-11-04 09:59:52 977

原创 Go 新手干货:4 个核心实践,让你的代码符合社区规范

本文总结了Go语言开发的4个核心实践:1)命名规范遵循简洁明确原则,避免冗余前缀;2)必须显式处理错误,不能忽略或隐藏;3)并发控制需谨慎,避免竞态条件和goroutine泄漏;4)使用context实现优雅的任务取消。每个实践都配有代码示例,帮助开发者快速适应Go的编程风格和最佳实践。

2025-11-04 09:55:40 1013

原创 Go优雅实现redis分布式锁

Go语言实现的Redis分布式锁

2025-01-27 23:16:07 1426

原创 Golang Ticker Reset异常的坑

timer.Reset无效, 执行两次

2025-01-27 16:58:25 847

原创 Go定时任务源码 - robfig/cron

robfig/cron源码解读

2022-11-21 23:12:46 1280

原创 在线编码、格式转换

日常开发或运维会比较常遇到日志中的内容格式不直观,需要转码或格式化的情况,这时候常常是去网上搜索在线工具,不但耗时耗力,又担心不安全,于是我索性就自己搭建一个,方便自己的同时,还可以分享给需要的朋友。

2022-09-11 15:32:09 1243

原创 Go限制深度遍历目录下文件

Go限制深度遍历文件夹下的文件

2022-04-23 19:41:44 1786

原创 Go chan实现并发请求聚合功能

背景有上万台边缘机器,每台都会有多个agent客户端,并且每个agent都会同时向中心系统上报数据,由于上报数据频繁,并发量也大,每个agent都频繁和中心建立连接,导致中心压力非常大,所以需要对此进行优化,对每台机器上的agent上报数据做聚合,批量进行上报,减少边缘和中心的上报频率,从而减轻中心压力。方案边缘增加一个batch中间件,所有agent上报的数据由原来直接向中心上报变为向batch中间件上报batch中间件会聚合请求,再分批向中心上报上报的方式也由原来的同步也改为异步,agent

2022-03-06 09:54:19 1005

原创 Go 并发控制、防击穿 - singleflight

背景在高并发场景下经常会有存在并发访问同一个资源,这些并发的请求参数是一样,并且响应的结果也是一样,如果每个请求都重复去查询资源,无疑会给系统带来不必要的开销,并且系统压力也会增大。为了保护资源,可以对相同资源的并发请求进行拦截,只允许一个请求去查询资源,然后将获取的资源分享给其他的请求,从而较少重复查询的开销,特别是解决缓存击穿时的并发问题。方案Go singleflightGo提供了singleflight组件:"golang.org/x/sync/singleflight"组件,可以很方

2022-02-24 22:36:27 1267 1

原创 Go 并发请求量限制组件分享

背景关于限流Go官方通过一个采用令牌池的算法的实现:golang.org/x/time/rate,但是,这个限制的是每秒的请求数,有的时候我们希望限制的是系统并发处理的请求数量,类似线程池的功能,需求如下:设置一个最大的请求处理数量,当请求超过时,后续请求将等待,直到有请求处理完后被唤醒。请求的等待时间能够指定,超出等待时间就返回,提示给客户端。等待请求的个数需要能够限制,数量超过时就直接返回,提示给客户端。设计设计思路是实现一个Ticket池(NumLimiter),每个请求首先需要向Nu

2022-01-11 21:07:12 836

原创 Go database/sql连接池 - 源码学习

引言Go内置了数据库相关的库 - database/sql,实现数据库操作相关的接口,其中还包含一个很重要的功能 - 连接池,用来实现连接的复用,限制连接的数量,从而最大程度的复用连接,提高性能,避免连接数量失控,导致资源消耗不可控。本文借Go内置的database/sql库,来一起学习如何一步步设计包含连接池的数据库组件,包括模型抽象、连接复用,以及如何管理连接数。设计模型抽象首先,我们要对解决领域进行抽象。我们目标是设计一个数据库连接组件,所以第一个对象模型很明确 - 数据库对象, 我们将数

2021-12-27 18:32:15 1399

原创 Go httptest WriteHeader无效问题

背景测试一个调用http接口时,使用了httptest.NewServer来mock一个http服务端,在验证响应异常状态码时发现奇怪问题,明明设置了异常状态码,但是http.Get始终返回的状态码都是正常的200:mockHttpSrv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("hello world")) w.WriteHeader(h

2021-11-24 23:42:42 899

原创 Go时区Parse的坑

日期解析背景当有一个日期字符串(2014-11-12 11:45:26)需要转化为Go的time类型,我们第一时间肯定会想到time包的Parse方法,指定字符串的格式layout:layout := "2006-01-02 15:04:05"str := "2014-11-12 11:45:26"t, err := time.Parse(layout, str)但是,有个容易忽略的问题,go语言默认的时区用的是UTC,而我们一般要的是本地时区,可以看一下源码:package timefu

2021-11-23 22:32:10 839

原创 Go http handler统一响应&异常处理

背景在web开发中,一般会写如下方法, 处理http的请求和响应结果:// 处理hello请求的handlerfunc HelloHandler(w http.ResponseWriter, req *http.Request) { name := req.URL.Query().Get("name") if name == "" { // name 必填判断 w.Write([]byte("name is required")) w.WriteHeader(http.StatusBadR

2021-11-22 13:06:19 2704

原创 Go推荐命名规范

Go命名规范好的命名可以提高代码的可读性,特点:统一 : 容易猜想,约定俗成简短 :容易书写(Go尤为强调)准确 :准确表达意思核心准则声明的地方和使用的地方离得越远,名字就建议越详细,相对也会越长,同样上下文没提供有效的描述也是如此。Camel命名Go推荐驼峰命名方式,不建议使用下划线(包括常量,包名)GooduserMangerUserManagerBeduser_manager单词缩写默认全大写,或全小写GooduserIDbaiduCDNidcd

2021-11-17 22:21:10 2633 3

原创 Go接口 - interface 实践

interface是GO语言中非常重要的类型,它是用来定义一类方法集,只表示对象的行为(Behavior),GO语言的接口和实现不需要显示关联(也就是常说的duck类型),只要实现了接口所有方法,就可以当做该接口的一个实现,赋值给所有引用该接口的变量,从而满足面向对象编程(OOP)中的两个非常重要原则:依赖倒置、里氏替换。也正由于这个特点,所以GO接口最佳的实践是:接口尽量的小,根据实际的需求定义的接口大小。例如:io包体的Reader/Writertype Reader interface {

2021-11-15 23:09:22 471

原创 Go 1.17泛型尝鲜

简介Go不支持泛型,但是对泛型呼声一直存在,所以Go也一直在努力支持,这次发布的1.17实际上就已经包含了泛型的功能,但是默认是不开启,需要增加:-G=3参数来开启:go run -gcflags=-G=3 main.goGo的泛型有以下应用场景例子泛化形参数组定义一个函数helloSlice,接收切片参数s,元素类型为任意类型T代码:package main import "fmt" // T 自定义类型func helloSlice[T any] (s []T) { for

2021-11-02 23:24:53 692

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除