惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Securelist
AI
AI
S
Schneier on Security
T
The Exploit Database - CXSecurity.com
C
CERT Recently Published Vulnerability Notes
C
Cybersecurity and Infrastructure Security Agency CISA
T
Threat Research - Cisco Blogs
T
Tenable Blog
G
GRAHAM CLULEY
腾讯CDC
L
Lohrmann on Cybersecurity
Martin Fowler
Martin Fowler
博客园 - 【当耐特】
The Cloudflare Blog
P
Proofpoint News Feed
V
Visual Studio Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
AWS News Blog
AWS News Blog
D
Docker
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Latest news
Latest news
L
LINUX DO - 热门话题
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
L
LangChain Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
C
CXSECURITY Database RSS Feed - CXSecurity.com
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
W
WeLiveSecurity
Blog — PlanetScale
Blog — PlanetScale
云风的 BLOG
云风的 BLOG
P
Privacy International News Feed
Cloudbric
Cloudbric
Attack and Defense Labs
Attack and Defense Labs
量子位
爱范儿
爱范儿
F
Fortinet All Blogs
博客园 - 三生石上(FineUI控件)
V
Vulnerabilities – Threatpost
Schneier on Security
Schneier on Security
J
Java Code Geeks
S
Security @ Cisco Blogs
N
News and Events Feed by Topic
N
Netflix TechBlog - Medium
博客园 - 司徒正美
I
InfoQ
WordPress大学
WordPress大学
GbyAI
GbyAI
Google DeepMind News
Google DeepMind News

Jiajun的技术笔记

你好,2026! TiDB 源码阅读(六):TiDB Coprocessor 源码解析 性能优化的核心思想 TiDB 源码阅读(五):索引 TiDB 源码阅读(四):AST、逻辑计划、物理计划 CockroachDB Serverless Architecture podman 无故退出 Cursor Control-L (CTRL-L) Keyboard Shortcuts in Terminal Replace docker with podman Using xmonad with xfce4 A RC script for freebsd frpc 自己动手写一个k8s controller AI 会取代你的(编程)岗位吗? 自建DERP服务器提升Tailscale连接速度(使用Nginx转发) 自动升级Docker容器 再读《程序员修炼之道-从小工到专家》 让浏览器下载文件 再读《软件随想录》/《黑客与画家》/《软技能》 HTTP 压力测试中的 Coordinated Omission 2的补码 编程语言中的 context 是什么? flutter macOS 构建出错 Flatpak 使用小记 Golang CAS 操作是怎么实现的 PostgreSQL 当MQ来使用 Clash 结合 工作VPN 的网络设计 使用 PostgreSQL 搭建 JuiceFS PostgreSQL 配置优化和日志分析 有GitHub Copilot?那就可以搭建你的ChatGPT4服务 窗口函数的使用(以PG为例) 读《为什么学生不喜欢上学》 OpenAI Prompt Engineering 摘录和总结 读《打造真正的新产品》 VueJS 总结 Linux 自动挂载 alist 提供的webdav FreeBSD 使用 vm-bhyve 安装Debian虚拟机 FreeBSD 和 Linux 网卡聚合实现提速 GPT 帮我搞定了时区转换问题 长任务系统如何处理? macOS/Linux 编译 InputLeap 使用开源软KVM - synergy-core 解决 macOS 终端hostname一直变化问题 KVM 共享 Intel 集成显卡 PromQL 备忘 读《格鲁夫给经理人的第一课》 读《打开心智》 为什么要把复杂的联表操作拆成多个单表查询? 红包系统的设计 MySQL Index Condition Pushdown Optimization Go mod 简明教程 OpenWRT 使用 Android/iOS USB 网络 搭建旁路由 Golang gRPC 错误处理 编写可维护的单元测试代码 OAuth 2 详解(六):Authorization Code Flow with PKCE OAuth 2 详解(五):Device Authorization Flow OAuth 2 详解(三):Resource Owner Password Credentials Grant OAuth 2 详解(四):Client Credentials Flow OAuth 2 详解(二):Implict Grant Flow OAuth 2 详解(一):简介及 Authorization Code 模式 ElasticSearch 学习笔记 三种git流程以及发版模型 错误处理实践 权限模型(RBAC/ABAC) OIDC(OpenID Connect) 简介 任务队列简介 PostgreSQL 操作笔记 使用Drone CI构建CI/CD系统 Golang migrate 做数据库变更管理 使用PostgreSQL做搜索引擎 Nginx 源码阅读(三): 连接池、内存池 Nginx 源码阅读(二): 请求处理 Nginx 源码阅读(一): 启动流程 Go 泛型简明教程 KVM 显卡穿透给 Windows 使用 HTTP Router 处理 Telegram Bot 按钮回调 使用反射(reflect)对结构体赋值 GIN 是如何绑定参数的 你好 2022(2021 年终总结) 用Go导入大型CSV到PostgreSQL 使用 OpenWRT 搭建软路由 使用软KVM切换器 barrier 共享键鼠 SQL 防注入及原理 使用 gomock 测试 Go 代码 gevent不是黑魔法(二): gevent 实现 gevent不是黑魔法(一): greenlet 实现 用 entgo 替代 gorm 应用内使用crontab不是那么方便 单测时要不要 mock 数据库? Sentry 自建指南 用selenium完成自动化任务 用闲置的安卓手机做垃圾电话短信过滤 推荐三个时间管理工具 一次事故反思 当JS遇到uint64:JS整数溢出问题 SQLite3 存储以及ACID原理 Redis源码阅读:pub/sub实现 Redis源码阅读:zset实现 Redis源码阅读:bitmap 位图的运算 Redis源码阅读:set是怎么做交并集运算的?
我的技术栈选型
Jiajun Huang · 2019-11-13 · via Jiajun的技术笔记

我的技术栈选型

工作已经几年了,逐步摸索到了自己的技术上限 — 还是计算机五大件。不断的追新和扩展广度已经没有太大意义,它们的实现原理也 都了解的差不多,因此现在是时候开始收缩技术栈,缩小需要不断更新的知识范围,节省精力去做更有意义的事情,把常用技术栈固定 下来,并且保持小量更新的状态。

注:我的技术选型风格偏向于UNIX的KISS风,喜欢小而美的东西 :-)

编程语言

编程语言Python和Golang:

  • Python主要写Web服务、小工具、脚本等等。Python的优点是写起来非常快,比如我写了一个删除过量的MySQL备份数据的脚本,核心代码 6行就搞定了。如果是Go来写的话,估计要2-3倍,其它语言就更多了。Python的缺点就是速度慢些,但是我写了一个QPS数百的应用,跑在 生产服务器上,响应速度也在20ms左右,所以对于绝大多数网站来说,完全够用。如果一定要挑一个Python的缺点的话,那就是部署没有Go方便。

其实绝大部分web应用,瓶颈都不是编程语言。Python Flask框架平均响应时间15-20ms左右,相比公网传输速度来说,完全可以接受。 当然了,Go固然更快,一般1ms以内,内存占用也小很多。

def find_outdated():
    for i in glob.glob("/data/backup/mysql/*.sql.gz"):
        year, month, day = i.split(".")[0].split("-")[-3:]
        t = datetime.datetime(year=int(year), month=int(month), day=int(day))
        if t < datetime.datetime.now() - datetime.timedelta(days=7):
            os.remove(i)
  • Go主要写系统工具和需要高并发的软件。比如如果我要自己实现一个网关,那么我就会考虑使用Golang;另外,处理二进制协议的时候 Golang也方便点。还有就是如果瓶颈在内存使用上,我也会考虑用Go而不是Python。

Rust我也考虑过要不要学,但是最终我发现我的需求用不上Rust,不需要那么高的速度,主要就是写web,此外写点小工具。Rust还是太啰嗦了。 C++ 和Java以前也考虑过,一个太复杂,一个太啰嗦,略。有Python和Golang,快速和高性能都够了,还不够的话,那说明真的该加机器了。

数据库

数据库使用MySQL,MySQL应当玩的很很熟悉才行。原因是MySQL比PG简单得多(配置管理),而且在主从上有更好地支持。此前我也有使用SQLite, 但是说实话,脑子里同时维护更新多个数据库的知识,太费力,大部分都是相通的,但是细节处又不相同,每次还要查文档,太麻烦了,所以 还是用最熟悉的那个。

此外MySQL最强大的优点就是社区,碰到什么问题,基本都能够搜到。

备份工具

MySQL使用mysqldump和crontab,如下:

@daily /usr/bin/mysqldump --single-transaction --quick --lock-tables=false --all-databases | gzip -c > /data/backup/mysql/full-backup-$(date  + \%F).sql.gz

然后再使用rsync进行异地同步。

缓存、队列

缓存和队列统一使用Redis。用不上RabbitMQ这类重量级的消息队列。Redis一箭双雕,而且好用。

Web服务器

Web服务器使用Nginx,Nginx还可以作为端口转发工具(使用Nginx的stream模块)。

端口转发也可以使用frp。

部署

部署统一使用supervisor。之前我也有使用Docker,但是越发觉得,我一个人维护的系统,不必用Docker,因为系统依赖等全都是我可以 控制的。Go基本无依赖,Python可以使用virtualenv或者venv解决依赖问题。

什么?k8s?个人,甚至是小团队根本没有必要上这个玩意儿。不过如果是团队,倒是可以上上Docker。

自动化部署使用ansible,我自己的系统就懒得搭CI/CD了,每次要部署的时候直接跑ansible-playbook即可。

Web框架

Python使用Flask,Go使用GIN。Python需要搭配gunicorn + gevent使用。

ORM和数据库migration

Python使用SQLAlchemy + alembic,Go暂时没找到顺手的。

异步任务框架

Python使用python-rq作为异步任务队列,Golang暂时没有找到好的。

为啥不用celery?celery太大了,而且遇到过多次worker无故死掉的情况,包括很多网友也遇到过,但是一直没找到原因,后来换了rq 之后发现rq简单好用,就切换了。

监控

监控使用Prometheus + Grafana + AlertManager + Exporter全家桶。

日志收集

我自己的服务现在不进行日志收集,之前用过EFK/ELK,但是太占内存,而我的场景直接去服务器上tail + grep就够了,用EFK完全是杀鸡用牛刀。 看了一下Grafana设计的loki,设计挺不错,但是现在还不够成熟。

搜索引擎

目前暂时使用MySQL来做,以后如果有需要,再学习ElasticSearch,之前用过ES,但是频率太低,学了又忘记了,MySQL足矣。

错误追踪

错误追踪使用Sentry,直接用 官网 就够了。

总结

以上就是我这几年接触过然后筛选下来的技术栈,有一些可能漏掉了,有一些被我放弃的原因也没写上,欢迎一起交流 :-)