问题描述
1.有个后台服务A,访问它需要一些用户信息(用户名,密码等)2.想提供一个新的服务B,把这些配置信息管理起来,以池的方式对外提供服务。比如,配置10组用户信息,客户端C请求B时,从池里取出一组用户信息访问后台服务A,访问后,释放配置信息到池中供其他客户端使用问题:B可能是以集群方式部署的,即有B1,B2等多台物理或逻辑机器,C每次请求可能到B1,也可能到B2,如何设计配置池满足这种需求方案:采用缓存服务器存储配置信息。目前项目中没用到缓存服务器,如果因为这个功能增加一个,感觉有点小题大做了。是否还有其他更简单的方法。
解决方案
1楼建议在上层增加BX服务,但还是没解决BX从B1/B2/B3……访问到的数据一致性问题。但是这种方式可以增加扩展性(即:如果后面你增加了缓存服务器,那么客户端C可能就要更改实现方式了,如果有了BX服务,那么只要更改BX访问缓存服务器即可)我的理解是这样的。1.配置池类似于无顺序的栈。(客户端C获取配置,就是出栈;客户端C释放配置,就是压栈,不过栈内数据是随机的)2.由于配置池是放在B中,而B是随时可能做集群横向扩展的(目前不想增加缓存服务,但是又需要保证集群所有节点的配置信息一致)不知道我的理解是否正确。如果是这样的话,可以考虑以下方式:配置池实现:配置信息存放到集合中,配置池提供一个门面接口,只要访问这个门面接口,该接口通过随机算法(如果有特殊的均衡性要求),从集合中取出一个配置(并且从集合中remove掉取出的配置)缓存实现:1.在B服务中增加支持集群部署的分布式缓存(不需要单独部署缓存服务),只要缓存数据做变更,会通过底层的组播通信自动同步到所有节点。这样不管客户端C访问哪一台server,每个server都返回相同的数据:可考虑jbosscache、ehcache(oscache也能做到)。优点:利用现有的应用,不需要单独部署缺点:由于每次缓存数据做变更,会通过udp组播(jgroup)或者是jms通知所有集群节点更新数据,对生产环境有影响(如果缓存数据更新较少,则影响忽略不计)。2.单独部署缓存服务器(你已经忽略了,暂时不考虑)
解决方案二:
看你的需求类似于的数据库连接池实现1、写一个配置信息的应用/服务 单独部署2、写一个配置信息获取的客户端,从应用/服务获取配置/释放配置,其他项目依赖3、这样如果性能不好 还可以再扩展 比如加缓存之类的 因为有客户端 这些细节可忽略
解决方案三:
好复杂的池啊。在B1、B2上层增加一个Web服务BX,所有获取配置信息的客户端C1、C2、C3,直接访问BX即可,具体在集群中选择哪个节点的工作交由BX去做,BX中还可以做一下缓存。