Go 调度篇
导读调度在计算机中是分配工作所需资源的方法. linux的调度为CPU找到可运行的线程. 而Go的调度是为M(线程)找到P(内存, 执行票据)和可运行的G.
首先,带着问题去思考🤔:
Go的调度为什么说是轻量的?
Go调度都发生了啥?
Go的网络和锁会不会阻塞线程?
什么时候会阻塞线程?
Go是怎样实现少量内核线程支撑大量 Goroutine 的并发运行?
为了最大限度利用计算资源,Go 调度器是如何处理线程阻塞的场景?相信你认真阅读完本文,这些问题都会找到答案!
背景常识调度的进化:Process -> Thread(LWP, lightweight process) -> goroutine (一种 lightweight userspace thread)其实就是一个不断共享, 不断减少切换成本的过程.
理解调度, 首先要理解两个概念: 运行和阻塞
线程其实并不是真正运行的实体, 线程只是代表一个执行流和其状态。真正运行驱动流程往前的其实是 CPU。
线程的运行, 其实是被运行。其阻塞, 其实是切换出调度队列, 不再去调度执行这个执行流。 其他执行流满足其条 ...
TiDB
我的思路引言
为什么不能在传统模型上去实现分布式的MySQL?
实现 MySQL 分布式的方案
通过 MySQL 的 server 把 InnoDB 变成一个分布式数据库
MySQL 生成的执行计划是个单机的,它认为整个计划的 cost 也是单机的,
把数据都拿回来计算这个太慢了
MySQL Sharding Proxy
它不支持分布式事务,不支持跨节点的 join,它无法理解复杂的 plan,一个复杂的 plan 打到 Proxy 上面,Proxy 就傻了,我到底应该往哪一个节点上转发呢,如果我涉及到 subquery sql 怎么办?
注: MySQL Sharding 的方案很典型的就是解决基本问题以后,业务稍微复杂一点,在 sharding 这一层根本搞不定。它永远需要一个 sharding key,你必须要告诉我的 proxy,我的数据要到哪里找,对用户来说是极不友好的.
因此,在传统模型下面的修改,天花板马上到了,基本上不可能解决这个问题。另外就是高可用和自动恢复,国内目前普遍做法叫做同城两地三中心或者异地多活,但现在基本上都不能自动切换。多数据中心的复制 ...
存储树型结构
下文主要想和大家分享,在DB中存储和查询树的4种方式,第4种方式存疑;
引言那么理想中的树型结构应具备哪些特点呢?
数据存储冗余小、直观性强;
方便返回整个树型结构数据,也可以很轻松的返回某一子树(方便分层加载);
快速获以某节点的祖谱路径;
插入、删除、移动节点效率高等等;
父ID + 递归算法使用递归算法。category 表中一个字段id,一个字段 fid(父id)。这样可以根据 WHERE id = fid 来判断上一级内容,运用递归至最顶层。
优点:
数据库结构设计简单,程序上实现容易;
增删改分类很轻松;
用频率最多的,大部分开源程序也是这么处理,不过一般都只用到四级分类;
缺点
分类组装数据时,读取不太方便,如果分类到更多级,那是不可取的办法;
注:这种方案有很多变种,可以通过加额外的字段如层数或者缓存存储,一定程度上提高效率;
父ID集合字段设置 fid 字段类型为 varchar,将父类id都集中在这个字段里,用符号隔开,比如:1,3,6。这样更容易得到各上级分类的ID。
查询某个分类下所有分类的时候可以使用:
1SELECT * FROM ca ...
Go 使用指南
入门脑图:https://www.processon.com/mindmap/5ea549685653bb6efc6e4201高阶脑图:https://www.processon.com/mindmap/60673b831e08534321f88c0c
下载&安装可以指定安装版本1go get github.com/someone/some_module@{YOUR_GIT_COMMIT_HASH}
eg: go get gitlab.pri.ibanyu.com/server/projectmanager/pub.git@master
Go 语言多版本管理利器 GVM
mac下设置gopath环境变量
官方指导
Bash
编辑~/.bash_profile文件,添加以下代码
123456789export GOROOT=/usr/local/Cellar/go/1.10.3/libexecexport GOPATH=/Users/chenxingyi/work/goexport GOBIN=export PATH ...
Go 可维护性建议
思维导图
1. 指导原则1.1. 清晰 - Clarity
Programs must be written for people to read, and only incidentally for machines to execute.*
程序必须是为人们阅读而编写的,只是偶尔为机器执行而已
1.2. 简单 - Simplicity
简单是可靠性的先决条件,控制复杂性是计算机编程的本质
构建软件设计有两种方法:
一种方法是使它简单到明显没有缺陷
另一种方法是使它复杂到没有明显缺陷,比第一种方法要困难得多
1.3. 生产力 - Productivity
设计是今天安排代码工作的艺术,而且永远是可变的
你花了多少时间来做有用的工作、等待工具、或者无可救药地迷失在外部代码库中。
有个笑话说,Go 是在等待 c + + 程序编译时设计的。快速编译是围棋的一个关键特性,这有助于 Go 开发人员感觉自己与使用动态语言工作的同行一样高效,而不会遇到这些语言固有的可靠性问题。
Go 程序员意识到编写代码是为了被读取,因此将读取代码置于编写代码之上。因此,甚至通过工具和自定义强制所有 ...
Go读取Excel数据
大家好,我是Golden,一个努力谋生的工具人!
引言:最近工作过程中,有需求要将excel中的图片上传到公司的OSS存储服务器。
经过一个下午的探索,已经将需求搞定了,开心的一批😊!
下面将自己在踩坑过程记录一下,分享给有需要的小伙伴哈,拿走不谢。。
问题1:Go中有可以读取的excel文件中图片的工具包呢?通过在Github中搜索,找到了一个功能丰富且强大的Excel工具类👍;废话不多说,上地址:
GitHub地址: https://github.com/360EntSecGroup-Skylar/excelize
码云地址: https://gitee.com/xurime/excelize (鉴于有些小伙伴,访问github慢,特此提供)
简介:Excelize 是 Go 语言编写的一个用来操作 Office Excel 文档类库,基于 ECMA-376 Office OpenXML 标准。可以使用它来读取、写入 XLSX 文件。相比较其他的开源类库,Excelize 支持写入原本带有图片(表)的文档,还支持向 Excel 中插入图片,并且在保存后不会丢失图表样式。
问 ...
代码风格规范
指导原则几乎不需要指向接口类型的指针interface的合理性验证1var _ http.Handler = (*Handler)(nil)
指针可以调用值方法!内部状态的 slices 或 maps输入输出要复制Channel 的 size 要么是 1,要么是无缓冲的,其他尺寸要严格审查使用defer释放资源12p.Lock()defer p.Unlock()
Defer 的开销非常小,只有在您可以证明函数执行时间处于纳秒级的程度时,才应避免这样做。使用 defer 提升可读性是值得的。Channel 的 size 要么是 1,要么是无缓冲的。其他尺寸都必须经过严格的审查。
枚举通常从1开始变量空值为0,因此枚举从 1 开始, 除非使用零值是有意义的,如:当零值是理想的默认行为时。const (Add int = iota + 1SubtractMultiply)
使用 sync/atomic 包的原子操作对原始类型 (int32, int64等)进行操作使用选择依赖注入方式避免使用可变的全局变量避免在公共结构中嵌入类型原因:这些嵌入的类型泄漏实现细节、禁止类 ...
zsh 粘贴慢问题
安装 iTerm2关于iTerm2 你不知道的一些事:
iTerm2 + Oh My Zsh 打造舒适终端体验
关于iTerm2 你不知道的一些事
问题描述使用 iTerm2 终端每次在粘贴大量命令的时间,明显感觉粘贴速度慢。就感觉粘贴也是一个字一个字粘贴的。在命令过长时由为明显。根本原因是由zsh-autosuggestions插件引起的。官方指引:Maybe fix for slow pastes
解决方案编辑 ~/.zshrc并增加以下代码
12345678910pasteinit() { OLD_SELF_INSERT=${${(s.:.)widgets[self-insert]}[2,3]} zle -N self-insert url-quote-magic}pastefinish() { zle -N self-insert $OLD_SELF_INSERT}zstyle :bracketed-paste-magic paste-init pasteinitzstyl ...
MySQL 使用指南
整体思维脑图:https://www.processon.com/mindmap/5f154637e401fd2e0def5918
[安装 MySQL]((https://blog.csdn.net/vkingnew/article/details/80105323))
引言:HomebrewCN:Homebrew的国内安装脚本,从此告别龟速更新
123456789101112brew install mysql配置:/usr/local/etc/my.cnf启动:/usr/local/bin/mysqld后台启动 :brew services start mysql前台启动: mysql.server start![89aad1d0bfa0761664628ff5757badd5.png](evernotecid://CD3082B6-03A3-4D41-80AB-E48CAD259C0B/appyinxiangcom/17782910/ENResource/p269)重要!! MySQL配置data目录为/usr/local/var/mysql注:偏好设置就没mysql图标
...
设计一个秒杀系统
背景秒杀活动对稀缺或者特价的商品进行定时定量售卖,吸引成大量的消费者进行抢购,但又只有少部分消费者可以下单成功。因此,秒杀活动将在较短时间内产生比平时大数十倍,上百倍的页面访问流量和下单请求流量。
秒杀活动可以分为 3 个阶段:
秒杀前:用户不断刷新商品详情页,页面请求达到瞬时峰值。
秒杀开始:用户点击秒杀按钮,下单请求达到瞬时峰值。
秒杀后:一部分成功下单的用户不断刷新订单或者产生退单操作,大部分用户继续刷新商 品详情页等待退单机会。消费者提交订单,如果简单利用数据库的行级锁,只有抢到锁的请求可以进行库存查询和下单操作。但是在高并发的情况下,数据库无法承担如此大的请求,往往会使整个服务 blocked,在消费者看来就是服务器宕机。
整体架构利用 DB + Redis + MQ 设计高并发的秒杀系统!
利用系统的层次结构,在每个阶段提前校验,拦截无效流量,可以减少大量无效的流量涌入数据库。
利用浏览器缓存和 CDN 抗压静态页面流量需要把秒杀商品详情页与普通的商品详情页分开。对于秒杀商品详情页尽量将能静态化的元 素静态化处理,除了秒杀按钮需要服务端进行动态判断,其他的静态数 ...