互联网后端架构的演化 发表于 Jan 12 2019 | 分类于 技术 任何复杂技术的架构几乎都是随着需求的变化以及业务的增长逐渐演化出来的,并不是一开始就是复杂的庞然大物,互联网后端的技术架构几乎莫不是如此。 数据库篇 以 MySQL 为例说明支持事务的持久化数据库的架构演变。 单实例 single-instance在数据量很小,业务规模也很小的时候一般使用一台数 ... 阅读全文 »
SQLAlchemy 的连接池机制 发表于 Jan 2 2019 | 分类于 SQLAlchemy SQLAlchemy 自身提供了连接池来管理所有和 database 的连接,pacakge 是 sqlalchemy.pool ,简单来说 connection pool 就是一种复用连接的机制,工作流程如下: 从 pool 中获取新的连接,如果没有就创建一个新的连接并返回,在调用连接的 clo ... 阅读全文 »
MySQL 优化 02 之连接管理 发表于 Dec 29 2018 | 分类于 mysql 问题描述最近一直在服务端的性能优化,逐个解决线上之前遗留的一些问题,其中有一个问题是后端 rpc service MySQL 连接中出现大量 sleep 的连接,而且时间很长。我们技术栈用的是 Python,用 sqlalchemy 做 ORM 层,在 sqlalchemy 连接池中已经配置了对超过 ... 阅读全文 »
Ember 最佳实践 发表于 Dec 26 2018 | 分类于 JavaScript 用 Go 写的发布系统前端用的是 ember 做的,之所以用 ember 是因为三年前用 ember 实现了一套做 CMS 的框架,ember-semantci-ui 和 ember-easy-orm,两个东东几乎涵盖了做 CMS 需要的方方面面:数据加载层、loading和消息管理、各种 ui、f ... 阅读全文 »
Go 项目最佳实践 发表于 Dec 26 2018 | 分类于 golang 最近 2 个月断断续续用 Go 实现了一个发布系统,主要特性包括: 主机管理 应用管理 服务的部署和发布 这是第一次使用 Go 实现复杂系统,记录一下最佳实践。 库和框架使用更接近 Go 风格的简单 web frameworkweb 框架用的是 gorilla 的一套: github.com/ ... 阅读全文 »
后端性能优化 01 发表于 Dec 20 2018 | 分类于 技术 最近业务推送越来越频繁,导致瞬时压力非常大,虽然以前的代码确实很多地方像一坨 shit,实在无法下手从代码重构业务优化了,但是还是从其他方面做了一些调整来把性能提升了。 第一,升级了一下 MongoDB 从 2.4 到 3.2,换成了 wt 引擎以及 ssd 盘 线上 MongoDB 集群由于云厂商 ... 阅读全文 »
可容错的 server proxy 实现 发表于 Nov 16 2018 | 分类于 技术 最近需要对手头的一个 rpc proxy 进行升级改造,升级之后要能做到: 自动上线下线故障节点 支持动态扩容和缩容 支持对后端的 server 进行权重分流和负载均衡 这些目标要实现的功能和 MongoDB driver client 的功能很相似,MongoDB 本身就是分布式的系统,支持 ... 阅读全文 »
MySQL 优化 01 之慢查询 发表于 Nov 13 2018 | 分类于 mysql 最近线上生产环境中有些 MySQL 的语句特别慢,跑一个查询需要大概 5 分钟,已经到了不得不解决的地步了。 案例一:单表复杂语句的聚合计算问题描述单表数据超过 1500 万,写入不是特别频繁,查询很多,需要对表中订单的费用的进行实时计算,主要是基于时间以及订单状态进行运算。 123SELECT c ... 阅读全文 »
并发 Go 程序中的共享变量 (四):内存同步 发表于 Oct 11 2018 | 分类于 Go 读书笔记 本系列是阅读 “The Go Programming Language” 理解和记录。 在上一小节中 并发 Go 程序中的共享变量 (三):读写锁,我们在实现 Balance 方法也需要一个排他锁,不论这个排他锁是通过 channel 实现还是互斥锁实现都是可以的,在我们的例子中是通过读写锁实现 ... 阅读全文 »
并发 Go 程序中的共享变量 (三):读写锁 发表于 Sep 11 2018 | 分类于 Go 读书笔记 本系列是阅读 “The Go Programming Language” 理解和记录。 在上篇中 并发 Go 程序中的共享变量 (二):锁 我们的获取 balance 的方法也用了锁: 12345func Balance() int { mu.Lock() defer mu ... 阅读全文 »