关于 J2EE 转型 Python 的相关请教 - V2EX
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
tan9le
V2EX    Python

关于 J2EE 转型 Python 的相关请教

  •  1
     
  •   tan9le 2014-07-06 20:51:49 +08:00 6999 次点击
    这是一个创建于 4122 天前的主题,其中的信息可能已经有所发展或是发生改变。
    刚刚发了一篇,把Golang其实也是带上的,写了半天,点了创建,没有任何错误提示,但是缺没有创建成功?@Livid 是现在有审核/延迟机制,还是我操作不当?总之我在我自己发布的主题里也找不到。

    情况是这样的,我们公司大多数的项目都是使用Struts2+Spring+Mybatis进行开发的,由于今年又新进了一些小白(校招进来的,有一部分是纯小白),我最近在琢磨着拉出一只小团队,使用Python把我们的部分产品进行重写,一方面是做技术积累,另外一方面其实是看中了Python的开发速度和便捷性。

    在V2EX中潜水了这么长时间以后,我初步的想法是使用Tornado+sqlalchemy,但是心中还存在几个比较大的疑惑希望各位V友给予解惑

    1.有无像Spring面向切面和依赖注入的成熟技术方案或者框架?

    2.我搜索到Python方面进行事物控制基本都依赖于手动提交数据库事物,有没有分布式的事务管理和面向切面的事务管理?

    3.在数据库访问方面,JAVA的JDBC非常方便,但是在Python上我目前的调研结果是比较复杂,就比如访问Oracle,JAVA只需要将JDBC的jar包放在类路径内就可以直接访问,我可以在应用中打包mysql、mssql、oracle等等的jar包,而Python好像每种数据库都对应着不同的配置方式,就比如Oracle的连接,就依赖于Oracle客户端和Oracle的一些环境变量的配置,这一块有没有不依赖于环境的,比较简单的解决方案?

    3.在应用发布方面,J2EE将所有的第三方类库都可以打包进应用,或者统一配置在类路径下就可以,Python我好像没有搜索到什么简便的办法,都在说使用VirtualENV+pip来构建环境,能不能象JAVA一样打包进工程内,而摆脱服务器环境的依赖?这点其实蛮重要的,我们的研发和实施是两个团队,实施团队已经习惯了扔个war包进行就可以运行。

    4.我们目前采用了Dubbo+Zookeeper的架构来应对高并发场景,Python在高并发、分布式上有没有成熟的技术方案?

    希望这次主题能够发成功,请各位V友多给点意见,谢谢!
    40 条回复    2014-07-07 23:53:02 +08:00
    zava
        1
    zava  
       2014-07-06 20:56:41 +08:00
    听lz这样描述, 感觉你们的技术栈都是 java(JVM) 生态的啊. 何苦要换成 Python, 成本代价很大的.
    Livid
        2
    Livid  
    MOD
    PRO
       2014-07-06 21:03:55 +08:00
    如果你在写帖子的过程中打开了其他主题,或者是回复过其他主题,那么会造成你写帖子的页面上的 CSRF token 失效。
    Livid     3
    Livid  
    MOD
    PRO
       2014-07-06 21:04:32 +08:00
    如果是出现这种情况,那么你只要继续点提交就可以发送成功的。
    tan9le
        4
    tan9le  
    OP
       2014-07-06 21:07:10 +08:00
    @zava JAVA作为主要的技术支撑,但是J2EE对于纯小白来说,学习代价还是有些大的,而且随着业务的逐渐发展,有些项目已经不是由客户提供环境,我们进行部署的这种方式来实施了,有一部分客户是直接委托我们进行开发、运营。
    算是做一部分技术积累和尝鲜吧,也不可能大规模,一个小组来做。
    tan9le
        5
    tan9le  
    OP
       2014-07-06 21:08:53 +08:00
    @Livid 我在写帖子过程中开了一个标签页,又打开了一次v2ex,并按了一次Command+R,莫非是这个原因?
    Livid
        6
    Livid  
    MOD
    PRO
       2014-07-06 21:09:29 +08:00
    @tan9le Yes.
    reeco
        7
    reeco  
       2014-07-06 21:29:42 +08:00
    javaEE程序猿飘过
    est
        8
    est  
       2014-07-06 21:40:44 +08:00   1
    这个不叫转型到Python。。这个叫用Java的框去套python。。。。。Zookeeper没有替代,python也得继续用zookeeper的客户端。
    n37r06u3
        9
    n37r06u3  
       2014-07-06 21:41:53 +08:00
    最近面试一家公司 也准备转python开发 不过python做企业级应用 经验确实不丰富
    skybr
        10
    skybr  
       2014-07-06 21:42:59 +08:00   1
    要发挥tornado的异步优势, 得找容易被嵌进ioloop的driver. 配sqlalchemy会被坑的.
    tan9le
        11
    tan9le  
    OP
       2014-07-06 21:43:02 +08:00
    @est 感谢,我比较关心的是分布式以及事务控制,有无成熟点的解决方案呢?
    tan9le
        12
    tan9le  
    OP
       2014-07-06 21:44:16 +08:00
    @skybr 感谢,同上一个回复,在分布式和事务控制方面,Python有没有成熟的解决方案?
    tonyluj
        13
    tonyluj  
       2014-07-06 21:47:23 +08:00   1
    1.对于这个问题,可以参考 http://stackoverflow.com/questions/2461702/why-is-ioc-di-not-common-in-python
    3.数据库连接方面,cx_oracle确实依赖一些Oracle client或env,上次开发配置Oracle就花费了不少时间,最后还是用docker
    3.这个把依赖的库放到工程目录就可以了吧
    4.高并发的话,集群可以用lvs,也可以在单机用Nginx+supervisor+N个tornado,数据库用memcached+Mysql,数据库写的话加一层rabbitmq

    LZ可以参考一下豆瓣、Dropbox这些使用Python的公司是怎么解决的。
    palmers
        14
    palmers  
       2014-07-06 21:50:50 +08:00
    围观下
    tan9le
        15
    tan9le  
    OP
       2014-07-06 21:59:17 +08:00
    @tonyluj 非常感谢,针对第一点,我想是我的思维模式已经习惯了J2EE导致的
    依赖方面,比如我在开发环境中使用了virtualenv,然后通过pip安装了10个第三方库,那么我将virtualenv中的Lib目录下的py/pyc/pyd拷贝至生产环境就可以使用了么?
    最后一点我可能没有表述的很清楚,LVS/Nginx,或者F5都可以实现负载均衡,但是我还是比较关注服务路由,服务治理/管理,还有多版本服务共存等等的解决方案,当然这一块可以通过自行编码实现,但是指望一个新的团队去造轮子可能会不太现实,请问这一块有没有什么建议呢?
    JoshuaJin
        16
    JoshuaJin  
       2014-07-06 22:23:40 +08:00   1
    看了LZ的问题觉得如果只是做一些技术积累的话完全没必要用python去重写java版本的应用。本来JAVA EE提供很多现成的功能还要在python体系内去找,功能稳定不稳定另说,能不能找到还是个问题。不太清楚LZ看中python在企业应用中有什么优势,如果是说开发效,部署灵活性的问题,为什么不考虑scala, clojure呢?framework也有,和java也能互通,觉得很有优势。
    tan9le
        17
    tan9le  
    OP
       2014-07-06 22:32:01 +08:00
    @JoshuaJin 我没看中Python在企业应用中的优势,而且这个主题就是来问问大家Python在企业应用中有没有优势的。
    其实我是有私心的啦,首先我自己对Python比较感兴趣;其次,Python的学习难度比较低,如果新人想系统的学习J2EE,耗费的时间也比较长,换句话说,我现在想用Python的一大原因就是他的门槛低,学习速度快
    est
        18
    est  
       2014-07-06 22:47:03 +08:00   1
    @tan9le 我告诉你实话把:

    > 注服务路由,服务治理/管理

    python这一块基本是靠手动。因为Java冷启动慢,需要编译才能部署,所以那么麻烦,python呢,一般都是新功能直接杀掉worker重启容器即可。载入时间基本不成问题。甚至有在服务器上直接修改.py文件在线调试的(喂喂喂这样干过的不要不承认!)

    服务治理/管理还是很原始用环境变量、Redis、SQLite搞的多的是,甚至配置就直接写成一个.py文件然后项目去import即可。其实.py文件可读性比较高了可以直接人工修改。没有Zookeeper那种高大上的。
    tan9le
        19
    tan9le  
    OP
       2014-07-06 22:52:50 +08:00
    @est 好吧,那照这么说来,实际上我想让一帮小白去做这些事情就是不靠谱的了,最起码也是有一定设计的能力的人才可以。

    感谢你的指点。
    wuxqing
        20
    wuxqing  
       2014-07-06 23:21:12 +08:00   1
    个人观点:
    python入门简单,但要用好,也是不易的
    python做最短平快(或者1、2个人)的项目挺好,但是大点的项目,对人员要求还是蛮高的。可能会写出很难维护的项目,我已经经历过了
    纯小白还是用你成熟的技术(架构)吧,用python不见得省心
    helloworld00
        21
    helloworld00  
       2014-07-07 00:31:06 +08:00
    dropbox都从python跳到go了。。。
    2ex
        22
    2ex  
       2014-07-07 08:49:54 +08:00
    从目前来讲Python用在生产环境还是挺好得。Web框架建议用DJango,Tornado太过于精简了,到头来基本得session等功能都要靠自己来实现,另外tornado得资料没多少,django资料是海量。新人遇到问题很容易可以在stackoverflow等站上找到解决办法。
    Golang基本上都是用来写后台高并发的,用作写web不是不可以,但明显不是最方便的。
    tan9le
        23
    tan9le  
    OP
       2014-07-07 08:50:54 +08:00
    @helloworld00 golang目前还没达到我们团队能够消化的地步,只能尝尝鲜
    tan9le
        24
    tan9le  
    OP
       2014-07-07 08:55:43 +08:00
    @2ex 我相信就技术语言本身而言,大家都差不多,只有实现复杂度的问题,而真正能被企业应用所使用的往往是它有没有丰富的,成熟的解决方案和实施路径。django在解决我提出的问题上我好像没搜到什么方案呀
    tan9le
        25
    tan9le  
    OP
       2014-07-07 08:59:09 +08:00
    @2ex 还有一个地方可能是我没描述清楚的,我们大多数的应用是包含移动终端的,django我的调研结果是做web应用比较有优势一些,不知道理解的是否正确?
    mengzhuo
        26
    mengzhuo  
       2014-07-07 09:19:30 +08:00
    @est

    2年Python开发表示服务器上改文件中枪……还附赠reload

    -----------------------------------------
    Tornado
    IOLoop坑比较大,小心数据库没有驱动

    sqlalchemy
    第三方插件良莠不齐……也得小心

    ----------------------------
    楼上吐槽Python多人开发就不行了,明显是队友、沟通、合作不给力啊,曾经和6个人一起开发过的表示没有压力。
    jjx
        27
    jjx  
       2014-07-07 09:32:27 +08:00
    俺这几年主要的一个事项就是用python做erp开发, 先期语言经验包括c/vb/java/c#/delphi/pb/x++等,对于企业db应用,动态语言是最好的选择, python是动态语言中最好的选择. 理由就不讲了, 无法理解的人永远无法理解

    至于lz, 明显的python新手, 我觉的还是自己先积累几万行的代码经验后再动这个念头会好
    tan9le
        28
    tan9le  
    OP
       2014-07-07 09:57:19 +08:00
    @jjx 的确是新手,都是自己看看,仅仅是看看哦,所以才来请教大家。

    现在所处的岗位已经不允许我去敲代码了,所以我在实施前是需要调研清楚的
    est
        29
    est  
       2014-07-07 10:07:25 +08:00
    @tan9le 还有不允许敲代码的岗位。真好。
    tan9le
        30
    tan9le  
    OP
       2014-07-07 10:24:09 +08:00
    @est 好什么呀,偏离了当初的理想。
    不是明令禁止写代码,而是没有时间去写了,包括周末
    sharewind
        31
    sharewind  
       2014-07-07 10:26:05 +08:00
    写过python 和 java ,真心觉得还是java 稳妥。。。。
    vicalloy
        32
    vicalloy  
       2014-07-07 10:43:49 +08:00
    @mengzhuo 楼主是想让小白来做,所以我认为“不适合多人开发”是合理的吐槽。
    脚本语言由于太过自由(python已经算比较不“自由”的),会给人各种犯错的机会。
    让一群小白协作很容易失控。
    相比而言JAVA只要能编译通过就已经成功大半了。
    timonwong
        33
    timonwong  
       2014-07-07 10:59:31 +08:00
    想让代码迅速腐化吗?那就让一群Python新手开发项目吧,除非这个项目不重要,而且持续时间比较短。
    incompatible
        34
    incompatible  
       2014-07-07 11:02:55 +08:00 via Android
    @jjx 请教几个问题
    1 什么是企业db应用?
    2 分布式事务在python下有解决方案伐?
    3 工作流有没有现成的开源组件?

    万谢
    tremblingblue
        35
    tremblingblue  
       2014-07-07 11:10:44 +08:00
    感觉这样的项目转为jee感觉就是挖个大坑自己跳,而且都是新手的话,还是那么多人,感觉真的不大建议.

    从公司层面这样做真的不大好.当然对于lz自己的能力啊什么的这个挑战其实挺不错的.
    cloud107202
        36
    cloud107202  
       2014-07-07 11:21:56 +08:00
    建议坚持java
    动态语言开发速度是建立在非特别复杂/非大型非企业应用的前提下
    更何况对于复杂/多人协作/大型/企业应用来说,比开发速度更重要的点多了去了。Java作为工具链丰富,语法严谨的工业语言非常合适
    timonwong
        37
    timonwong  
       2014-07-07 11:22:46 +08:00
    @incompatible
    2. 整套方案用Python实现的估计,MQ有个WebSphere MQ的binding, PyMQI,没有用过不做评价
    3. Python的工作流主要关注的是数据,而不是业务。了解过spiff,用过OpenStack的taskflow,感受是真不好用。
    mengzhuo
        38
    mengzhuo  
       2014-07-07 12:51:36 +08:00
    @vicalloy

    “相比而言JAVA只要能编译通过就已经成功大半了。”
    ----------------------
    把代码(人)的问题/错误推给语言,太不靠谱了
    incompatible
        39
    incompatible  
       2014-07-07 23:43:37 +08:00
    @timonwong
    2. 感谢。 但是MQ和分布式事务实际上不是同一个东西
    前者是jms的实现,后者是xa规范
    incompatible
        40
    incompatible  
       2014-07-07 23:53:02 +08:00
    @mengzhuo
    是人都会犯错误 语言的特性决定了错误是在编译期就被发现还是运行时才被发现
    拿duck typing举例: java不支持这种玩意儿(当然你也可以用反射来实现),所以永远不会出现系统跑起来了结果发现传给某个方法的参数并不是它想要的这种事情

    我个人认为在大型工程中,基于接口编程比基于约定编程要靠谱的多
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1191 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 17:46 PVG 01:46 LAX 10:46 JFK 13:46
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86