从compare_4.go初识go的typecheck
主要是上一次的题目的第四道 上次compare梳理了 go build在compile之前的准备工作,比如收集import依赖关系 针对compare_4.go进行编译,看一下一点compile的过程,参数build -x -o ./compare_4 compare_4.go package main import "fmt" func main() { a := []byte("helloworld" »
主要是上一次的题目的第四道 上次compare梳理了 go build在compile之前的准备工作,比如收集import依赖关系 针对compare_4.go进行编译,看一下一点compile的过程,参数build -x -o ./compare_4 compare_4.go package main import "fmt" func main() { a := []byte("helloworld" »
主备同步 代码提交记录 完成度 只完成了主从复制;但是主备切换、依据处理能力动态调整消费能力、一些write失败逻辑处理 没有完成 基本逻辑 数据 主要分成了三部分数据的复制 发送SLAVE_SYNC_INFO命令,返回所有的topic和其对应的channel 发送SLAVE topic_name命令,携带当前topic的关键4个参数fileindex filenum totalMsgCnt viroffset和一个maxnum希望本次同步返回的消息数量,返回 master的关键参数和消息本身 发送SLAVE topic_ »
核心代码逻辑 commit 修改dtpre队列 在考虑落盘之前,先思考另一个问题,由于dtpre本身跟消费者无关,只跟生产者有关,其实并不需要等到消息从topic分发到各个channel里之后再进行commit(cacel),浪费存储空间(如果落盘就浪费了磁盘空间) 所以我们将dtpre的部分移至topic中存储 落盘逻辑 对于落盘逻辑来说,不只是dtpre的逻辑需要修改,如此对于一般的消息来说,都应该进行落盘 而channel来说只需要落盘数据索引即可 修改细节 实际这次提交修改了比较多的内容,最核心的还是移除了memoryMsgChan(无论是 topic 还是 channel),添加了backendMsgChan. »
产生的困惑 mq落盘的时候,rocketmq采用mmap,但是多处mmap同一个文件,会不会导致映射多次到物理内存上? 页是内存管理的最小单位(通常是4k) 查看程序虚拟地址 利用 man proc 可以看到命令介绍,/proc/[pid]/maps里面关于一些参数解释 /proc/[pid]/maps A file containing the currently mapped memory regions »
源码 今天调试了一下golang编译工具,发现了一个很有"奇怪"的地方 简化问题 假设有1000个任务,1000个并发协程,设置n(cpu核数)个物理处理器(task)并发完成,每个协程只要完成了当前任务采取完成下一个 代码 原始代码,go作者无所畏惧的使用协程 func parseFiles(filenames []string) uint { var noders []*noder // Limit »
单例 package main import ( "fmt" "math/rand" "sync" "time" ) type A struct { Item int } var a *A var l sync.RWMutex func GetGlobalA() *A { if a »
分布式Id snowflake 是一种分布式id唯一算法,相比较uuid算法生成方式,snowflake生成的是一个int64大整型,并且是大致递增 我发现网上对于该算法的描述,在位数偏移上是由差异的,但是整体思路是一致的 这里的10-bit workerId在有的源码里面是分成两个 workerId 、data的5-bit大小 可以大致算一下,1毫秒1单点能生成2 ^ 12 = 4096个id,总共能部署 2 ^ 10 = 1024 个节点,也就是1毫秒最大能生成400多万个id 我按照算法思路写了如下代码 package main »
dlv 针对go语言的调试器,内部架构介绍 --headless package main import ( "fmt" ) func main() { m := 120 fmt.Printf("Hello world\n") fmt.Printf("m = %d\n", m) } 终端1 dlv debug »