自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(51)
  • 问答 (5)
  • 收藏
  • 关注

原创 业务网关的设计与实践

上图为简易的请求链路图,其主要展示了请求从用户端发出到到达业务应用之间的链路。在完整的系统架构图中通常会把这部分概括为网关层,细分的话会先后经历CDN节点、流量网关、业务网关。CDN的作用大家都清楚,这里就不做赘述。流量网关和业务网关则各自有自己的定位和职责。

2024-04-04 22:20:06 696

原创 【存储】blotdb的原理及实现(2)

在etcd系列中,我们对作为etcd底层kv存储的boltdb进行了比较全面的介绍。但是还有两个点没有涉及。第一点是boltdb如何和磁盘文件交互。持久化存储和我们一般业务应用程序的最大区别就是其强依赖磁盘文件。一方面文件数据结构和内存数据结构的差异很大,需要设计合适的文件数据结构(文件布局)来保证足够的读写效率;另一个方面,在与磁盘文件的读写交互上也需要做各种优化以提升db的整体性能。boltdb的文件布局在上一篇中已经介绍过了,本篇中会介绍mmap,boltdb用来做文件交互的技术。

2023-11-29 20:04:55 1070

原创 【存储】lotusdb的原理及实现

就如文章开始所讲,博主认为lotusdb还是一个相对比较稚嫩但挺有意思的项目,能够反映出作者的一些有意思的想法。其中的问题,随着迭代也会慢慢完善。如果觉得本文对您有帮助,可以请博主喝杯咖啡~

2023-10-29 21:39:09 178

原创 【golang】调度系统之整体介绍

调度系列前面几篇对调度体系的G、M、P、sysmon分别进行了介绍。拆分的介绍有助于聚焦单一的角色,比较快地建立认识,同时也能更深入细节,但是不足以建立全局的认知。本篇在前面几篇的基础上,进行汇总的介绍。介绍的方式为选取runtime的几个阶段,介绍调度体系在对应阶段的状态,以及阶段之间的演进。

2023-09-29 17:53:47 476

原创 【golang】调度系列之sysmon

回到sysmon,sysmon是一个管理线程或者说守护线程,其是对GMP调度架构的补充和兜底。通过前面的几篇介绍,可以知道GMP的调度完全是主动协作式的调度。但该对象只是维护一些全局的数据,而不承担实际的调度职责,并不值得单独介绍,感兴趣的同学可以自己了解一下。由于sysmon函数是循环不返回的,所以对应的m(也就是线程)永远运行sysmon,并且不需要获取p。sysmontick表示sysmon观测到的调度和系统调用情况,schedtick、syscalltick为实际的调度和系统调用情况。

2023-09-24 19:08:34 378

原创 【golang】调度系列之P

一个简单的任务处理系统,只任务和worker两个对象足够胜任。从这个角度来说,似乎GM就足够了,并不需要P。实际上,golang的调度系统最开始就是采用了GM模型。然而golang的调度系统显然不是简单的任务处理系统,而是一个复杂度非常高的任务系统,在迭代过程中遇到了很多的问题。为了解决这些问题,runtime在G和M之间引入了一个中间层,就是P。

2023-09-19 22:34:05 409 2

原创 【golang】调度系列之m

本篇呢,依旧是只聚焦于m本身。同样的道理,抛开G和P,很难讲到面面俱到。但是同样的,读完本篇,相信对m也会有一个本质的理解。m就是一个worker,其同一个os线程关联。我们会将活跃的m的数量控制在一定的范围,以避免过多的切换造成不必要的损耗。m在不同条件下会在running、spinning、idle之间进行状态的转换。我们通过不同的队列以及一些同步机制在用户态来管理m。

2023-09-10 21:06:44 673

原创 【golang】调度系列之goroutine

前面的两篇,从相对比较简单的锁的内容入手(也是干货满满),开始了go的系列。这篇开始,进入更核心的内容。我们知道,go应该是第一门在语言层面支持协程的编程语言(可能是我孤陋寡闻),goroutine也完全算的上是go的门面。golang围绕着goroutine构建了一整套用户态的调度体系,并不断演进至当前的GMP模型。接下来相当的一段时间,我们应该都会在介绍GMP以及调度机制中度过。本篇呢,我们就从goroutine开始说起。

2023-08-30 21:41:39 565

原创 关于golang锁的一点东西(2)

互斥锁中,更多是介绍了偏低层的机制和实现。在本篇中,更多是着眼于读写锁的上层的设计。不得不说,读写锁的设计还是非常有意思的,理解其设计对更深刻地理解同步机制非常有帮助,同时,对我们程序中构建同步机制也会有所借鉴。

2023-08-06 16:59:52 597

原创 关于golang锁的一点东西

本文基于go 1.19.3最近打算再稍微深入地看下golang的源码,先从简单的部分入手。正巧前段时间读了操作系统同步机制的一点东西,那么golang这里就从锁开始好了。在这部分内容中,可能不会涉及到太多的细节的讲解。更多的内容会聚焦在我感兴趣的一些点,以及整体的设计方面。那么,接下来就是我感兴趣的第一个点:golang的锁是什么级别的锁?

2023-07-31 22:26:39 426 1

原创 碎语 二三

但是那段时间同时去读了etcd的源码及boltdb的源码,在数据库层面还是有所收获,并且也输出了几篇文章。后来再想继续去看大数据和k8s的内容,却是心生懈怠:这些内容也只是拓宽了眼界,很难对我技术水平产生质的提升,那么读之何用呢?今日想来,技术提升本来就是量变到质变的过程,哪有锦囊妙计一步给我质的提升。曾尝试写点东西,但是内功还是欠缺,蹉跎半个月,写了五六百字,最终不成文。同时呢,拓宽宽度广度的书也要读,权当消遣读物,每日翻两页。“不求甚解,每有所得,便欣然忘食”,不抱功利的心态去读。

2023-07-23 21:00:17 309

原创 客户端ack模块的实现

客户端ack模块的实现

2023-04-09 00:03:42 377

原创 【存储】etcd(4)-raft

etcd raft模块的设计及实现

2023-03-17 22:53:21 698

原创 【存储】etcd的存储是如何实现的(3)-blotdb

etcd的底层kv存储 boltdb

2023-02-21 21:43:55 954 2

原创 【存储】etcd的存储是如何实现的(2)-mvcc

etcd mvcc的实现

2023-01-28 17:33:02 562

原创 【存储】etcd的存储是如何实现的(1)-storage

etcd存储模块的实现,包括wal预写日志、raft日志存储、backend kv存储、事务等

2023-01-25 17:04:53 733

原创 【golang】golang面向包的设计

最近在做重构,并且是一个基础组件的重构,所以想写点关于如何写代码的东西。如何写代码是一个很大很大的话题,可以涉及到的内容很多,比如相对基础的有设计原则、设计模式、代码规范等,相对高阶一点指导代码架构的简洁架构、领域驱动等。本篇的内容会聚焦于代码架构层的内容。同时因为作为基础组件,不包含复杂的业务,所以类似领域驱动的内容也不会涉及。所以本篇的内容可以定位为中等复杂程度的golang项目应该如何组织代码。

2022-11-20 18:49:57 999

原创 grpc客户端连接源码解读

最近在做grpc连接池的优化,正巧之前只是粗略地读了一些grpc的源码,借这个机会把相关grpc的源码认真读一读,更深入地理解grpc客户端连接的参数,帮助优化grpc连接池。

2022-10-02 17:13:57 1754

原创 一种巧妙的令牌桶的实现

一种巧妙的令牌桶的实现

2022-08-13 23:49:08 580

原创 【微服务】链路追踪 jaeger

分布式链路追踪jaeger

2022-08-06 02:01:49 1810

原创 【golang】time源码解读

最近看了一些golang的time相关的内容,零零散散地凑点东西写写。主要会有几点内容:然后有很多内容网上有很多文章其实讲得很清楚了,文中我可能会贴一些链接,然后简略的带过。系统调用是指用户态的进程向操作系统内核请求更高权限的服务,这些服务一般包括进程管理、内存管理、文件系统等。发生系统调用时需要进程从用户态切换到内核态,进行上下文切换,损耗很大。系统时间也是由操作系统内核所管理的,之前一直以为time.Now()需要发生系统调用。包括之前看到一篇关于系统性能优化的博客,里面特意提到time.Now()为系

2022-06-25 18:07:18 1072

原创 【微服务系列】Protocol buffer和grpc动态解析

protobuf and grpc的动态解析

2022-06-02 00:31:55 1221 8

原创 【微服务系列】服务治理小记

本系列准备介绍微服务框架的相关内容,以我目前在用的kite框架为栗子,也扩展一些业界常见的实现,主要包括一下的部分:rpc框架基础kite的具体实现服务治理概述其他实现细节及优化微服务系列之前写过RPC基础和kite的具体实现两篇,服务治理的这篇拖得有点久。因为服务治理真的是个很大很深的话题,随着时间总是有不同的感悟。最终决定还是先写一篇,暂时地完成这个系列。后面可以再开新篇,毕竟写博客更多是为了总结记录反思进步。文章目录流量治理负载均衡P2CEWMA衰减函数熔断断路器弹性熔断限流总结.

2022-01-09 23:47:54 715

原创 一次关于读写锁的探索

在最近的一次goroutine数量过高(1w+)问题的排查中,发现大部分goroutine都阻塞在锁上,pprof如下。goroutine数量过多的问题是因为在执行异步任务时无脑的go func(),这个问题在本篇中就不讲了。阻塞在锁上是因为在异步任务链路中存在一次rpc请求,并且对该rpc请求的结果使用了lru的本地缓存,很多goroutine都阻塞在lru的锁上。在典型的双链表实现的lru中,Get和Set都需要加互斥锁,因为在Get操作中涉及到了链表顺序的调整。本篇中,我尝试实现一种使用读写锁的Lr

2021-12-23 20:52:00 558

原创 【golang】垃圾回收

仅是单纯的自己梳理的脉络,记录一些自己觉得重要的点。文章目录常见的GC算法golang的GC算法混合写屏障常见的GC算法常见的gc算法有引用计数、标记-清除、复制整理、标记-清除整理等。其中引用计数、标记-清除的侧重点在于发现可以被回收的对象;复制整理、标记-清除整理的侧重点在于解决由于垃圾回收导致的内存碎片问题。引用计数相对标记清除来说更加简单,在对象的引用数为0时直接清除即可,但是最大的问题就是无法解决循环引用的问题。标记清除可以解决循环引用对象的gc问题,但是在标记-清除时通常需要stop .

2021-12-06 16:45:42 587

原创 【golang】性能优化

文章目录GC优化技巧slice预分配内存map预分配内存字符串拼接其他内存优化的例子计时器优化excel导出内存优化这篇文章打算聊聊go的性能优化。性能优化其实是一个很大的话题,要是铺开来讲十篇文章也讲不完。所以我加了两个限制词:golang和内存,把主题从性能优化减小到语言层面的内存相关的性能优化。文章内容会先介绍golang的GC,同样按我以往文章的风格,GC这部分不会写得太详细,因为已经有太多优秀的文章了。然后会讲一些性能优化技巧。最后是我在最近做的和内存相关的两个优化,一个是定时器相关,一个exc

2021-12-04 20:14:18 2188

原创 【存储】MySQL 和 MongoDB

这篇文章主要想聊聊mysql和mongoDB。这两个数据库的定位都是持久化的主存储。mysql的地位不用多说,mongoDB的应用也越来越广泛。在学习mongoDB的过程中,发现其在设计上和mysql有很多相似的地方,所以想着写一篇关于mysql和mongoDB文章。本文的内容会包括技术选型、索引、事务、日志、数据一致性等,因为内容较多,可能很难一次写完。我会尽量督促自己多思考、多总结、多写、多分享。然后内容可能不会太详细,后面会慢慢完善,包括补充一些图片。技术选型:MySQL or MongoDB说

2021-11-27 16:41:49 2773 2

原创 【微服务系列】kite的具体实现

本系列准备介绍微服务框架的相关内容,以我目前在用的kite框架为栗子,也扩展一些业界常见的实现,主要包括一下的部分:rpc框架基础kite的具体实现服务治理概述其他实现细节及优化以一个简单的demo示例,从服务端和客户端两部分来进行解读。thrift文件如下,定义了itemService,其接收一个带id的request,返回相应的response。include "base.thrift"namespace go kite.example.itemstruct Item {.

2021-10-27 21:14:37 590

原创 词频分析方案

在我们做的调研产品中,最近有个词频分析的需求,其希望能从用户的文本作答中提取关键词并按照频次排序展示,同时可以从关键词得到其来源的完整作答。预期的效果是这样的,当然前端如何展示我们并不是那么关心。从后端的角度,可以将需求做如下拆分:分词:将文本作答进行分词处理得到关键词;存储:需要将分词结果进行持久化的存储;查询:对分词的结果进行聚合并按频次排序,根据关键词召回其来源的作答;在技术选型上,说起分词,首先想到的其实就是es。除了内置的分词功能外,es的聚合功能和搜索功能也满足对关键词进行聚合

2021-10-13 21:15:49 2354

原创 基于websocket实现长连接服务

最近做了一个长连接相关的小需求,业务场景为报告的评论。当对报告进行评论时,其他在浏览该报告的用户会得到评论的推送。具体的该功能的实现是基于公司提供的长连接的基础服务,我们只需要接入该平台,申请的得到类似appId的服务标识,并实现相应的rpc方法即可。基于这个需求,也顺便去了解了websocket的相关内容以及如何自己实现一个websocket服务。关于websocket的内容这里就不多说了,其是一个基于TCP的应用层协议,利用http进行握手而建立连接,最大的特点就是全双工通信,即服务端可以主动向客户

2021-10-12 23:29:28 1575

原创 【微服务系列】RPC基础

本系列准备介绍微服务框架的相关内容,以我目前在用的kite框架为栗子,也扩展一些业界常见的实现,主要包括一下的部分:1. rpc框架基础2. kite的具体的实现3. 服务治理概述4. 其他实现细节及优化......

2021-09-15 16:58:08 1662

原创 【mongoDB】mongoDB的多健索引及查询优化

最近做了一些mongoDB的慢查询工作。完成该工作后照例对mongoDB查询优化的内容进行总结,其中包括索引、执行计划、优化器等内容。索引数据库组织数据的形式是由存储引擎决定的,mongoDB从3.2版本开始采用wiredTiger作为默认的存储引擎。wireTiger支持B+树和LSM树,默认是采用B+树。mysql的InnoDB同样是采用B+树来组织数据,区别在于mongoDB中的B+树是非聚簇的。因为底层的数据结构相同,所以mongoDB的索引和mysql的索引具有非常多的相似之处,比如都支持

2021-08-29 15:34:31 1555

原创 单点登录和第三方登录

最近做了一些登录相关的工作,顺便看了下常见的登录方案,这里主要从后端的角度梳理一些技术细节。单点登录单点登录(Single Sign On),简称SSO,是目前比较流行的一种解决方案,其表现为对一组相互信任的应用,用户只需要登录其中一个应用,就可以访问所有相互信任的应用,登出依然。最常见的就是淘宝和天猫,当登录其中之一后,另外一个天然的共享登录态。单点登录实现需要依赖独立部署的认证服务来实现。我们假设有A和B两个相互信任的应用,共同接入了独立部署的认证中心sso(接入采用的是OAuth,在第三方登

2021-07-31 22:18:01 2408

原创 【mysql】查询优化——mysql如何选择最优的执行计划

【这篇文章最开始是在公司内部写的,后面抽了点时间稍微整理了一下,主要是把涉及到公司内部数据的部分去除,可能会导致一些阅读不畅】本文的内容主要涉及到一些工具命令比如explain\optimize trace、mysql优化器的工作原理以及涉及到InnoDB的相关内容。mysql逻辑架构优化分析: explain和optimize trace一条sql语句通常都会有多种执行方案,mysql的优化器会选择其认为最优的方案进行执行,这里的最优其是指成本最低,在后面的优化器工作原理中会详细讲到。在和mys

2021-05-25 18:13:45 705

原创 【go】gomock的使用方法及源码解析

gomock是官方提供的mock框架,用于解决单元测试中遇到的外部依赖问题,并且还有mockgen工具用来辅助生成相关的mock代码。gomock的原理是:针对 interface 生成对应的Mock代码文件,其中包含了一个实现该接口的结构,并提供了操作该结构行为的方法。使用该结构代替真实的依赖,可以控制下游按我们想要的方式进行某些操作和返回结果,以此达到解除外部依赖的目的。1. 安装gomock和mockgen# 安装gomock和mockgengo get -u github.com/golan

2021-04-07 18:21:37 2123

原创 【git】git底层原理及相关命令

写在前面git是一款非常好用的分布式的版本控制软件,然后最近看了git底层实现的一些东西(也不是很底层),记录总结一下,以便更好的理解使用git。本文主要是从三个对象说起。三个对象三个对象分别是git对象、tree对象、commit对象。三个对象对我们理解git如何组织和保存数据,以及git的各种操作如何实现非常有帮助。git对象git对象对应的是单个的文件内容,保存在版本库中。git对象没有名字,是通过文件内容的哈希值来进行标识的。可以通过底层命令git hash-object 文件路径

2021-01-12 18:42:35 206

原创 【python】正则表达式

写在前面:最开始接触正则表达式是看了廖师傅的教程。里面介绍了一些基础的内容,最近看flask的源码,看路由部分的时候又涉及了很多正则表达式的内容,所以准备开个帖子,将正则表达式的内容整理一下,以后遇到的新的内容也添加进来~分组()当在正则表达式的pattern中使用()将某一部分括起来的时候,就是使用了分组的功能。对匹配成功后返回的match对象,可以调用group方法来查看分组的结果。>>> m = re.match(r'^(\d{3})-(\d{5})$', '010-5432

2020-11-29 13:06:07 96

原创 【flask】nginx+uwsgi部署flask应用

最近几天研究了一下运行flask应用的方式,所以就总结一下。内容包括nginx+uwsgi部署flask应用,但是也包括一下其它的相关内容。一、使用flask自带的web server当我们完成一个flask应用的时候,通常会添加下面这段代码。if __name__ == '__main__': app.run('127.0.0.1', 8080)这就是以flask自带的web_server运行了我们所写的flask应用。点进去可以看到这个web_server是通过werkzeug.se

2020-11-24 23:14:34 583

原创 【linux】虚拟机centos7安装python3

https://www.cnblogs.com/mosson/p/12485517.html

2020-11-23 13:45:24 446

原创 【linux】虚拟机centos繁忙导致无法关机

将虚拟机安装目录下的.lck文件删除然后重启即可。

2020-11-23 12:07:54 731

空空如也

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

TA关注的人

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