狠狠撸

狠狠撸Share a Scribd company logo
美团云与Python:
使?用简单语?言构建复杂系统
美团??网 云计算研发?工程师

陈博

2015-09-19
介绍
? 美团有众多使?用Python的产物和项??目?
今年第?一次来PyCon交流?
最有代表性的	

? 美团云:https://mos.meituan.com	

? 项??目历史:3年?
运维团队孵化 -> 公司内部私有云 -> 公有云产物上线运营
? 本次演讲内容?
不讲云计算,只讲语?言和框架;?
介绍为主,配?一两个代码分析;?
喜闻乐见的Pythonic话题
介绍
? 为什么?用Python??
OpenStack、团队成员、DevOps	

? ?自研vs开源项??目	

? 代码规模?
自研:50W Python?
?大量:C / shell?
维护:OpenStack 15W Python	

? 功能模块划分?
region controller / host / keystone / glance / swift / api / notify /
meter / monitor / vpc / billing / container / baremetal / ssh_relay /
vnc / elastic IP / relational database service / cache service / block
storage / load balancer / big data service / web frontend …
? Python发挥“胶?水语?言”的特点,将不同架构、不同语?言的模
块整合到?一起
功能模块
Network	

IP/MAC地址	

DNS, 路由与NAT	

带宽限制	

访问控制?
Block
Storage	

格式转换, 分区,格式化	

snapshot, template	

migration	

IO限制
Hypervisor	

KVM	

CPU/Memory	

使?用量限制	

migration
监控调度任务管理资源管理(DB)
?用户
管理
Object
storage
模板
管理
使?用量统
计与计费
API
??目录
服务
访问	

控制
CLIWEB
ELB?
PAAS...
?日志
通知	

报警
前端框架
? 前端后台:Django?
目前没有遇到性能问题,因为:?
云计算产物在Web上需要的操作不多;?
部署了多节点分摊压?力;?
采用了相对?高效的模板库(jinja)进?行渲染
? 代码管理与安全隔离:?
代码独立管理:不是?一套风格;SDK import问题?
部署与后端分离,通过API调用,防?止Web攻击	

? pros & cons:?
社区支持较好;有些特性比较鸡肋
后端Work Flow
REST APIs
Models
Queues
Service	

Workers
消息通信
? 各个服务之间的通信?
稳定性第?一	

? 消息队列 vs Web server?
OpenStack采用Rabbitmq;?
Web server更加久经考验,业界对于http协议有着
最成熟的经验
? 重度使?用了Tornado?
单线程、异步回调、协程、?高性能、语?言级支持
数据库
? 使?用ORM:SQLAlchemy?
功能丰富;?文档不友好;有些小坑;唯?一能用的?几个
Python ORM中算比较好的;关闭auto-commit	

? 数据库查询:缺少对异步的原?生?支持?
Web server的异步框架与ORM的同步查询?矛盾;?
?网上能找到开源的数据库异步驱动(不敢用)
? 定制Tornado,?支持线程?
由于GIL的存在,协程在Python中的地位非常重要,但
复杂项目仍不可缺少线程;
? 线程级别的数据库事务锁、对象锁
范例:罢辞谤苍补诲辞
源码剖析:罢辞谤苍补诲辞
源码剖析:美团云
延伸阅读
? Python 3 asyncio?
This module provides infrastructure for writing single-threaded concurrent
code using coroutines, multiplexing I/O access over sockets and other
resources, running network clients and servers, and other related
primitives.?
?
asyncio的核?心是?一个event loop,功能上包含了coroutine、future、task
的抽象;性能优秀(superior to nodejs)?
?
?十分?火爆,众多第三?方库添加支持;asyncio.org,试图重写?一切	

? database + asyncio ??
泼冷?水,SQLAlchemy作者:使用关系型数据就应该是线程模型;性能下降?
http://techspot.zzzeek.org/2015/02/15/asynchronous-python-and-
databases/?
?
表支持,Python社区?人?士:除了关系型数据库以外还有Redis,Memcache,
RPC这些东西;?一个操作里完成所有查询并自动收集结果是个很cool的事?
http://www.onebig?uke.com/2015/02/asyncio-is-for-composition.html
REST API
? REST API?
4种http操作对应资源的增删查改?
GET /class_name/object_id	

? 资源的从属关系在云计算业务上能够?非常清
楚地反映?
云也是?一种资源,特别是对于IaaS?
DELETE /zones/zone_id/hosts/host_id?
POST /storages/storage_id/disks
? http client的?一些定制?
httplib2 -> Tornado async client?
future
其他
? Python包管理?
测试环境:单机版云平台,?一键安装;?
仍然使用pip:离线源码包,指定版本;?
依赖链:pip show查询,提前在脚本里写好顺序	

? subprocess.check_output?
收集程序输出结果,经常使用;?
2.6版本只有check_call和call;?
自?己实现
其他
? Python 2.6,踩过的坑?
CentOS 6.x 默认自带2.6版本;?
Dict Comprehension 语法只在2.7以上支持;?
非异常,编译器直接报错,导致服务不可用?
?
d = {key: value for (key, value) in iterable}
争议问题
? 性能?
很慢,非IO,纯内存操作;?
不敢开线程;?
多实例,分布式锁,有开发难度;?
对比 go coroutine、java thread,go map vs python dict
? 内存泄露??
自研的模块基本没遇到过,用apache+mod_wsgi跑Keystone服务的
时候遇到过?几次
? 动态语?言特性?
提升开发效率的同时也带来危险性,保持良好编码习惯;?
typo / assert
? IDE vs Text Editor
用简单语言构建复杂系统

More Related Content

用简单语言构建复杂系统