跬步 On Coding

在Django中使用zerorpc

前言

随着系统架构从集中式单点服务器到分布式微服务方向的迁移,RPC是一个不可回避的话题.如何在系统中引入对开发者友好,性能可靠的RPC服务是一个值得深思的问题.

在调研了Thrift,gRPC,zerorpc等方案后,基于以下2点最后选择了zerorpc:

  • Thrift,gRPC学习成本高,开发者需要重新定义返回结构增加了工作量
  • zerorpc完美契合Python,能快速开发,并且支持Node.js,适用于当前技术栈

问题

虽然zerorpc可以直接嵌入当前系统框架中,但是还是有一些问题需要去考虑解决

  • rpc 接口如何定义

  • rpc 服务如何启动

  • 高并发情况下客户端的可靠性

用Python解决数据结构与算法问题

用Python解决数据结构与算法问题

发现一本Python的好书被翻译了,利用下班时间学习了一下,把相关代码都实现了一遍,包括:

  • 栈,队列,双端队列
  • 无序链表,有序链表
  • 二叉树,堆,二叉搜索树,AVL树

以及一些算法

如何成为一名优秀的程序员

前言

罗子雄:如何成为一名优秀设计师

董明伟:Python 工程师的入门和进阶

董明伟基于自己实践讲的知乎live为Python新人提供了很多实用建议,他推荐的罗子雄:如何成为一名优秀设计师的演讲讲的非常好,总结了设计师从入门到提高的优秀实践。
罗子雄的演讲我看了三遍,再结合自己的程序员生涯,我想我也可以为Python新人提供一些建议,开了如何成为一名优秀的程序员一题,讲讲我的Python工程师之路。

Django db使用MySQL连接池

Django db模块本身不支持MySQL连接池,只有一个配置CONN_MAX_AGE连接最大存活时间,如果WSGI服务器使用了线程池技术,会达到连接复用的效果。但是如果WSGI服务如果是每个请求都创建新的线程,那么这个配置没有任何效果,因为连接保存在Thread.local()名称空间中,在不同的线程中不能复用。

在上一篇greentor MySQL连接池实现中已经实现了MySQL连接池,只需要重写Django MySQL backend以支持连接池,就能达到连接复用的目的,减少socket 3次握手的开销,提高性能。

https://github.com/zhu327/greentor/blob/master/demo/core/base.py

greentor MySQL连接池实现

https://en.wikipedia.org/wiki/Connection_pool

通过greentor实现了pymysql在Tornado上异步调用的过程后发现,每次建立数据库连接都会经过socket 3次握手,而每一次socket读写都会伴随着greenlet的切换,以及ioloop的callback过程,虽然是异步了,但是IO性能并没有提升,所以在研究了TorMySQL连接池的实现后,实现了greentor自己的连接池。

https://github.com/zhu327/greentor/blob/master/greentor/green.py