关于过进程的配置管理

需求:

程序中的配置,怎么能够实时更新。
其实我想解决的是业务配置的管理,可是想一想,无论业务配置还是服务的配置,
其本质也还都配置的管理,可以参考服务发现那套逻辑。

目前服务发现更多采用的是分布式k/v,直接用redis还是少数,这里只是简单列举思路

方案

  1. 对外暴露一个接口,用于刷新配置
  2. 定时加载配置到服务中
  3. 每次接口调用都实时去加载配置

各方案优缺点

  1. 对外暴露一个接口,用于刷新配置

    本质上就是进程间通讯


    缺点:

    • 稍微麻烦:要写接口,还要让对方调用,如果有多个进程,需要多次调用。


      优点:

    • 实时性强
    • 对业务系统的消耗最低
  2. 定时加载配置到服务中

    缺点:

    • 需要等待刷新的时间,配置人员要等待,不具备实时性
    • 无法很好的把控程序刷新时机,如果要同时改多个配置,可能会有配置改到一半就被刷新的风险


      优点:

    • 开发时省事
  3. 每次接口调用都实时去加载配置

    缺点:

    • 对业务系统的消耗较高


      优点:

    • 简单,但是配置多或访问量大的情况不适合

      优化:

    • 数据量大的情况:将配置更新时间存在redis中,每次访问redis,和本地的更新时间做比较,不一致则更新。
    • 数据量小的情况:将配置存在redis中,做比较,不一致则更新。
    • 并发量较大:加上内存过期机制,若实时性较高,可以只保存2-3秒;还是采用多级缓存的思路。

以往的方案

采用第一种。
用的twisted或tornado异步处理请求,每个进程分别对应两个端口,分别对内和对外提供服务。
对内服务主要用于刷新配置和设置临时变量。
如果要刷新配置,只要调用对应的内部端口即可。

新的问题

目前团队用的flask,采用wsgi管理多个进程,而多个进程的端口都是同一个。
怎么样才能让所有的进程都同步到最新的配置呢?

目前的结论

  • 方案2是个坑;flask 可以用方案3;并发量特别大的时候,采用方案1。
  • 方案1要实现同一端口的多进程调用,只能对wsgi再封装,如非必要,先放弃。

参考

坚持原创技术分享,您的支持将鼓励我继续创作!