Groot 博客

一些博客记录,笔记,思路记录

事先声明:所有参考内容,会在结尾留下。

为什么会对Golang 中 net 包进行分析,最近看完书中netpoll的讲解,之前也阅读过,但始终对于net包 和netpoll两者关系没有理清。然后又看到了字节跳动在自己开源的netpoll对于Go net包的评价。两者结合,对于net包的性能为何快,那么netpoll又扮演什么功能。

本文仅对net包中rpc服务和客户端的创建流程,对于其中netpoll是何时被调用,之间的联系。

todo:文章某些内容细节没有分析到位,后续补充。

go version: 1.19.13

阅读全文 »

本人浅浅分析一下,如有不对,欢迎讨论。

本次代码用例环境:

go version: 1.19.13

​ 在进行分析init 函数过程之前,先提出几个问题来思考,这样可能更方便我们来进行理解。带着问题来思考,对整体的执行过程会更加清晰。

  1. init 函数是什么
  2. init 函数如何执行的
  3. 多个包中 init函数的执行顺序如何确定的
  4. 如果多个包中,执行init 函数,又存在修改时,如何保证不会修改
  5. 使用 init 函数初始化数据时,需要注意哪些问题
阅读全文 »

微服务

微服务基本策略

降级 (Fallback)

原理

降级是在服务出现异常或资源紧张时,主动关闭或简化某些功能,以保证系统的核心功能依然可用。通过预先定义的降级规则,当触发条件满足时,会调用备用逻辑或返回预设的响应。

使用方法

  • 在 go-chassis 中,可以通过配置文件定义降级规则,例如配置当服务响应时间超过某个阈值时触发降级。
  • 开发者需要为可能需要降级的服务编写备用处理逻辑。
  • 在服务启动时,go-chassis 会根据配置的规则对服务进行降级处理。
阅读全文 »

Elasticsearch-基础

Elasticsearch

Luncne

核心模块

analysis 模块

index 模块

store 模块

queryParser 模块

search 模块

similarity 模块

核心术语

Term:索引最小的存储单元和查询单元

词典(字典):Term 集合

倒排表:多个词组成

正向信息:原始文档信息

段:索引中最小的独立存储单元。生成,只能读,不能写。

段合并

Redis 缓存问题

缓存穿透

问题描述

缓存穿透指:

当请求传递到后端服务器时,会先查询Redis 缓存中是否存在该 key 值,不存在,则会请求db 去查询。

当发生程序被攻击时,出现大量空值的key 会去请求,以拖垮服务器查询,导致程序崩溃。

阅读全文 »

数据结构

数组

数组:相同元素,内存地址连续,利用索引可以快速访问到元素,容量确定(不可以扩容)的一种数据结构

初始化方式

1
2
arr1 := [3]int{1, 2, 3}   // 确定容量大小
arr2 := [...]int{1, 2, 3} // 编译器会转换成上面这一种,推导确定容量

访问和赋值

利用下标进行索引查询每个元素,对应元素可以进行赋值操作,但不能超出数组长度的索引查询请求。

1
2
3
4
5
6
arr1 := [3]int{1, 2, 3}
for i := range arr1 {
arr1[i] = 3 // 将对应索引的元素值,赋值 = 3
}
fmt.Println(arr1)
fmt.Println(arr1[3]) // 报错,因为索引的下标是从 0 开始
阅读全文 »

哈希

解决哈希冲突

开放定址法

  • 线性探测法:当冲突发生时,按照某种线性序列在散列表中查找下一个空的位置来插入数据。
  • 二次探测法:使用二次函数来计算下一个插入位置。
  • 随机探测法:使用随机生成的序列来查找下一个空的位置。

再哈希法

  • 当冲突发生时,使用另一个哈希函数计算另一个哈希值,直到找到未被占用的位置。

链地址法

  • 将哈希值相同的元素存储在同一个链表中,需要遍历链表以进行查找。

建立公共溢出区

  • 将哈希表分为基本表和溢出表,当冲突发生时,将冲突的元素存放在溢出表中。

重新哈希法

  • 当冲突较多时,创建一个新的更大的哈希表,并使用一个新的哈希函数将所有元素映射到新表中。

基数哈希法

  • 使用多个哈希函数将关键字映射到多个位置,这可以提高哈希表的存储能力。

可扩展哈希法

  • 允许哈希表动态增长,当冲突较多时,可以增加桶的数量来减少冲突。

哈希函数的计算

TCP协议

TCP流程

建立连接(三次握手)

  1. 双方初始阶段都是从 close 状态开始,
  2. 服务端从close 状态,监听某个端口,然后进行 listen 状态。
  3. 客户端主动发起连接,发送 SYN,变成 SYN-SENT 状态。
  4. 服务端收到,将连接插入到半连接队列,返回 SYN 和 ACK(客户端得 SYN),自己变成 SYN-REVD
  5. 客户端发送 ACK 给 服务端, 变更为 ESTABLISHED 状态。
  6. 服务端收到,将连接从半连接队列取出,移入全连接队列,变更为 ESTABLISHED 状态。
  7. 进程调用 accept 函数,从全连接队列中取出已完成得连接建立得 socket 连接。

断开连接(四次挥手)

  1. 客户端向服务器发送 FIN 报文,从 ESTABLEISHED 状态 切换至 FIN-WAIT-1,此时客户端变成了 half-close(半关闭) 状态,无法发送报文,只能接受;
  2. 服务收到客户端确认,发送ACK,变成 CLOSED-WAIT 状态。
  3. 客户端收到ACK,变成 FIN-WAIT2 状态。
  4. 服务端再向 客户端发送 FIN, 进入 LAST-ACK 状态。
  5. 客户端收到 FIN 后,进入 TIME—WAIT 状态,发送ACK 给服务端。
  6. 服务端收到关闭,客户端进入等待, 最长 2MSL 后或者没有服务端重发请求后,客户端关闭,否则要重新 发送 ACK

画图 ———————————————–

阅读全文 »

数据结构

排序

​ 稳定性:任意相等的两个数据,排序前后的相对位置不会改变

简单排序

冒泡排序

​ 最好情况:顺序T=O(N)

​ 最坏情况:逆序T=O(N^2)

稳定的排序算法

插入排序

​ 最好情况:顺序T=O(N)

​ 最坏情况:逆序T=O(N^2)

稳定的排序算法

时间复杂度下界

对于下标i<j,

网络编程

BS架构

浏览器

​ browser —> server

CS架构

客户端

​ client —-> server

TCP(Transmission Control Protocol)

可靠的、面向连接的协议(eg:打电话)、传输效率低全双工通信(发送缓存&接收缓存)、面向字节流。使用TCP的应用:Web浏览器;电子邮件、文件传输程序。

UDP(User Datagram Protocol)

不可靠的、无连接的服务,传输效率高(发送前时延小),一对一、一对多、多对一、多对多、面向报文,尽最大努力服务,无拥塞控制。使用UDP的应用:域名系统 (DNS);视频流;IP语音(VoIP)。

阅读全文 »
0%