Levon's Blog

微信: L6241425

公司团队是使用gitlab来管理源代码的,一直以来当提交了一个MR后,需要手动在内部IM群里贴出PR链接和摘要,然后@目标同事来帮忙review代码,其实大部分流程是可以自动化的。

阅读全文 »

1. 内存泄露

  1. 假设 a 是一个大slice,而 b 只引用了一小部分,这就造成了底层数组其他未被引用的部分内存泄漏。

    1
    2
    3
    4
    5
    func sliceLeak() {
    data := make([]byte, 1000000)
    slice := data[:10] // 这个切片依然引用整个数组
    _ = slice
    }
  2. 因为协程被永久阻塞而造成的永久性内存泄露。

  3. 未正确释放文件、数据库连接等资源,导致内存无法释放。

  4. 延迟调用函数导致的临时性内存泄露。

  5. 全局变量或长生命周期的对象持有大量数据,无法被垃圾回收。

  6. 在一些复杂的数据结构中,可能会出现循环引用,导致垃圾回收器无法回收。

  7. 使用time.Timer或time.Ticker时,未及时调用Stop方法。

阅读全文 »

1. 注册机器人

直接在Tg中与@BotFather对话即可创建bot,比较有趣的是在Tg很多的交互式体验都是通过类似对话的方式。

将下面的链接的{TOKEN}替换成所获取的token然后浏览器访问

1
https://api.telegram.org/bot{TOKEN}/getUpdates
阅读全文 »

1. Snowflake(雪花算法)

img
1
2
3
| 1 bit (符号位) | 41 bits (时间戳) | 10 bits (机器 ID) | 12 bits (序列号) |
+----------------+------------------+------------------+------------------+
| 0 | 毫秒级时间戳 | 数据中心 + 机器 | 毫秒内自增序列 |
阅读全文 »

使用 Rclone 可以轻松实现备份同步文件到各大网盘,简化了备份方案,也可以用来迁移 2 个不同的网盘程序文件,甚至可以直接挂载网盘到本地用来扩充磁盘食用。

阅读全文 »

0. 前言

OpenVPN 是一个健壮的、高度灵活的 VPN 守护进程。它支持 SSL/TLS 安全、Ethernet bridging、经由代理TCPUDP 隧道NAT。另外,它也支持动态 IP 地址以及 DHCP,可伸缩性足以支持数百或数千用户的使用场景,同时可移植至大多数主流操作系统平台上。

安装openvpn
1
sudo apt install openvpn
阅读全文 »

Mermaid 是一种基于 Javascript 的绘图工具,使用类似于 Markdown 的语法,使用户可以方便快捷地通过代码创建图表。Typora 支持渲染 Mermaid。

阅读全文 »

理解分布式之前,需要理解一个问题就是”事务”。

1. 本地事务

事务提供一种“ 要么什么都不做,要么做全套(All or Nothing)”机制。

img
阅读全文 »

Apache Kafka 是一个开源的分布式事件流平台 (Distributed Event Streaming Platform)。

忘掉 “ 消息队列 “ 这个狭隘的标签。虽然它能当消息队列用,但这好比说一台 MacBook Pro 只是个打字机。它的核心是一个分布式的、分区的、可复制的、持久化的提交日志 (Commit Log)。数据被 “ 追加 “ 到日志末尾,并且可以被多个消费者在任意时间点、以任意速度重复读取。

一句话类比: Kafka 就像一个拥有无数个频道的、永不停止的数字电视台。

  • 电视台 (Kafka Cluster): 整个服务系统。
  • 频道 (Topic): 数据的分类,比如 “ 订单频道 “、” 用户行为频道 “。
  • 节目 (Message/Event): 一条条的数据,比如 “ 用户 A 下单 “、” 用户 B 点击了按钮 “。
  • 节目制作方 (Producer): 负责制作节目并发送到指定频道。
  • 电视观众 (Consumer): 订阅自己感兴趣的频道。
  • 电视节目录像机 (Log & Offset): 电视台会把所有节目按顺序录下来(持久化日志)。每个观众都有自己的进度条(Offset),可以从任何时间点开始看、快进、甚至倒带重看(数据回溯),且每个观众的观看进度互不影响。
阅读全文 »

1. 自旋锁(spin lock)

1.1 背景

同一时刻只能有一个线程获取到锁。那么就面临一个问题,那么没有获取到锁的线程应该怎么办?通常有两种处理方式:

一种是没有获取到锁的线程就一直循环等待判断该资源是否已经释放锁,这种锁叫做自旋锁。

还有一种处理方式就是把自己阻塞起来,等待重新调度请求,这种叫做互斥锁。

阅读全文 »
0%