我们有使用大量配置的应用程序和服务,其中大部分当前是硬编码在 java 代码中并分布在很多类中。显然,这需要更改,我们希望将其集中在一个地方,并且应该由其中一项服务(例如 ConfigurationService)检索和公开,该服务还包含为其客户端缓存配置以获得更好的性能。我们还需要为长时间运行的应用程序动态重新加载配置并避免重新启动。我想就我应该为此目的使用的存储类型发表一些评论 -
数据类型 -
数据不需要结构化。它可以是一个简单的键值对,也可以是多键单值对。以下是一些随机配置示例 -
- “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 上问了一个类似的问题,但可能没有像我应该的那样清楚地提出问题,所以创建了一个新问题,而不是进行大量编辑。