- 博客(675)
- 资源 (3)
- 收藏
- 关注
原创 golang 中的 匿名函数和 闭包
匿名函数是一种没有函数名的函数,即定义即使用;闭包作为一种携带状态的函数,我们可以简单地将它理解为“对象”,因为它同时具备状态和行为。
2021-08-15 17:48:07
311
原创 极客时间 系统性能调优 笔记01 CPU & 内存 & 零拷贝 & 协程
CPU 的多级缓存刚刚我们提到,CPU 缓存离 CPU 核心更近,由于电子信号传输是需要时间的,所以离 CPU 核心越近,缓存的读写速度就越快。但 CPU 的空间很狭小,离 CPU 越近缓存大小受到的限制也越大。所以,综合硬件布局、性能等因素,CPU 缓存通常分为大小不等的三级缓存。CPU 缓存的材质 SRAM 比内存使用的 DRAM 贵许多,所以不同于内存动辄以 GB 计算,它的大小是以 MB 来计算的。比如,在我的 Linux 系统上,离 CPU 最近的一级缓存是 32KB,二级缓存是 256KB,
2021-07-03 16:45:50
1051
原创 深入理解支付设计
从 0 开始学习支付系统架构第一步,用户选择支付渠道,进入商户客户端; 第二步,商户客户端发送支付要素,到商户服务端; 第三步,商户服务端发起支付请求到渠道侧(个别渠道如支付宝是不需要此步骤); 第四步渠道返回支付凭证到商户服务端; 第五步商户服务端返回支付凭证到商户客户端; 第六步,用户调用支付宝控件完成支付。接下来是重点,第七步一般渠道是采用异步通知方法来通知商户,但是有些企业是在第六步支付完成之后,在C端会同步通知支付成功。如果以此结果来判断支付是否成功,其实是不严谨会出问题的
2021-06-26 12:03:20
374
原创 golang 源码分析06 Sync.Map
对于readOnly的map,amended = false,代表不可变先看Load方法,查询1.先从readOnly只读的map获取,如果获取不到,并且dirtyMap有数据,那么就lock解锁,并且双重检查,readOnly真没有2.dirtyMap有数据,就获取数据e,然后调用unlock解锁,返回数据+++++++++++++++++++++++++++++++++++++++++++++++++++++++++...
2021-05-29 16:56:23
199
1
原创 go语言知识点整理07 锁的使用 && Sync.map
在slice中len和cap时是两个完全不同的概念,len代表了元素个数,cap说明slice空间可以容纳多少个元素。在对 slice 进行 append 操作时, 如果 cap 容量足够,则直接在当前slice后面附加上添加的值,并将 len 修改为当前元素的个数。如果 cap 容量不够,则重新创建一个slice, 并将之前的slice 复制到新的slice中然后将添加的值附加到新的slice上。当 slice 出发扩容操作时,如果之前 slice 的cap小于 2048 时,每次扩容为之前容量的两
2021-05-28 19:57:00
420
原创 go语言知识点整理06 并发相关 cond
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++cond.go 源码分析cond 实现了一个条件变量,一堆协程等待发一个事件通知的汇合点每个Cond都有一个关联的Locker,当调用Wait 方法的时候,必须持有这个锁,才能修改condition下面来看核心方法Waitwait方法原...
2021-05-24 23:08:54
158
原创 golang 源码分析05 Mutex
上图是Mutex的结构体和locker接口方法定义Mutex的公平性,两种操作模式 正常normal和饥饿starvation互斥量可分为两种操作模式:正常和饥饿。在正常模式下,等待的goroutines按照FIFO(先进先出)顺序排队,但是goroutine被唤醒之后并不能立即得到mutex锁,它需要与新到达的goroutine争夺mutex锁。因为新到达的goroutine已经在CPU上运行了,所以被唤醒的goroutine很大概率是争夺mutex锁是失败的。出现这样的情况时候..
2021-05-24 17:58:41
129
1
原创 go语言知识点整理05 并发相关 mutex
学习过操作系统的都知道程序有临界区这个概念,临界区就是程序片段访问临界资源的那部分代码,临界区同一时刻只能有一个线程进行访问,其他线程需要访问的话必须等待资源空闲。那么一般编程语言都会使用锁来进行临界区访问控制。golang主要有两种锁:互斥锁和读写锁互斥锁Mutex:Mutex 用于提供一种加锁机制(Locking Mechanism),保证同一时刻只有一个goroutine在临界区运行。互斥锁定义如下:读写锁RWMutex:读写锁实际是一种特殊的自旋锁,它把对共享资源的访问者划分
2021-05-23 16:18:26
236
原创 golang 源码分析04 channel
https://www.cnblogs.com/ricklz/p/13813201.html看golang的源码 chan.go 即channel的实现 不要通过共享内存来通信,⽽应通过通信来共享内存。 这是更⾼层次的并发编程哲学(通过管道来传值是Go语⾔推荐的做法)。虽然像引⽤计数这类简单的并 发问题通过原⼦操作或互斥锁就能很好地实现,但是通过Channel来控制访问能够让你写出更简洁正确的程序。channelGolang中使用 CSP中 channel 这个概念。channel ...
2021-05-18 23:39:59
199
2
原创 高并发缓存实践 01
很多技术文章,介绍高并发查询DB(或其它数据源)的解法,中心思想,就是缓存。在服务和DB中间,加一层缓存,大致方案是:查询全部走缓存; 用一定的策略,构建缓存的key; 实现一种缓存更新的触发策略,例如任务轮训更新或查询时自动触发更新; 设置缓存更新延时,并通过分布式锁,按照设定的延时,控制缓存更新;问题来了:缓存延时带来了数据不准,如何缩小缓存更新延时?问题很简单,但背后有一坨思考:以tair为例,tair在写入(或更新)时,读取是阻塞的,也就是,一个key,要写入(或更新)完成后
2021-05-12 20:48:36
124
原创 golang 源码分析02 GoRoutine 中
协程调度器底层实现( G、M、P)G:Goroutine的缩写,一个G代表了对一段需要被执行的Go语言代码的封装M:Machine的缩写,一个M代表了一个内核线程P:Processor的缩写,一个P代表了M所需的上下文环境简单的来说,一个G的执行需要M和P的支持。一个M在与一个P关联之后形成了一个有效的G运行环境【内核线程 + 上下文环境】。每个P都会包含一个可运行的G的队列 (runq)。M (machine):M是machine的头文字, 在当前版本的golang中等同于系..
2021-05-11 22:59:35
156
1
原创 golang 源码分析01 GoRoutine 上
一、Golang简介1.1概述Golang语言是Google公司开发的新一代编程语言,简称Go语言,Go 是有表达力、简洁、清晰和有效率的。它的并行机制使其很容易编写多核和网络应用,而新奇的类型系统允许构建有弹性的模块化程序。 Go 编译到机器码非常快速,同时具有便利的垃圾回收和强大的运行时反射。而他最广为人知的特性便是语言层面上对多核编程的支持,他有简单的关键字go来实现并行,就像下面这样:Go的并行单元并不是传统意义上的线程,线程切换需要很大的上下文,这种切换消耗了大量CPU时间,而Go
2021-05-08 20:09:39
287
原创 go语言知识点整理04
2、go struct能不能比较 因为是强类型语言,所以不同类型的结构不能作比较,但是同一类型的实例值是可以比较的,实例不可以比较,因为是指针类型4、select可以用于什么,常用语gorotine的完美退出golang 的 select 就是监听 IO 操作,当 IO 操作发生时,触发相应的动作每个case语句里必须是一个IO操作,确切的说,应该是一个面向channel的IO操作5、context包的用途Context通常被译作上下文,它是一个比较抽象的概念,其本质,是【上下...
2021-05-08 17:38:15
212
原创 go语言知识点整理03
1.【初级】下面属于关键字的是()A. funcB. defC. structD. class参考答案:ACgo语言25个关键字总结var和const :变量和常量的声明 var varName type 或者 varName : = value package and import: 导入 func: 用于定义函数和方法 return :用于从函数返回 defer someCode :在函数退出之前执行 go : 用于并行 select 用于选择不同类...
2021-04-28 23:19:01
565
原创 service mesh课程笔记04 istio 案例
书bookInfo例子在bookInfo这个命名空间,开启istio-injection 自动注入给一个ratings服务,使用curl发送http请求,来查看响应结果创建ingress成功,然后通过浏览器访问地址,如下图所示创建gateway 成功给网关配置环境变量 主机ip继续配置gateway端口,如上图gateway的地址,拼接hots和port环境变量,设置为gateway_url配置路由,把流量都切...
2021-04-23 23:27:55
136
原创 service mesh课程笔记03 istio架构和组件
创建pod的时候,会发生自动注入,注入一个Sidecar代理;请求通过网关,会转发给Envoy 组件,envoy代理会把流量拦截 ;调用控制平台pilot 获取后台服务的实例列表和负载均衡配置,根据pilot的路由规则,把流量分发给指定的后台服务envoy前端服务和后台服务通信的时候,还需要到控制平面的citadel 获取证书和密钥envoy通过mixer上报通信的数据,来监控服务...
2021-04-18 22:40:47
135
1
原创 service mesh课程笔记01 架构发展历史
sidecar 为代理,控制服务流量进出linkerd 增加了更丰富的服务治理功能 1. 无需侵入业务代码就能管理服务的流量 2. 兼容k8s提供的功能缺点 : 1.部署繁琐 2.只实现了数据层面的问题,没有对数据层面进行管理istio既有数据平面,也有控制平面1.使用http rpc 自动负载均衡2.能够限流,故障转移,熔断3.集群内部流量自动均衡,监控集群内部所有的服务...
2021-04-18 21:51:40
123
1
原创 高并发设计11 秒杀
商品 商品的tair缓存热点key查询是主要风险,在tair mdb开启hotzone的情况下单key的qps上限是100w,抢购时详情、购物车、下单这条交易链路上的商品查询qps远远超过100w。 这次百亿补贴尖货都是普通前端商品,而在2020年春晚时为了保证春节期间发货,将春碗这款商品从淘宝心选改到了天猫超市,引入了主子商品模型。主子商品在做ic2 client查询时,须要分别从mdb读取主商品、主子关系、子商品,热点key的风险增大。 营销 尖货都报名了百亿补贴优惠活动,本质上是一个单品
2021-04-17 20:34:14
212
原创 kubernetes 学习05 Service
从etcd中获取变化,然后写入到本地iptablesIngress 需要绑定域名,客户端访问nginx,反向代理到后端的service两个协程直接沟通
2021-04-10 20:57:28
100
原创 kubernetes 学习03 资源清单
InitC : 初始化容器,生成文件,初始化完成后就会死亡;每一次init C完成后才能进入下一次init C,不能构建Main C : 开始会执行start指令,退出的时候,会执行stop 指令readiness : 就绪检测,根据tcp,http连接 判断状态是否可用;可用才把状态修改为runningliveness : 生存检测pause : 负责网络和存储卷的共享,同一个pod中,所有的容器都是共享的...
2021-04-10 14:52:18
88
原创 kubernetes 学习01
docker 是基于paas平台 ,platform as a servicePod 是K8s管理的最小单位scheduler把任务分发到不同的node节点
2021-04-06 00:27:25
109
原创 go语言知识点整理02
Golang面试问题汇总:1. Golang中除了加Mutex锁以外还有哪些方式安全读写共享变量?Golang中Goroutine 可以通过 Channel 进行安全读写共享变量。2. 无缓冲 Chan 的发送和接收是否同步?ch := make(chan int) 无缓冲的channel由于没有缓冲发送和接收需要同步.ch := make(chan int, 2) 有缓冲channel不要求发送和接收操作同步. channel无缓冲时,发送阻塞直到数据被接收,接收阻塞直到读到
2021-04-05 22:34:58
314
原创 go语言知识点整理01
1.go语言中切片的扩容机制是什么?如果切片的容量小于1024个元素,那么扩容的时候slice的cap就在当前容量的基础上翻番,乘以2;一旦元素个数超过1024个元素,增长因子就变成1.25,即每次增加当前容量的四分之一。如果扩容之后,还没有触及原数组的容量,那么,切片中的指针指向的位置,就还是原数组,如果扩容之后,超过了原数组的容量,那么,Go就会开辟一块新的内存,把原来的值拷贝过来,这种情况丝毫不会影响到原数组。即大致可以表述如下:当向切片中添加数据时,如果没有超过容量,直接添加,如果.
2021-03-28 23:40:46
212
原创 设计模式总结03 行为型模式 状态 && 观察者 && 中介者 && 迭代器
状态模式在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。状态模式的定义与特点状态(State)模式的定义:对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。状态模式是一种对象行为型模式,其主要优点如下。结构清晰,状态模式将与特定状态相关的行为局部化到一个状态中,并且将不.
2021-03-28 23:15:25
93
原创 设计模式总结02 行为型模式 模板 && 策略 && 命令 && 责任链
策略模式行为型模式是 GoF设计模式中最为庞大的一类,它包含以下 11 种模式。模板方法(Template Method)模式:定义一个操作中的算法骨架,将算法的一些步骤延迟到子类中,使得子类在可以不改变该算法结构的情况下重定义该算法的某些特定步骤。 策略(Strategy)模式:定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的改变不会影响使用算法的客户。 命令(Command)模式:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。 职责链(Chain .
2021-03-21 14:02:58
185
原创 go语言垃圾回收 学习02
https://blog.youkuaiyun.com/weixin_45583158/article/details/100143135?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control&dist_request_id=&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMach
2021-03-14 23:06:25
107
原创 go 语言垃圾回收 学习01
转载什么是垃圾回收?曾几何时,内存管理是程序员开发应用的一大难题。传统的系统级编程语言(主要指C/C++)中,程序员必须对内存小心的进行管理操作,控制内存的申请及释放。稍有不慎,就可能产生内存泄露问题,这种问题不易发现并且难以定位,一直成为困扰开发者的噩梦。如何解决这个头疼的问题呢?过去一般采用两种办法:内存泄露检测工具。这种工具的原理一般是静态代码扫描,通过扫描程序检测可能出现内存泄露的代码段。然而检测工具难免有疏漏和不足,只能起到辅助作用。 智能指针。这是 c++ 中引入的自动内存管理方法
2021-03-14 22:23:07
189
高并发交易系统介绍.pdf
2020-01-01
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人