DongYuanxin's Blog

二维码生成设计方案

前端动态生成 利用qrcode.js就可以在前端动态生成二维码。 好处:所有二维码动态生成,不用存储静态文件。 不足: 在不对链接做处理的情况下,如果链接很长,二维码信息多,会造成生成的二维码图片“密密麻麻”,在远距离/弱光环境下无法扫 因为不是二维码图片,所以只能截图分享,操作成本高 前端动态生成 + 短链接服务 利用短链接服务,可以将长链接转换为短链接,再生成二维...

Node.js操作tmpfs内存文件系统

什么是 tmpfs? tmpfs 是 Linux 提供的虚拟内存文件系统,可以用于高性能 I/O。 注意:它不是永久的,只是暂时存放。重启 os,tmpfs 中的文件会消失(和内存类似)。 在 linux 下,它默认最大为内存的一半大小,使用df -h命令可以看到,且大小不是固定的,。它并不会真正的占用这块内存,如果/dev/shm/下没有任何文件,它占用的内存实际上就是 0 字节;如...

Node.js CPU核心绑定

背景 Linux 有一套 CPU 调度策略。多个进程同时处于内存,当一个进程 wait,os 会拿走 cpu 使用权先给其它进程使用。 对于多核系统,不做特殊设置,程序进程是不会和某个 cpu 关联,而是服从 os 调配。这就造成了一个问题,来回切换 cpu,会产生大量上下文切换,影响性能。 taskset 命令 通过 taskset 可以将进程绑定到特定的 cpu 上运行,从而避免...

Node.js下Keep-Alive的ECONNRESET 问题

ECONNRESET 问题 出现原因 一段长连接,静默一段时间后,服务端没收到数据想主动关闭了 socket。 此时,客户端不知道服务端要关闭 socket,就发送了一个新的 http 请求。 当客户端发完 http 请求,到抵达服务端之间的这段时间,服务端刚好关闭了 socket(客户端才能收到 socket 连接关闭的事件,并触发相关回调逻辑)。 所以当请求抵达服务端,因为服务...

分布式日志设计

国庆前后腾讯云·云开发开发了分布式全链路日志。相较于单体服务日志,分布式全链路日志的设计更有意思,包括日志生成逻辑、上报逻辑以及前端的显示逻辑。 全链路日志的作用 用户从发起请求,到收到请求之间,请求会经过很多服务。 例如对于云开发来说,用户通过 js-sdk 调用云数据库,写入数据。链路是:js-sdk => LB(负载均衡)=> gateway(云开发中间层) =>...

IO/CPU密集型优化思路—池化技术

场景1:数据库连接池(IO密集型) 如果每次数据库请求都请求都开启一个连接,然后用完销毁,性能会有问题。 分析程序的日志之后,你发现系统慢的原因出现在和数据库的交互上。因为你们数据库的调用方式是先获取数据库的连接,然后依靠这条连接从数据库中查询数据,最后关闭连接释放数据库资源。 我们统计了一段时间的 SQL 执行时间,发现 SQL 的平均执行时间大概是 1ms,也就是说相比于 SQL ...

限流算法-漏桶和令牌桶

漏桶算法 算法介绍 漏桶算法能够实现平滑流量,防止过大流量打到后端服务,导致崩溃。 对于不确定的流入速度,经过漏桶的处理,流出的速度是稳定。 变量描述 C:桶的总容量 r:水漏走的速度 a:上个请求 at:上个请求进来的时间 w:处理完上个请求后,桶里的总量 b:新请求 bt:新请求进来的时间 算法实现 let R = 10; // 每ms允许10个流量,QPS是1...

多级缓存设计—常见策略和实践模式

本地缓存 方法1: 堆上缓存 在进程中,使用堆内/堆外缓存。 优点: 实现简单 读取速度高 缺点: 进程挂掉,缓存丢失 进程重启,大流量可能冲垮应用 堆上缓存可能造成语言 GC 效率降低 无法持久化,无法分布式共享 方法2: local redis cache 使用本地 redis 代替堆上缓存。本地代表着没有网络 IO 消耗,读取速度高。并且...