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 · 3579 次点击
    这是一个创建于 3938 天前的主题,其中的信息可能已经有所发展或是发生改变。
    例如两个应用,一个用户管理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   ·   实用小工具   ·   2791 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 15:35 · PVG 23:35 · LAX 07:35 · JFK 10:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.