Enviar pesquisa
Carregar
合久必分,分久必合
•
75 gostaram
•
5,215 visualizações
Q
Qiangning Hong
Seguir
@ QCon Beijing 2012
Leia menos
Leia mais
Denunciar
Compartilhar
Denunciar
Compartilhar
1 de 55
Baixar agora
Baixar para ler offline
Recomendados
DAE
DAE
Qiangning Hong
Python 于 webgame 的应用
Python 于 webgame 的应用
勇浩 赖
论 Python 与设计模式。
论 Python 与设计模式。
勇浩 赖
页游开发中的 Python 组件与模式
页游开发中的 Python 组件与模式
勇浩 赖
JCConf2015: groovy to gradle
JCConf2015: groovy to gradle
Ching Yi Chan
Docker進階探討
Docker進階探討
國昭 張
Monitor is all for ops
Monitor is all for ops
琛琳 饶
DNS协议与应用简介
DNS协议与应用简介
琛琳 饶
Recomendados
DAE
DAE
Qiangning Hong
Python 于 webgame 的应用
Python 于 webgame 的应用
勇浩 赖
论 Python 与设计模式。
论 Python 与设计模式。
勇浩 赖
页游开发中的 Python 组件与模式
页游开发中的 Python 组件与模式
勇浩 赖
JCConf2015: groovy to gradle
JCConf2015: groovy to gradle
Ching Yi Chan
Docker進階探討
Docker進階探討
國昭 張
Monitor is all for ops
Monitor is all for ops
琛琳 饶
DNS协议与应用简介
DNS协议与应用简介
琛琳 饶
深入淺出 Web 容器 - Tomcat 原始碼分析
深入淺出 Web 容器 - Tomcat 原始碼分析
Justin Lin
Automate with Ansible basic (3/e)
Automate with Ansible basic (3/e)
Chu-Siang Lai
千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7
Justin Lin
OpenResty/Lua Practical Experience
OpenResty/Lua Practical Experience
Ho Kim
Automate with Ansible basic (2/e)
Automate with Ansible basic (2/e)
Chu-Siang Lai
Large-Scale Cluster Mangement & Kubernetes Under The Hood
Large-Scale Cluster Mangement & Kubernetes Under The Hood
Lei (Harry) Zhang
Glider
Glider
windyrobin
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版
Jackson Tian
現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & Windows
現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & Windows
Chu-Siang Lai
OpenEJB - 另一個選擇
OpenEJB - 另一個選擇
Justin Lin
Http Headers 與 Cache 機制(2016)
Http Headers 與 Cache 機制(2016)
振揚 陳
Docker實務
Docker實務
國昭 張
Continuous Delivery Workshop with Ansible x GitLab CI (2nd)
Continuous Delivery Workshop with Ansible x GitLab CI (2nd)
Chu-Siang Lai
Apache Zookeeper 分布式服务框架
Apache Zookeeper 分布式服务框架
Cabin WJ
Node way
Node way
Ethan Zhang
ElasticSearch Training#2 (advanced concepts)-ESCC#1
ElasticSearch Training#2 (advanced concepts)-ESCC#1
medcl
02 Objective-C
02 Objective-C
Tom Fan
05 MapKit and Text Input
05 MapKit and Text Input
Tom Fan
Network and Multitasking
Network and Multitasking
yarshure Kong
善用工具
善用工具
wang hongjiang
Wbw投资配套-手机或平板版
Wbw投资配套-手机或平板版
nms8278
Python高级编程(二)
Python高级编程(二)
Qiangning Hong
Mais conteúdo relacionado
Mais procurados
深入淺出 Web 容器 - Tomcat 原始碼分析
深入淺出 Web 容器 - Tomcat 原始碼分析
Justin Lin
Automate with Ansible basic (3/e)
Automate with Ansible basic (3/e)
Chu-Siang Lai
千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7
Justin Lin
OpenResty/Lua Practical Experience
OpenResty/Lua Practical Experience
Ho Kim
Automate with Ansible basic (2/e)
Automate with Ansible basic (2/e)
Chu-Siang Lai
Large-Scale Cluster Mangement & Kubernetes Under The Hood
Large-Scale Cluster Mangement & Kubernetes Under The Hood
Lei (Harry) Zhang
Glider
Glider
windyrobin
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版
Jackson Tian
現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & Windows
現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & Windows
Chu-Siang Lai
OpenEJB - 另一個選擇
OpenEJB - 另一個選擇
Justin Lin
Http Headers 與 Cache 機制(2016)
Http Headers 與 Cache 機制(2016)
振揚 陳
Docker實務
Docker實務
國昭 張
Continuous Delivery Workshop with Ansible x GitLab CI (2nd)
Continuous Delivery Workshop with Ansible x GitLab CI (2nd)
Chu-Siang Lai
Apache Zookeeper 分布式服务框架
Apache Zookeeper 分布式服务框架
Cabin WJ
Node way
Node way
Ethan Zhang
ElasticSearch Training#2 (advanced concepts)-ESCC#1
ElasticSearch Training#2 (advanced concepts)-ESCC#1
medcl
02 Objective-C
02 Objective-C
Tom Fan
05 MapKit and Text Input
05 MapKit and Text Input
Tom Fan
Network and Multitasking
Network and Multitasking
yarshure Kong
善用工具
善用工具
wang hongjiang
Mais procurados
(20)
深入淺出 Web 容器 - Tomcat 原始碼分析
深入淺出 Web 容器 - Tomcat 原始碼分析
Automate with Ansible basic (3/e)
Automate with Ansible basic (3/e)
千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7
OpenResty/Lua Practical Experience
OpenResty/Lua Practical Experience
Automate with Ansible basic (2/e)
Automate with Ansible basic (2/e)
Large-Scale Cluster Mangement & Kubernetes Under The Hood
Large-Scale Cluster Mangement & Kubernetes Under The Hood
Glider
Glider
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版
現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & Windows
現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & Windows
OpenEJB - 另一個選擇
OpenEJB - 另一個選擇
Http Headers 與 Cache 機制(2016)
Http Headers 與 Cache 機制(2016)
Docker實務
Docker實務
Continuous Delivery Workshop with Ansible x GitLab CI (2nd)
Continuous Delivery Workshop with Ansible x GitLab CI (2nd)
Apache Zookeeper 分布式服务框架
Apache Zookeeper 分布式服务框架
Node way
Node way
ElasticSearch Training#2 (advanced concepts)-ESCC#1
ElasticSearch Training#2 (advanced concepts)-ESCC#1
02 Objective-C
02 Objective-C
05 MapKit and Text Input
05 MapKit and Text Input
Network and Multitasking
Network and Multitasking
善用工具
善用工具
Destaque
Wbw投资配套-手机或平板版
Wbw投资配套-手机或平板版
nms8278
Python高级编程(二)
Python高级编程(二)
Qiangning Hong
New Design of OneRing
New Design of OneRing
Qiangning Hong
OneRing @ OSCamp 2010
OneRing @ OSCamp 2010
Qiangning Hong
服务框架: Thrift & PasteScript
服务框架: Thrift & PasteScript
Qiangning Hong
豆瓣技术架构的发展历程 @ QCon Beijing 2009
豆瓣技术架构的发展历程 @ QCon Beijing 2009
Qiangning Hong
Python在豆瓣的应用
Python在豆瓣的应用
Qiangning Hong
Python于Web 2.0网站的应用 - QCon Beijing 2010
Python于Web 2.0网站的应用 - QCon Beijing 2010
Qiangning Hong
Destaque
(8)
Wbw投资配套-手机或平板版
Wbw投资配套-手机或平板版
Python高级编程(二)
Python高级编程(二)
New Design of OneRing
New Design of OneRing
OneRing @ OSCamp 2010
OneRing @ OSCamp 2010
服务框架: Thrift & PasteScript
服务框架: Thrift & PasteScript
豆瓣技术架构的发展历程 @ QCon Beijing 2009
豆瓣技术架构的发展历程 @ QCon Beijing 2009
Python在豆瓣的应用
Python在豆瓣的应用
Python于Web 2.0网站的应用 - QCon Beijing 2010
Python于Web 2.0网站的应用 - QCon Beijing 2010
Semelhante a 合久必分,分久必合
Nodejs & NAE
Nodejs & NAE
q3boy
網站上線了,然後呢?
網站上線了,然後呢?
Kirk Chen
美团前端架构简介
美团前端架构简介
pan weizeng
DAE 新变化介绍
DAE 新变化介绍
Tianwei Liu
新浪云计算公开课第一期:Let’s run @ sae(丛磊)
新浪云计算公开课第一期:Let’s run @ sae(丛磊)
锐 张
我們與Azure DevOps的距離
我們與Azure DevOps的距離
Edward Kuo
W3CTech美团react专场-React Native 初探
W3CTech美团react专场-React Native 初探
美团点评技术团队
從軟體開發角度 談 Docker 的應用
從軟體開發角度 談 Docker 的應用
謝 宗穎
[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛
[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛
Edward Kuo
廣宣學堂: 企業導入微服務實戰
廣宣學堂: 企業導入微服務實戰
Paul Chao
企業導入微服務實戰 - updated
企業導入微服務實戰 - updated
Paul Chao
D baa s_in_xiaomi
D baa s_in_xiaomi
hdksky
云梯的多Namenode和跨机房之路
云梯的多Namenode和跨机房之路
li luo
新浪微博平台与安全架构
新浪微博平台与安全架构
n716
Open source的devops工具箱 公開版@coscup2016
Open source的devops工具箱 公開版@coscup2016
Kirk Chen
企業導入微服務實戰 - updated
企業導入微服務實戰 - updated
Paul Chao
大规模网站架构
大规模网站架构
drewz lin
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰
Scourgen Hong
去哪儿Ugc平台设计经验
去哪儿Ugc平台设计经验
mysqlops
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践
taobao.com
Semelhante a 合久必分,分久必合
(20)
Nodejs & NAE
Nodejs & NAE
網站上線了,然後呢?
網站上線了,然後呢?
美团前端架构简介
美团前端架构简介
DAE 新变化介绍
DAE 新变化介绍
新浪云计算公开课第一期:Let’s run @ sae(丛磊)
新浪云计算公开课第一期:Let’s run @ sae(丛磊)
我們與Azure DevOps的距離
我們與Azure DevOps的距離
W3CTech美团react专场-React Native 初探
W3CTech美团react专场-React Native 初探
從軟體開發角度 談 Docker 的應用
從軟體開發角度 談 Docker 的應用
[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛
[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛
廣宣學堂: 企業導入微服務實戰
廣宣學堂: 企業導入微服務實戰
企業導入微服務實戰 - updated
企業導入微服務實戰 - updated
D baa s_in_xiaomi
D baa s_in_xiaomi
云梯的多Namenode和跨机房之路
云梯的多Namenode和跨机房之路
新浪微博平台与安全架构
新浪微博平台与安全架构
Open source的devops工具箱 公開版@coscup2016
Open source的devops工具箱 公開版@coscup2016
企業導入微服務實戰 - updated
企業導入微服務實戰 - updated
大规模网站架构
大规模网站架构
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰
去哪儿Ugc平台设计经验
去哪儿Ugc平台设计经验
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践
合久必分,分久必合
1.
合久必分,分久必合
洪强宁 QCon Beijing 2012
2.
美好时代
3.
代码结构
book models group views shire templates doumail . scripts . . tests
4.
部署方式
memcached nginx shire mysql beansdb server_name 9.douban.com; rewrite (.*) /ninetaps/$1 last;
5.
然而 • 时代在前进 • 产品在扩张 •
代码在膨胀
6.
shire项目Python源文件数与代码行数
源文件数 代码行数 4000 500000 3000 375000 2000 250000 1000 125000 0 0 2006 2007 2008 2009 2010 2011 2012
7.
问题浮现 • 难以掌控全局 •
新人上手变慢 • 新需求实现变困难 • 代码质量下降 • 代码耦合度变高 • 难以实现不同产品不同节奏
8.
首页宕了? 电影那边做了个改动……
9.
解决方案:分
10.
自发选择 • 新项目想使用新技术 •
m.douban.com: Pylons • 内部管理系统: Django
11.
自然选择 • 产品拆分 •
book站、movie站、alphatown... • 建立独立服务的需求 • IP定位服务 • 小豆服务
12.
如何分? •库 • 服务
13.
库 • 性能无损耗 • 升级发布麻烦 •
依赖注入
14.
服务 • 升级发布方便 • 客户端依赖轻 •
性能损耗 • 额外的故障点 • 开发环境搭建复杂
15.
适合服务的场景 • 需要分开部署 • 需要独立维护 •
需要错误隔离 • 需要节省资源 • 跨语言/跨平台
16.
重新调整主站代码结构 • 按照产品线切分包 • 定义包接口 •
公共代码单独建包 • 限制提交权限 • 基础代码独立成 douban-corelib 库
17.
新代码结构
community models book views movie templates shire . scripts . corelib tests douban-corelib
18.
部署方式调整 • 建立多个app server实例 •
nginx 分发到不同后端
19.
shire.main
memcached nginx shire.fm mysql alphatown beansdb . . services .
20.
开发方式调整
21.
分带来的问题
22.
重复开发 • web框架 • 测试框架和持续集成 •
日志处理 • 开发环境 • 上线脚本
23.
管理混乱 • 资源申请随意 • 权限不能统⼀一管理 •
出现资源竞争情况 • 监控方式随意、缺失、不⼀一致、不可控 • 配置管理不可靠 • 对服务的调用方式千差万别,难以控制
24.
历史经验未能最大化应用 • 服务软件参数配置 • fail
over 处理
25.
不能同步进化 • 代码复用率下降
26.
⼀一个应用想使用另⼀一 个应用的代码麻烦 • 修改
sys.path • 依赖代码变更后需要重启,否则可能出 现诡异问题
27.
解决方案:合
28.
需求 •
整合最基础的框架 • 创建新项目无痛化 • 统⼀一部署方式 • 统⼀一监控 • 统⼀一资源管理 • 以API形式提供基础设施使用接口 • 依赖管理 • 提供统⼀一的开发、测试、调试环境 • 同时尽量少的限制应用开发者
29.
私有云 • DAE (Douban
App Engine)
30.
PaaS • IaaS -
Infrastructure as a Service (EC2) • PaaS - Platform as a Service (GAE) • SaaS - Software as a Service (Gmail)
31.
32.
面向内部开发者 • 强调功能和性能 • 安全性可以放宽
• 主要防范无心做错事 • 但也需要有完善的操作权限和操作日 志
33.
为百至千级别的应用设计 • 权限隔离直接使用UNIX用户权限 • 对应用区分优先级别
• 资源紧张时优先保证高优先级应用
34.
开发语言支持 • Python • 支持Python的C扩展
• Python/C API • Cython/Pyrex • 未来会支持其他语言(如 go)
35.
依赖管理和隔离 • virtualenv +
pip • 每个app有自己独立的virtualenv • dae install • 是 pip install 的封装,更新 pip-req.txt
36.
示例 $ dae create
daetest $ dae install web.py $ vim app.py import web urls = ('/', 'index') class index: def GET(self): return "Hello, DAE" app = web.application(urls, globals()).wsgifunc() $ dae serve $ dae deploy open http://daetest.dapps.douban.com
37.
app.yaml • 应用配置中心 • wsgi
apps • daemons • cron • services • protected_files
38.
用API形式提供基础设施功能 •
mysql • memcache • beansdb • filesystem storage (MooseFS) • task queue • scheduled task • user login • dpark • 每个app拥有独立的namespace
39.
整合已有技术经验 •
LVS • nginx • deploy 流程 • thrift • onimaru - error collector based on django-sentry • scribe • puppet • 监控系统
40.
尝试新技术 • gunicorn --
a fast wsgi server • gevent -- coroutine library based on greenlet and libev • websocket support • mesos
41.
worker
gunicorn (app A) worker gateway gunicorn worker (app B) worker Node nginx Node
42.
项目间代码调用 •库 • 服务
43.
库 • setuptools (setup.py) •
DAE系统记录下安装的版本(利用 pip freeze) • 部署时保证服务器上版本⼀一致(利用 pip install -r) • 提供更新通知机制,向库使用者通知代 码更新
44.
依赖库版本
• 自动记录在 pip-req.txt 中 • PyPI上发布的软件:发布版本 • 代码仓库中的软件:revision -e hg+http://hghub.dapps.douban.com/douban- corelib@fb367759be2e1b37c77701d59be6514a3b39837e#egg=DoubanCoreLib distribute==0.6.19 web.py==0.36 wsgiref==0.1.2
45.
服务 •
DAE Service • thrift 接口定义 • 在 app.yaml 中定义实现代码入口 • gunicorn gevent worker • 用DNS实现服务寻址和权重 • 直接定位到服务提供者 • 未来会使用zookeeper实现路由推送 • 在客户端实现fail over、异常处理 • 与DAE集成
46.
user.thrift struct UserProfile
{ 1: i32 uid, 2: string name, 3: string blurb } service UserStorage { void store(1: UserProfile user), UserProfile retrieve(1: i32 uid) } app.yaml services: - interface: user.UserStorage handler: user.handler:UserStorageHandler handler.py class UserStorageHandler(object): def store(self, user): ... def retrieve(self, uid): ...
47.
DAE Service 客户端 $
dae service gen_client from daetest_client import UserStorage user = UserStorage.retrieve(1) 在客户端可进行超时、重试、调用失败时 的默认值等配置
48.
服务治理 • The next
big issue • Done is better than perfect
49.
50.
51.
52.
分分合合 app
app app app Platform app app app app 分:应用专心于应用自身的逻辑 合:平台成为应用和基础设施之间的纽带
53.
⼀一点感想 • 分要疾风骤雨 • 合要和风细雨 •
作为平台开发者,需要从分的过程中观 察合的需求 • 平台的可靠性和稳定性非常重要 • 好用的才会有人用
54.
Q &A 你也可以通过下列方式找到我: http://www.douban.com/people/hongqn/ hongqn@douban.com twitter: @hongqn 新浪微博:
@hongqn
55.
Thanks
Baixar agora