如何管理数百个带有用户设置的配置文件 - 使用AppSettings还是其他方式?

3

我目前正在开发一个asp.net core (C#) Web API 项目。

每次调用Web API都会有一个唯一的密钥来帮助识别进行调用的用户。

每个调用者将与其关联的特定配置值集合相关联。我预计大约会有100到200个不同的用户将访问此Web API。我想尝试使用唯一密钥在一个配置文件中保存每个调用者的所有配置信息。我预计每个调用者在配置文件中会有约30到50个设置(某些情况下可能会达到100个设置)。

我的问题:是否使用AppSettings.json文件来保存这些值是一个好的方法,还是应该为每个调用者创建单独的配置JSON文件,并在需要时加载?效率是需要考虑的一个因素。


2
你为什么不使用数据库来保存用户数据呢?配置文件最适合用于应用程序配置,例如每个环境的配置,而不应该用于用户个人资料数据。 - Polyfun
应用程序存储/获取其他数据的位置在哪里?此外,设置的组合是否真的对每个用户都是唯一的,还是可以创建多个配置文件以在用户之间共享? - Bernard Vander Beken
通常应该避免在问题中使用“最佳”,因为有许多可行的解决方案,具有特定的优缺点。话虽如此,所提出的两种方法都不是我推荐的(或者说我不想维护的)。也许值得考虑从人工强加的二选一方法中退后一步。无论如何,考虑到拥有用户帐户和许多关于用户的设置或信息的网站:“大多数”都使用SQL或其他数据库模型。 - user2864740
设置有多大?每个用户1kb-100kb吗?只需在启动时加载一次字典,否则如果它们的大小更大,则需要使用缓存、NoSQL或RDBMS解决方案。祝好运! - Jeremy Thompson
感谢您的回复。目前我还没有考虑使用数据库,因为我不想增加额外的负担。但是阅读了评论后,我认为也许我应该退一步重新考虑解决方案。我的收获是配置方法并不是最实用的方法。 - Junaid Vindhani
2个回答

0
在给定的上下文中,客户端配置似乎是您解决方案的一部分。我强烈建议将配置移动到代码中,并将其处理为业务域的正常部分。
将此类内容保存在appsetting.json中看起来很危险(很容易为错误的客户端更改配置),并且难以维护。这也可能影响调试,因为开发和生产环境可能具有不同的配置文件集。
还有性能考虑。从磁盘读取大量文件并不是最好的选择。您可以将其缓存在内存中,但这会增加内存占用。

1
我学到的一个要点是,从磁盘中读取许多文件,例如图像文件系统,将优于数据库。特别是如果您有一个底部目录具有<512个文件的文件夹结构。数据库通常是数据文件,有两个文件,即事务提交到数据库文件或分区的日志/ Wal / Archive文件。建议缓存,例如Redis或MemCacheD,我认为这将是一个很好的解决方案。 - Jeremy Thompson
一个标准的数据库对于这种微不足道的负载来说,性能已经足够好了(缓存很棒)。LOG/WAL/锁等方面的问题在不进行更新时基本上是不相关的..即使有更新“降低性能”(这里不相关),使用数据库是关于有用信息管理,而不是缓存。当然,可能会针对不充分的架构编写糟糕的查询..反过来,也可能编写可怕的磁盘访问或分布式缓存访问代码。 - user2864740
@user2864740 确实,关于更新、清理和即时一致性与最终一致性的问题是非常重要的。 - Jeremy Thompson

0

我会考虑使用SQLite数据库而不是JSON文件。

对于100个用户和50个设置,使用数据库将更容易管理,并且可以防止在多线程情况下出现高并发期间的文件锁定。如果这些设置没有关系,则更好的选择是NoSQL数据库。

如果需要进行批量SELECT、UPDATE(应用程序升级的INSERT等),则管理分布在100到200个文件中的5000个设置将是一场噩梦。因此,如果需要进行批量SELECT、UPDATE(应用程序升级的INSERT等),则请考虑使用NoSQL或轻量级RDBMS。

由于性能差异几乎不可感知,因此最易于阅读、维护和构建的方法将是我的专业建议。


非常感谢您的回复。如果我将AppSetting用于所有配置,那么我是否仍需要考虑文件锁定?我认为作为过程的一部分,中间件将把配置值加载到内存中。 - Junaid Vindhani
通常,您会将应用程序范围的设置存储在 JSON 应用程序设置中,并且使用 Configuration.GetSetting 不会锁定它。我曾经使用文件做过这样的系统(让老板的母亲高兴了),但是遇到了大量问题,特别是安全问题。当出现争用时,文件锁定会发生,可以参考此链接:https://dev59.com/XnNA5IYBdhLWcg3wpvtg#11060322。 - Jeremy Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接