大家在做多个应用集成的时候是采用共享数据库直接操作表还是通过应用程序接口? - 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
wodemyworld
V2EX    Python

大家在做多个应用集成的时候是采用共享数据库直接操作表还是通过应用程序接口?

  •  
  •   wodemyworld 2014-02-16 17:00:23 +08:00 3899 次点击
    这是一个创建于 4262 天前的主题,其中的信息可能已经有所发展或是发生改变。
    例如两个应用,一个用户管理UM,一个考勤管理CM;
    把CM集成到UM,可以两个应用共享一个数据库,然后就可以访问互相之间的表了,直接在表里操作;
    另一种,是CM通过UM程序的开放api来进行通信,进行业务操作,即把所有操作告之给UM,然后再由UM来操作自己的数据库表们,但这一种方式有一个缺点,就是需要保证数据一致性的时候,由于无法直接访问对方数据库,因此无法对相应表进行join(或者进行事务操作),那么就得向UM发起多个请求来进行一个应用程序级的“事务”(当然在应用程序级也要自己去实现加锁),开发代价有点太大了。

    请问下各位,你们在做多个应用集成的时候,涉及数据时,你们是如何做的?

    学习下~:)
    10 条回复
    mactaew
        1
    mactaew  
       2014-02-16 18:47:12 +08:00 via Android
    做一套通用的操作api,两个系统都调用这个来进行操作。
    wodemyworld
        2
    wodemyworld  
    OP
       2014-02-16 19:24:21 +08:00
    @mactaew 那像CM这种模块,他是依赖于UM的,那么在CM中需要缓存UM中的用户信息么,那么如果UM中删除某用户,而CM又在做某种对用户信息的纪录,那么他们之间的缓存也是要做同步的吧,毕竟数据的一致性要保证的
    saharabear
        3
    saharabear  
       2014-02-16 19:25:02 +08:00
    都用。

    如果是一套程序的多个子程序,那么可以用统一的数据处理接口来操作同一个数据库。

    如果是不同程序的多个程序,那么可以用API的方式。
    saharabear
        4
    saharabear  
       2014-02-16 19:25:40 +08:00
    @wodemyworld 你的系统是单向依赖还是双向依赖?如果是单向依赖,把“用户”当成资源,加上OAuth再做集成就OK了。
    seeker
        5
    seeker  
       2014-02-16 20:10:01 +08:00
    好问题!

    我在做的人力资本管理系统的薪酬模块,也是都用.
    数据库是一个数据库,应用程序靠自觉不update别人的表,但是可以join,比如一些基本的信息,用户名,用户信息,组织架构之类的.
    如果要更新别人的数据,调用别的模块的procedure,或者webservice.

    给楼主参考,不知道楼下盆友们是怎么做的。
    mactaew
        6
    mactaew  
       2014-02-16 21:22:21 +08:00 via Android
    @wodemyworld 两个模块对应操作的都是数据库的记录,为什么需要缓存呢?如果没有缓存的话,就是说所有模块对用户进行操作的时候都是对应操作同一条记录才对吧,应该没有一致性的问题的吧。不妨说说为什么要做缓存吧。
    wodemyworld
        7
    wodemyworld  
    OP
       2014-02-16 22:36:18 +08:00
    @mactaew 还是拿那个例子来说吧,如果采用api的形式,CM本身访问访问不到UM的表,只能通过api来获取,但获取到的用户信息需要保存到CM里做缓存,不可能是个请求就得去访问UM,如果那样的话性能很成问题,所以在CM方做缓存是有必要的
    wodemyworld
        8
    wodemyworld  
    OP
       2014-02-16 22:59:26 +08:00
    @seeker 恩,你属于第一种方式,目前也还是在探讨如果其他应用集成到公用模块上来的话,基于对方的“不可信”,不能贸然直接给对方访问自己的数据表(例如很多字段是保密性的内容,顶多给他个部分字段的view)。
    目前考虑引入共享的内存缓存了(如redis)。。。。

    @saharabear
    多数是单向,一方面用户作为资源,另一方面但资源改动,也会影响到对方应用;Oauth只是方式,问题是数据怎么存储能让性能不会有太大损耗
    saharabear
        9
    saharabear  
       2014-02-16 23:27:06 +08:00
    @wodemyworld 用共享内存缓存呗。
    mactaew
        10
    mactaew  
       2014-02-17 01:10:21 +08:00 via Android   1
    @wodemyworld 个人是认为一个企业的考勤系统对数据库的读写量应该不至于形成性能瓶颈的。如果真的有高并发读写的话,用内存级缓存就ok了。至于一致性问题,觉得可以是这样:用(带权限控制的)api来进行(缓存)数据读写,然后用定时守护进程(使用缓存数据)对数据库进行事务提交来更新数据。

    即由内存缓存,权限控制的api和时钟守护进程构成一个中间件来完成功能模块和数据库之间的沟通。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1081 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 22ms UTC 18:25 PVG 02:25 LAX 11:25 JFK 14:25
    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