我们有使用大量配置的应用程序和服务,其中大部分目前都是在java代码中硬编码的,并且分布在很多类中。显然,这种情况需要改变,我们希望将其集中在一个地方,并由其中一个服务(例如ConfigurationService)检索和公开该服务,该服务还将缓存配置用于其客户端以获得更好的性能。我们还需要为长期运行的应用程序动态重新加载配置,并避免重新启动。我想得到一些关于我应该用于这个目的的存储类型的评论-
某种数据-
数据不需要结构化。它可以是一个简单的键值对,也可以是多键、单值对.以下是一些随机配置的例子-
存储解决方案-
基本上,构成键的参数集和类型不是固定的,这给了我一个提示,即这个配置不是真正结构化的。整个配置的体积不会很大。与读取相比,写的内容将非常少。
假设动态重新加载和缓存失效分别实现,哪一种应该是更好的存储方案?这里还应考虑哪些其他因素?
如果要使用文件来存储这种配置,那么更好的用例文件格式是什么?
注意:我问了一个相似问题,但可能没有像我应该的那样清楚地提出这个问题,所以创建了一个新的问题,而不是做大量的编辑。
发布于 2012-12-27 19:23:25
发布于 2012-12-13 22:24:02
您提供的示例表明您可能需要某种规则引擎。为了说明我的意思,我将您的示例解释为具有以下语义:
if (true) {
Client_Id = "ABC";
}
if (User_Type == "Admin" && Region == "Mumbai" && "User_rating" == "9") {
Commission = "10%";
}
if (User_Id == "123") {
WhitelistedRegions" = ["Mumbai", "Goa"];
}如果我的解释是错误的,那么也许你可以修改你的问题来澄清你的意图。另一方面,如果我的解释是正确的,那么我就不知道为您的需求量身定制的任何特定配置语法。相反,我怀疑您将不得不将所需内容的语义扩展到您决定使用的任何配置语法的约束中。
我可以尝试将您的示例理解为*的语法(免责声明:我是它的主要开发人员),方法如下:
uid-rule {
# unconditional
client_Id = "ABC";
}
uid-rule {
condition {
User_Type = "Admin";
Region = "Mumbai";
User_rating = "9";
}
Commission = "10%%";
}
uid-rule {
condition { User_Id = "123"; }
WhitelistedRegions = ["Mumbai", "Goa"];
}我建议您阅读Config4*入门手册(HTML,PDF格式)的第2章,以便您能够理解上面示例中使用的语法。
我最初尝试将示例添加到XML语法中是:
<rules>
<rule>
<property name="client_Id" value="ABC"/>
</rule>
<rule>
<condition name="User_Type" value="Admin"/>
<condition name="Region" value="Mumbai"/>
<condition name="User_rating" value="9"/>
<property name="Commission" value="10%"/>
</rule>
<rule>
<condition name="User_Id" value="123"/>
<property name="WhitelistedRegions" value="Mumbai, Goa"/>
</rule>
</rules>请注意,无论是Config4*解析器还是XML解析器都不会给出您想要的语义。相反,您应该编写一个名为RulesEngine的类。这样的类将:(1)解析配置文件以获取规则并将解析的表示缓存在内存中;(2)为查询内存中的规则集提供一个简单的API;(3)提供重新解析配置文件的reloadConfiguration()方法。您的应用程序将以某种方式触发reloadConfiguration()方法的调用(例如,每隔几分钟一次)。
如果您在配置语法中使用XML,那么我建议您通过将XML文件存储在web服务器上来实现您的集中化目标。XML解析器可以在那里检索文件表单。如果使用Config4*语法,那么Config4*与curl的集成就可以做同样的事情。
发布于 2012-12-25 10:21:11
有不同的方法来看待这种情况。
https://stackoverflow.com/questions/13846917
复制相似问题