【发布时间】:2012-12-12 19:11:55
【问题描述】:
我们的应用程序和服务使用了很多配置,其中大部分当前是硬编码在 java 代码中并分布在很多类中。显然,这需要更改,我们希望将其集中在一个地方,并且应该由其中一项服务(例如 ConfigurationService)检索和公开,该服务还包含为其客户端缓存配置以获得更好的性能。我们还需要为长时间运行的应用程序动态重新加载配置并避免重新启动。我想获得一些我应该用于此目的的存储类型的 cmets -
数据种类 -
数据不需要结构化。它可以是一个简单的键值对,也可以是多键单值对。以下是一些随机配置示例 -
- “Client_Id”->“ABC”(简单键值)
- [“User_Type”:“Admin”,“Region”:“Mumbai”,“User_rating”:“9”] -> [“Commission”:“10%”](多键值)
- ["User_Id" -> "123"] -> ["WhitelistedRegions"->"Mumbai, Goa"](基于上下文的配置,值是一个列表)
存储解决方案 -
基本上,构成密钥的参数的集合和类型是不固定的,这给了我一个提示,即这种配置并不是真正结构化的。整个配置的体积不会很大。与读取相比,写入将非常少。
数据库 (RDBMS / NoSQL) - 使用数据库表的优势可能是它提供的安全性和备份。由于这看起来不像关系数据,因此我会考虑使用 NoSQL 解决方案。我个人并没有真正使用过它们中的任何一个,请告诉我哪一个更适合这种数据。由于可能有很多不同的键,我们应该能够选择精确的键(某种索引)。数据库使用会引入延迟,但可以构建有效的缓存来克服这个问题(因为不会对配置进行太多写入)。数据更容易查询。
文件(XML 或其他平面文件) - 我们可以使用文件保持简单。缓存也可以用于文件的情况。只要可以将整个配置导入内存 (RAM),这也是一个选项(必须实现选择性缓存失效)。文件提供版本控制,必须研究权限/安全性。如果 XML 文件变大,它们尤其会变得更加混乱。如果我们使用文件,数据可能不容易查询。
假设动态重新加载和缓存失效是分开实现的,哪个应该是更好的存储解决方案?这里还应该考虑哪些其他因素?
如果要使用文件来存储此类配置,那么对于此类用例,更好的文件格式是什么?
注意:我在 SO 上询问了 similar question,但可能没有像我应该的那样清楚地提出问题,因此创建了一个新问题,而不是进行大量编辑。
【问题讨论】:
-
一些问题:1) 您的“应用程序和服务”是否具有凝聚力,以至于拥有一个单一的配置服务才有意义? 2) 您的设计选择是否没有外部限制? 3) 谁来修改配置以及如何修改?
-
1) 我们使用带有 gwt RPC 的 GWT 应用程序,它与基于 spring 的后端服务(远程处理)进行通信,所以通常所有后端服务 API 都被 RPC 使用,我们可以在这里做类似的事情,有一个后端的配置服务并将其 API 暴露给 RPC。 2)除了我上面提到的,不是真的。此外,我们也可以灵活地考虑使用不同的数据存储,如 NoSQL(目前我个人认为这将是一种矫枉过正)。 3)目前,开发者和内部用户修改配置,但有一个前端应用来做是一个可行的选择。
标签: database configuration nosql storage