![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
golang
文章平均质量分 95
shanxiaoshuai
独学而无友,则孤陋而寡闻
展开
-
业务网关的设计与实践
上图为简易的请求链路图,其主要展示了请求从用户端发出到到达业务应用之间的链路。在完整的系统架构图中通常会把这部分概括为网关层,细分的话会先后经历CDN节点、流量网关、业务网关。CDN的作用大家都清楚,这里就不做赘述。流量网关和业务网关则各自有自己的定位和职责。原创 2024-04-04 22:20:06 · 725 阅读 · 0 评论 -
【存储】blotdb的原理及实现(2)
在etcd系列中,我们对作为etcd底层kv存储的boltdb进行了比较全面的介绍。但是还有两个点没有涉及。第一点是boltdb如何和磁盘文件交互。持久化存储和我们一般业务应用程序的最大区别就是其强依赖磁盘文件。一方面文件数据结构和内存数据结构的差异很大,需要设计合适的文件数据结构(文件布局)来保证足够的读写效率;另一个方面,在与磁盘文件的读写交互上也需要做各种优化以提升db的整体性能。boltdb的文件布局在上一篇中已经介绍过了,本篇中会介绍mmap,boltdb用来做文件交互的技术。原创 2023-11-29 20:04:55 · 1111 阅读 · 0 评论 -
关于golang锁的一点东西
本文基于go 1.19.3最近打算再稍微深入地看下golang的源码,先从简单的部分入手。正巧前段时间读了操作系统同步机制的一点东西,那么golang这里就从锁开始好了。在这部分内容中,可能不会涉及到太多的细节的讲解。更多的内容会聚焦在我感兴趣的一些点,以及整体的设计方面。那么,接下来就是我感兴趣的第一个点:golang的锁是什么级别的锁?原创 2023-07-31 22:26:39 · 445 阅读 · 1 评论 -
关于golang锁的一点东西(2)
互斥锁中,更多是介绍了偏低层的机制和实现。在本篇中,更多是着眼于读写锁的上层的设计。不得不说,读写锁的设计还是非常有意思的,理解其设计对更深刻地理解同步机制非常有帮助,同时,对我们程序中构建同步机制也会有所借鉴。原创 2023-08-06 16:59:52 · 601 阅读 · 0 评论 -
【golang】调度系列之m
本篇呢,依旧是只聚焦于m本身。同样的道理,抛开G和P,很难讲到面面俱到。但是同样的,读完本篇,相信对m也会有一个本质的理解。m就是一个worker,其同一个os线程关联。我们会将活跃的m的数量控制在一定的范围,以避免过多的切换造成不必要的损耗。m在不同条件下会在running、spinning、idle之间进行状态的转换。我们通过不同的队列以及一些同步机制在用户态来管理m。原创 2023-09-10 21:06:44 · 700 阅读 · 0 评论 -
【golang】调度系列之sysmon
回到sysmon,sysmon是一个管理线程或者说守护线程,其是对GMP调度架构的补充和兜底。通过前面的几篇介绍,可以知道GMP的调度完全是主动协作式的调度。但该对象只是维护一些全局的数据,而不承担实际的调度职责,并不值得单独介绍,感兴趣的同学可以自己了解一下。由于sysmon函数是循环不返回的,所以对应的m(也就是线程)永远运行sysmon,并且不需要获取p。sysmontick表示sysmon观测到的调度和系统调用情况,schedtick、syscalltick为实际的调度和系统调用情况。原创 2023-09-24 19:08:34 · 416 阅读 · 0 评论 -
【golang】调度系统之整体介绍
调度系列前面几篇对调度体系的G、M、P、sysmon分别进行了介绍。拆分的介绍有助于聚焦单一的角色,比较快地建立认识,同时也能更深入细节,但是不足以建立全局的认知。本篇在前面几篇的基础上,进行汇总的介绍。介绍的方式为选取runtime的几个阶段,介绍调度体系在对应阶段的状态,以及阶段之间的演进。原创 2023-09-29 17:53:47 · 490 阅读 · 0 评论 -
【golang】调度系列之goroutine
前面的两篇,从相对比较简单的锁的内容入手(也是干货满满),开始了go的系列。这篇开始,进入更核心的内容。我们知道,go应该是第一门在语言层面支持协程的编程语言(可能是我孤陋寡闻),goroutine也完全算的上是go的门面。golang围绕着goroutine构建了一整套用户态的调度体系,并不断演进至当前的GMP模型。接下来相当的一段时间,我们应该都会在介绍GMP以及调度机制中度过。本篇呢,我们就从goroutine开始说起。原创 2023-08-30 21:41:39 · 578 阅读 · 0 评论 -
客户端ack模块的实现
客户端ack模块的实现原创 2023-04-09 00:03:42 · 382 阅读 · 0 评论 -
【存储】etcd(4)-raft
etcd raft模块的设计及实现原创 2023-03-17 22:53:21 · 709 阅读 · 0 评论 -
【存储】etcd的存储是如何实现的(3)-blotdb
etcd的底层kv存储 boltdb原创 2023-02-21 21:43:55 · 1005 阅读 · 2 评论 -
【存储】etcd的存储是如何实现的(2)-mvcc
etcd mvcc的实现原创 2023-01-28 17:33:02 · 595 阅读 · 0 评论 -
【存储】etcd的存储是如何实现的(1)-storage
etcd存储模块的实现,包括wal预写日志、raft日志存储、backend kv存储、事务等原创 2023-01-25 17:04:53 · 795 阅读 · 0 评论 -
【golang】golang面向包的设计
最近在做重构,并且是一个基础组件的重构,所以想写点关于如何写代码的东西。如何写代码是一个很大很大的话题,可以涉及到的内容很多,比如相对基础的有设计原则、设计模式、代码规范等,相对高阶一点指导代码架构的简洁架构、领域驱动等。本篇的内容会聚焦于代码架构层的内容。同时因为作为基础组件,不包含复杂的业务,所以类似领域驱动的内容也不会涉及。所以本篇的内容可以定位为中等复杂程度的golang项目应该如何组织代码。原创 2022-11-20 18:49:57 · 1034 阅读 · 0 评论 -
grpc客户端连接源码解读
最近在做grpc连接池的优化,正巧之前只是粗略地读了一些grpc的源码,借这个机会把相关grpc的源码认真读一读,更深入地理解grpc客户端连接的参数,帮助优化grpc连接池。原创 2022-10-02 17:13:57 · 1873 阅读 · 0 评论 -
【golang】time源码解读
最近看了一些golang的time相关的内容,零零散散地凑点东西写写。主要会有几点内容:然后有很多内容网上有很多文章其实讲得很清楚了,文中我可能会贴一些链接,然后简略的带过。系统调用是指用户态的进程向操作系统内核请求更高权限的服务,这些服务一般包括进程管理、内存管理、文件系统等。发生系统调用时需要进程从用户态切换到内核态,进行上下文切换,损耗很大。系统时间也是由操作系统内核所管理的,之前一直以为time.Now()需要发生系统调用。包括之前看到一篇关于系统性能优化的博客,里面特意提到time.Now()为系原创 2022-06-25 18:07:18 · 1142 阅读 · 0 评论 -
【微服务系列】Protocol buffer和grpc动态解析
protobuf and grpc的动态解析原创 2022-06-02 00:31:55 · 1296 阅读 · 8 评论 -
一次关于读写锁的探索
在最近的一次goroutine数量过高(1w+)问题的排查中,发现大部分goroutine都阻塞在锁上,pprof如下。goroutine数量过多的问题是因为在执行异步任务时无脑的go func(),这个问题在本篇中就不讲了。阻塞在锁上是因为在异步任务链路中存在一次rpc请求,并且对该rpc请求的结果使用了lru的本地缓存,很多goroutine都阻塞在lru的锁上。在典型的双链表实现的lru中,Get和Set都需要加互斥锁,因为在Get操作中涉及到了链表顺序的调整。本篇中,我尝试实现一种使用读写锁的Lr原创 2021-12-23 20:52:00 · 564 阅读 · 0 评论 -
【golang】垃圾回收
仅是单纯的自己梳理的脉络,记录一些自己觉得重要的点。文章目录常见的GC算法golang的GC算法混合写屏障常见的GC算法常见的gc算法有引用计数、标记-清除、复制整理、标记-清除整理等。其中引用计数、标记-清除的侧重点在于发现可以被回收的对象;复制整理、标记-清除整理的侧重点在于解决由于垃圾回收导致的内存碎片问题。引用计数相对标记清除来说更加简单,在对象的引用数为0时直接清除即可,但是最大的问题就是无法解决循环引用的问题。标记清除可以解决循环引用对象的gc问题,但是在标记-清除时通常需要stop .原创 2021-12-06 16:45:42 · 596 阅读 · 0 评论 -
【golang】性能优化
文章目录GC优化技巧slice预分配内存map预分配内存字符串拼接其他内存优化的例子计时器优化excel导出内存优化这篇文章打算聊聊go的性能优化。性能优化其实是一个很大的话题,要是铺开来讲十篇文章也讲不完。所以我加了两个限制词:golang和内存,把主题从性能优化减小到语言层面的内存相关的性能优化。文章内容会先介绍golang的GC,同样按我以往文章的风格,GC这部分不会写得太详细,因为已经有太多优秀的文章了。然后会讲一些性能优化技巧。最后是我在最近做的和内存相关的两个优化,一个是定时器相关,一个exc原创 2021-12-04 20:14:18 · 2243 阅读 · 0 评论