实现一个支持运行时并发修改配置生效的Configuration类

可配置性是一个好的应用程序的重要指标。我们常常需要实现类似能够运行时修改配置的功能。最近在开发一个中间层的服务程序,最终发布的方式是把代码打成jar包交给调用方使用。这个中间层服务需要一些配置信息,考虑了一下有几个基本的需求:

1. 在ja包中提供一个service-defalut.properties配置文件来提供全部的默认配置。这样的好处是尽量减少对调用方的侵入。调用方可以不提供额外的配置。

2. 调用方也可以提供一个service-site.properties配置文件来提供自定义的配置信息,可以覆盖默认配置

3. 在分布式系统中,希望提供一个在集群中全局可见的配置信息,比如可以在ZooKeeper中设置配置信息

4. 支持并发环境下运行时修改配置,并且可以立刻生效

5. 高性能访问配置信息


之前看过Hadoop的代码,Hadoop的org.apache.hadoop.conf.Configuration实现了1,2,4项需求,但是它访问配置信息的性能不高,原因是为了支持并发访问,对读写配置都采用了加锁的方式,锁的粒度是方法级的,会影响并发的性能。


大致说一下org.apache.hadoop.conf.Configuration的实现

1. 采用Properties来存储K-V的配置信息

2. 采用CopyOnWriteArrayList来保存默认的配置文件列表

3. 采用ArrayList来保存自定义的配置文件列表

4. 对上述3个共享对象的访问都采用了加锁的方式来访问,保证并发情况下的正确性


public class Configuration implements Iterable<Map.Entry<String,String>>,
                                      Writable {
      private ArrayList<Object> resources = new ArrayList<Object>();
      
      private static final CopyOnWriteArrayList<String> defaultResources =
    new CopyOnWriteArrayList<String>();
    
      private Properties properties;

       public static synchronized void addDefaultResource(String name) {
    if(!defaultResources.contains(name)) {
      defaultResources.add(name);
      for(Configuration conf : REGISTRY.keySet()) {
        if(conf.loadDefaults) {
          conf.reloadConfiguration();
        }
      }
    }
  }

      public synchronized void reloadConfiguration() {
    properties = null;                            // trigger reload
    finalParameters.clear();                      // clear site-limits
  }
  
  private synchronized void addResourceObject(Object resource) {
    resources.add(resource)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值