移动应用中的Python架构

jeff kit

jeff@toraysoft.com

1 关于我

  • @jeff_kit
  • pythoner
  • 创业中
    • 一起
    • 速推(口袋生活)
    • 天天点歌
    • 音乐说

2 大纲

  • 应用架构
  • 部署、监控工具箱

3 应用架构

art.png

4 架构中的Python

art3.png

4.1 nginx

  • 异步IO,同时处理更多请求
  • 负载均衡
  • 静态文件处理
  • 没有不用的理由

4.2 uwsgi

  • 纯C编写,兼容wsgi,异步IO
  • 一种二进制协议,比纯http快
  • empire模式很强大
    • 应用独立进程
    • 踫一下重启

4.3 tornado

  • server + Framework
  • nginx直接到tornado
  • 如果使用websocket,需要支持ws版本的nginx

4.4 Django!

  • Fullstack!
  • Admin!
  • 不仅仅是web框架,也是业务基础框架
    • auth
    • contenttypes
  • 丰富的apps
  • 不是zope
  • 还有 …

4.5 文档!

djangodoc.jpg

4.6 Django Rest Framework

  • Model极速变顾Resource
  • APIView, get, post, delete, etc
class NoteView(APIView):
    def get(self, request):
        ......
    def post(self, request):
        ......
  • 多种身份验证(无session)
  • 权限
  • 访问频率限制

4.7 Social_Auth

  • 得益于Django Auth
  • 快速接入社交网络
  • 无论再怎样努力,都会遇上奇皅的企鹅

4.8 迷你框架之殇

  • 看起来很美
  • 满足不折腾会死星人的快感
  • N个迷你组合 .VS. Django
  • 有自己适用的场景

4.9 tornado

  • 长连接,异步
  • 与Django完美结合,各取所需
  • 场景:
    • 请求代理
    • 实时聊天,websocket

4.10 celery

定义异步任务

from celery import Celery

app = Celery('tasks', broker='amqp://guest@localhost//')

@app.task
def add(x, y):
    return x + y

调用异步任务

from tasks import add
add.delay(4, 4)

4.11 celery心得

  • +redis
  • 队列隔离
  • 设置优先级
  • 慎保存任务结果
    • 数据库存储激增
    • 队列数据激增

4.12 redis

  • 结合celery做为异步任务队列
  • 推送队列
  • 各种排行榜
  • 实时数据统计
  • 等等 …

5 部署与监控

5.1 fabric

git push触发自动部署

from fabric.api import run, env, with_settings, cd, hosts

@hosts('nemo:7749')
@with_settings(key_filename='/opt/mysite.com/pkey', user='deploy')
def update_dev():
    with cd('/srv/www/mysite.com/application/'):
        run('git pull origin develop')
    run('touch /opt/config/vhost/mysite.com.ini')

5.2 supervisord

[program:memcached]
command=/usr/bin/memcached -m 64 -p 12233 -l 192.168.0.2 -u nobody
priority=9

[program:redis]
command=/opt/redis/redis-server /opt/redis/redis.conf
user=redis
priority=8

5.3 sentry

sentry.png

5.4 sentry + Django

  • pip install raven
RAVEN_CONFIG = {
    'dsn': 'http://klsdfuoweir960f4e5:7cefa3b1f3c98d5fa78b@sentry.mysite.com/2',
}
INSTALLED_APPS = INSTALLED_APPS + (
    ...
    'raven.contrib.django.raven_compat',
)

6 云服务

服务云化的节奏

  • 代码重用
  • 组件化
  • api、(云)服务

6.1 拥抱云服务

6.2 自有服务

  • 推送服务
  • 用户反馈服务
  • 应用内聊天
  • app版本更新
  • 微信公众号网关

6.3 第三方服务

  • 云存储@七牛
  • 分享@shareSDk
  • 数据统计@友盟

7 感谢!

jeff@toraysfot.com