Go的Context包
Go的Context包背景context 包是标准库中一个非常重要的组件,用于在不同 Goroutine 之间传递取消信号、超时警告和其他请求范围的值。它主要用于控制并发任务的生命周期,尤其是在复杂的网络服务和多层调用栈中。context 包的使用能够帮助开发人员写出更加清晰、健壮和易于维护的并发代码。下面介绍 context 包的基本用法和设计理念。
为什么需要使用context在并发程序中使用 Context 主要有两个目的:一是用来取消操作,二是用来传递请求范围的数据。
取消操作:当一个 Context 被取消时,所有基于该 Context 的操作都应该被取消。这是通过检查 ctx.Done() 返回的通道是否被关闭来实现的。如果该通道被关闭,表示 Context 已经被取消,相应的操作也应该停止。
传递数据:通过 context.WithValue 函数,可以将请求范围的值与 Context 相关联。这可以用来传递如请求ID、认证令牌等信息。
常见用法创建contextcontext 包通过 Context 接口提供功能。能直接创建一个 Context 实例,而是需要通过包 ...
VM拓展Centos磁盘
VM拓展Centos磁盘背景VM虚拟机在使用一段时间后,磁盘不够,需要拓展root
操作步骤
虚拟机关机
选择拓展磁盘大小
lsblk查看当前的分盘情况
(1)fdisk /dev/sda进入磁盘配置; p (print) 输出当前磁盘分区情况; d(delete) 删除sda3磁盘(空间大小为:4810752-41943039) 。(2)n(new) 新建磁盘; p(primary) 进行新建主分区磁盘;(一块硬盘顶多只能分四块主分区) 3新建磁盘空间名3新建磁盘(空间大小为:4810752-56623103);(3) w (write)保存,保存写入新的配置,磁盘分配配置
reboot重启刷新
拓展磁盘
## 拓展磁盘(Centos)pvcreate /dev/sda3 # 创建pvvgextend centos /dev/sda3 # 扩容vglvextend -l +100%FREE /dev/centos/root # 扩容lvxfs_growfs /dev/centos/root # 更新容量
...
Go-控制协程数量
Go-控制协程数量背景GMP的无限创建Goroutine基于共享用户态资源,过多的协程会导致CPU利用率浮动上涨、内存占用上涨、主进程崩溃
如何控制Goroutine数量基于buffer的channel原理:通过buffer的缓冲区的大小和阻塞等待来控制最大的数量
package mainimport ( "fmt" "runtime" "time")func doGoroutine(i int, ch chan bool) { fmt.Println("go func", i, "goroutine count", runtime.NumGoroutine()) // 结束了一个任务 <-ch}func main() { task_cnt := 10 // 容量控制了 Goroutine 的数量 ch := make(chan bool, 3) // for的数据决定了Goroutine的创建速度 for i := 0; i < task_cn ...
分布式-CAP理论
分布式-CAP理论背景在大规模拓展服务下存在三个特性:
C(Consistency):一致性
A(Availability):可用性
D(Partition Tolerance):分区容错性
一致性一致性: All nodes see the same data at the same time
所有节点数据,在同一时刻,读数据都是最新的
流程:
对主存储写数据
进行上锁,要求对从存储进行同步
同步成功,释放锁,返回成功
可用性可用性:Reads and writes always succeed
服务永远可用,用户感知不到异常
流程:
用户向master请求
master从从存储请求
分区容错性分区容错性:The system continues to operate despite arbitrary message loss or failure of part of the system
在分布式系统中,尽管部分节点出现任何消息丢失或者故障,系统还应继续运⾏
流程:
尽使⽤异步取代同步操作,例如使⽤异步⽅式将数据从主数据库同步到从数据,这样 ...
分布式-Base理论
分布式-Base理论介绍CAP无法同时满足,为了同时实现CAP系统,所以出现了BASE
BA(Basically Available):基本 可用
S(Soft State):软状态
E(Eventually Consistent):最终一致性
ACID和BASE是对冲理论:
ACID追求强一制性
BASE牺牲强一致性,追求高可用性
Basically Available 通过妥协响应时间和功能损失
场景:
断电,增大响应时间
高并发下,电商提示抢购失败
Soft State软状态本质就是系统中的数据有中间状态,多节点的副本数据等待同步数据延迟
Eventually Consistent软状态数据不可以一直持续,必须在一段时间内完成同步,达到最终一致性
分布式 id 生成器(snowflake,雪花算法)
分布式 id 生成器(snowflake,雪花算法)背景在某些场景下,需要生成增长ID并且不能重复
snowflakeSnowflake 雪花算法,由Twitter提出并开源,可在分布式环境下用于生成唯一ID的算法。该算法生成的是一个64位的ID,故在Java下正好可以通过8字节的long类型存放。所生成的ID结构如下所示
1 bit:首位无效因为二进制里第一个 bit 为如果是 1,那么都是负数,但是我们生成的 id 都是正数,所以第一个 bit 统一都是 0。
41 bit:表示的是时间戳,单位是毫秒41 bit 可以表示的数字多达 2^41 - 1,也就是可以标识 2 ^ 41 - 1 个毫秒值,换算成年就是表示 69 年的时间。
10 bit:记录工作机器 id,代表的是这个服务最多可以部署在 2^10 台机器上,也就是 1024 台机器10 bit 里 5 个 bit 代表机房 id,5 个 bit 代表机器 id。意思就是最多代表 2 ^ 5 个机房(32 个机房),每个机房里可以代表 2 ^ 5 个机器(32 台机器),也可以根据自己公司的实际情况确定。
12 bit: ...
ACID理论
ACID理论背景ACID主要是事务中的概念,分别是
A(Atomicit):原子性
C(Consistency):一致性
I(Isolation):隔离性
D(Durability):持久性
A原子性主要是在一个事务中,“要么全部完成、要么全部不完成”
经典的银行转账案例:
A:从A账户去一百
B:从存入100
AB是在一个事务里面,不能只有A|B其中一个成功,不然银行账户对不上金额
C一致性一致性代表:事务开始前和事务结束之后,数据库的一致性没有改变,事务中的数据一致性
I隔离性隔离性代表:多个并发事务同时拥有对数据进行读书和修改的能力,如果⼀个事务要访问的数据正在被另外⼀个事务修改,只要另外⼀个事务未提交,则它所访问的数据就不受未提交事务的影响
D持久性持久性代表:事务处理结束后,对数据的修改是永久的,即便系统故障也不会丢失
优点1、数据一致性:ACID 确保数据在任何事务执行后保持一致和准确。
2、数据完整性:ACID 通过确保对数据库的任何更改都是永久性的,并且不会丢失,从而维护了数据的完整性。
3、并发控制:ACID 通过防止事务之间的干扰来帮助管理并发创建的多个事务。
4 ...
初识RPC
初识RPC介绍RPC 是远程过程调用的简称,是分布式系统中不同节点间流行的通信方式。在互联网时代,RPC 已经和 IPC 一样成为一个不可或缺的基础构件。因此 Go 语言的标准库也提供了一个简单的 RPC 实现,我们将以此为入口学习 RPC 的各种用法。
hello RPC
server端代码
package mainimport ( "log" "net" "net/rpc")type HelloService struct{}func (p *HelloService) Hello(request string, reply *string) error { *reply = "hello:" + request return nil}func main() { rpc.RegisterName("HelloService", new(HelloService)) listener, err := net.Listen(" ...
Gocv安装(Windows)
Gocv安装(Windows)什么是GoCVgocv 是 OpenCV 4.x 计算机视觉库的包装器。 它为最新版本的 OpenCV 提供了 Go 语言接口
官网链接:https://gocv.io/
安装1.安装Go(PASS)2.安装GoCVgo get -u -d gocv.io/x/gocv# 执行完这条命令后,%GOPATH%\pkg\mod下会出现一个文件夹"[http://gocv.io](https://link.zhihu.com/?target=http%3A//gocv.io)"
3.安装MinGW-W64注意安装版本:8.1.0
MinGW-W64版本
添加环境变量到系统环境变量
4.安装Cmake安装链接
5 安装opencv(谨记,要手动添加环境变量,不要忘了!)chdir %GOPATH%\src\gocv.io\x\gocvwin_build_opencv.cmd
主要是win_build_opencv.cmd文件:
可以把文件opencv-4.6.0.zip和opencv_contrib-4.6.0.zip先放到C:\o ...
K8s-文件管理系统nfs(centos)
K8s-文件管理系统nfs(centos)什么是nfsNFS在文件传送或信息传输过程中依赖于RPC协议,RPC协议可以在不同的系统之间使用。使用NFS用户端时只需要把远程文件系统挂载到自己的文件系统下即可访问,NFS有客户端和服务端
Deploynfs部署
centos部署nfs
yum install -y nfs-utils rpcbind
执行命令 vim /etc/exports,创建 exports 文件,文件内容如下
/data/nfs_root/ *(insecure,rw,sync,no_root_squash)
启动nfs
mkdir -p /data/nfs_rootsystemctl enable rpcbindsystemctl enable nfs-serversystemctl start rpcbindsystemctl start nfs-serverexportfs -r
nfs-provisoner部署# 获取helm chartshelm repo add nfs-subdir-external-provisioner https://ku ...