V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
p8p8
V2EX  ›  Python

APP 客户端上传图片到后台服务器(tornado),会导致 tornado block 掉

  •  
  •   p8p8 · 2014-11-21 02:27:16 +08:00 · 4759 次点击
    这是一个创建于 3682 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这个问题,之前有人答过我,可能是我自己太笨了,没能很好的理解。

    他提出最好是把上传文件的接口放到另一台服务器上去,我觉得这个方法可行,但是另一台服务器上肯定不能继续再用tornado了,不然另一台服务器又block掉?想来想去,曾经写过2年的erlang,所以决定用erlang来做这样的工作,但是这里又有一个疑问出现了,那就是权限问题(当然这也可能是我没理解透彻,待会再说),如果把上传接口扔到这台erlang服务器的话,那么肯定要验证一下上传者的权限吧,否则谁都可以往这台服务器上随意上传东西了,那就乱套了。

    但是,是不是我没理解,还是想多了,其实可能这个朋友提出的思路是后台的这台tornado服务器和erlang服务器直接交互数据啊(他们处于同一局域网段),而不是直接用户向erlang这台服务器交互??


    夜深了,这问题想不透,真是睡也睡不着啊,我这是怎么了!!!也是蛮拼的额~~
    21 条回复    2014-11-23 14:09:30 +08:00
    ityao
        1
    ityao  
       2014-11-21 06:33:32 +08:00
    客户端上传用七牛之类的api不就可以了, 不经过自己服务器用别人的服务器管理图片之类的二进制上传和保存!(我没收广告费啊, 不过给你一种参考!)
    p8p8
        2
    p8p8  
    OP
       2014-11-21 07:43:25 +08:00
    @ityao 你是指APP端,直接用七牛的AUTH之后,去上传是吗?这样会不会不安全啊,把AUTH都发到七牛去?
    p8p8
        3
    p8p8  
    OP
       2014-11-21 07:43:40 +08:00
    不是说七牛去,是把AUTH都发到客户端去,口误!
    p8p8
        4
    p8p8  
    OP
       2014-11-21 08:17:28 +08:00
    另外我看到好像有一个Riak CS 开源的,这个跟七牛有什么差别吗?或者说他能完成七牛一样的工作吗?
    powerfj
        5
    powerfj  
       2014-11-21 08:22:29 +08:00
    block掉是因为tornado是单进程单线程的,你这一个请求会堵住别的一般的请求,你把文件的上传指向另外一个服务器,多开几个进程,这样不会堵住一般的请求,当然如果很多人疯狂的上传文件,你的上传文件服务器肯定卡是肯定的
    bingo00
        6
    bingo00  
       2014-11-21 08:36:32 +08:00
    你问题搞混了,
    第一个问题上传到tornado服务器不想被阻塞掉的解决方式是要么用gunicorn开多个进程,要么直接写个单独的服务器来上传;
    第二个问题你说的权限问题,服务器的权限控制肯定是你自己来写代码控制的,看你的说法,我觉得你现在都没有给自己加权限控制。
    sujin190
        7
    sujin190  
       2014-11-21 09:26:38 +08:00
    tornado上传图片为什么会block啊?不应该啊
    est
        8
    est  
       2014-11-21 09:58:15 +08:00
    如果 generator 写的溜,可以自己改造成异步request响应。。。。比如一个chunk去yield一下。就不会阻塞整个tornado了。

    tornado的阻塞是python函数级别的。gevent就好很多。原生调用级别的。
    LINAICAI
        9
    LINAICAI  
       2014-11-21 11:14:38 +08:00
    我的解决方案 是用七牛上传图片 返回的图片地址URL存我的数据库
    openroc
        10
    openroc  
       2014-11-21 11:55:21 +08:00
    加nginx,开启upload模块,:)
    clino
        11
    clino  
       2014-11-21 13:59:14 +08:00
    @est 那 tornado 能不能在 gevent 的 patch_all以后跑呢?这样说不定能解决楼主的问题了.
    搜了一下有个gtornado https://github.com/wil/gtornado ,不过n年木有更新了
    est
        12
    est  
       2014-11-21 14:04:21 +08:00
    @clino 不能。gevent的ioloop和tornado不在同一个地方。
    zhicheng
        13
    zhicheng  
       2014-11-21 15:02:13 +08:00
    Python 的网络处理是非阻塞的,但如果你在 Handler 里用的 Python 提供 file.write 函数,这个是阻塞的。
    解决办法有几种,

    一是用 tornado.iostream 处理文件的读写,彻底解决问题。

    二是运行多个 tornado 进程,不需要任何额外处理,一定程度上解决问题。

    三是用队列保存文件,需要队列支持 HTTP 的 Pub,完全解决问题。 。

    四是用 S3,Youpai,Qiniu 或者其它任何类似服务。鉴权不需要存储在客户端,只需要上传之前将文件信息提交到服务器的接口,接口生成针对文件的鉴权,客户端用这个上传到指定的服务商,彻底的完全的永远的解决问题。

    我可以把四的代码给你参考一下。
    maga
        14
    maga  
       2014-11-21 15:38:39 +08:00
    @zhicheng 阿里云的OSS可以支持上传图片吗
    zhicheng
        15
    zhicheng  
       2014-11-21 16:16:14 +08:00
    @maga 这你得看阿里云OSS的文档啊。。。一般情况下都支持得吧。
    ityao
        16
    ityao  
       2014-11-21 16:23:26 +08:00
    @p8p8 服务器生成个令牌给客户端, 不需auth信息泄露
    p8p8
        17
    p8p8  
    OP
       2014-11-21 17:01:52 +08:00
    @zhicheng 劳烦您把四的代码,发我看看呗。给大家也一起看看,我想过用七牛的存储方案,但是还有几个其他的问题,例如我们APP的H用户发了一张图片,他不想让G用户看见,那么G就无法访问这张照片,如果H用户想让F用户能看见这张图片,F用户则能看见(浏览、访问)这张图片,所以我不知道这个在七牛能不能实现!
    zhicheng
        18
    zhicheng  
       2014-11-21 18:34:00 +08:00
    @p8p8
    https://github.com/zhicheng/storage
    把里边的参数改成你的帐户的。
    只写了又拍云的,其它的也是类似,对客户端透明。你说的那种需要在请求URL加验证参数,S3 可以实现,其它的就不清楚了。
    crossmaya
        19
    crossmaya  
       2014-11-21 23:14:47 +08:00
    @p8p8 这纯粹是逻辑问题,和图片在哪没关系吧,图片地址限制访问可以用七牛的token + 过期时间处理,还有tornado并不支持大文件上传
    2owe
        20
    2owe  
       2014-11-22 15:37:27 +08:00
    同意 @openroc

    设计后端服务时,动态请求用 tornado,静态资源尽量留给 nginx
    p8p8
        21
    p8p8  
    OP
       2014-11-23 14:09:30 +08:00
    不用nginx去处理了,考虑云存储方案算了,不然太折腾。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3351 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 10:33 · PVG 18:33 · LAX 02:33 · JFK 05:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.