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
simoncos
V2EX  ›  Python

Python 功能点实现:数据热更新

  •  
  •   simoncos ·
    simoncos · 2019-01-16 21:33:43 +08:00 · 4856 次点击
    这是一个创建于 2167 天前的主题,其中的信息可能已经有所发展或是发生改变。

    文章在这里: https://www.jianshu.com/p/2d31f1c7ef63

    代码在这里: https://github.com/simoncos/practical-python/tree/master/features/hot-reloading

    关键词:热更新 | 热重载 | 定时更新 | 即时更新 | 缓存 | functools | cachetools | LRU | TTL

    发到这里主要也想问问有没有更好的方法来做这件事(比如是不是要怎样搞个调度 / 消息系统,或者自省?)

    第 1 条附言  ·  2019-01-17 09:59:15 +08:00
    特别是在多机器并行的环境
    第 2 条附言  ·  2019-01-17 10:04:16 +08:00
    在多机器并行的情况下,定时更新可能简单一些,但是对于即时更新来说,需要更新到每一台。之前听同事说可能需要一个消息队列再结合类似我这种实现应该可以确保更新的指令到每一台,不重复不遗漏。
    14 条回复    2019-01-18 10:20:30 +08:00
    yangsi
        1
    yangsi  
       2019-01-17 07:29:31 +08:00 via iPhone
    开一个线程专门做更新。更新线程里面是实时还是定时都可以自己控制。
    lihongjie0209
        2
    lihongjie0209  
       2019-01-17 08:48:38 +08:00
    zookeeper 配置中心
    simoncos
        3
    simoncos  
    OP
       2019-01-17 08:58:32 +08:00 via iPhone
    @yangsi 运算的线程如何 load 新数据?
    simoncos
        4
    simoncos  
    OP
       2019-01-17 08:59:59 +08:00 via iPhone
    @yangsi 啊算我没说,线程是共享内存的...但是并行下面就有点麻烦了是不?
    simoncos
        5
    simoncos  
    OP
       2019-01-17 09:02:46 +08:00 via iPhone
    @lihongjie0209 有没有什么参考?
    firebroo
        6
    firebroo  
       2019-01-17 09:05:55 +08:00 via Android
    @simoncos 多进程使用共享内存呀。。
    petelin
        7
    petelin  
       2019-01-17 09:23:25 +08:00 via iPhone
    我司方案,每秒从 s3 上把服务配置拉下来。
    另外学架构,解决方案不需要贴代码的。因为一段代码肯定解决不了,没啥意义。
    beforeuwait
        8
    beforeuwait  
       2019-01-17 09:32:19 +08:00
    需要热更新的配置写到 config.py
    然后 reload 就行了啊
    ctro15547
        9
    ctro15547  
       2019-01-17 09:47:39 +08:00
    redis
    simoncos
        10
    simoncos  
    OP
       2019-01-17 09:58:15 +08:00
    @petelin 贴代码是为了说清楚现在的做法咯
    simoncos
        11
    simoncos  
    OP
       2019-01-17 10:06:42 +08:00
    @ctro15547 也是缓存类的做法,定时应该还是可以的,即时麻烦一些。
    shoumu
        12
    shoumu  
       2019-01-17 10:30:39 +08:00   ❤️ 1
    更新很好做,但是保证更新过程中服务的可用,更新过程的数据一致性问题感觉楼主说得不足

    说一下我们现在使用的一些方案吧,主要分为配置更新和算法模型更新
    配置更新:
    1、zookeeper 配置中心,基于订阅的形式
    2、统一的字典服务,每次服务使用之前请求或者轮询请求

    模型更新:
    1、看模型大小情况,如果模型不大的话,用双指针的形式,单独开一个线程用于模型更新,更新完成之后指针切换,指针切换是原子操作,没有安全问题
    2、多进程服务,采用共享内存存储模型,由于模型过大,加上更新过程中这个模型可以忍受脏数据,所以就是直接往共享内存里写了。。。
    wind3110991
        13
    wind3110991  
       2019-01-17 10:59:09 +08:00   ❤️ 1
    楼主有造轮子精神值得点赞,这个做 demo 玩玩可以,生产环境不行,只能做一些简单的订阅更新功能,
    对于你所说的 “更新 python 对象数据”,我觉得要首先本着 CAP 原则,再分下面三种情况来设置业界的解决方案:
    ( 1 )更新配置文件:更新数据量较小,能容忍一定的时延,但是需要保证高可用—— zookeeper ;
    ( 2 )更新内存数据:数据量大,需要在多个进程间进行切换,短时间内(周期更新)对服务性能要求较高 —— redis ;
    ( 3 )更新数据频繁(实时更新):拆分为生成者消费者模型,用消息队列来解耦进程间的耦合度,如 Kafka、rocketMQ 等等。
    yangsi
        14
    yangsi  
       2019-01-18 10:20:30 +08:00 via iPhone
    @simoncos 多进程或者分布式应用不是自然就搞一个集中式的配置服务吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3119 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 13:15 · PVG 21:15 · LAX 05:15 · JFK 08:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.