对于我需要为我的应用程序做出的设计选择,我陷入了两难境地。
我的应用程序涉及用户选择一个域名进行竞价。有效域名存储在文件中,用户应仅从该列表中选择域名。
关于包含有效域名的文件的几点:
选项1:每天读取文件并将其上传到Mongo集合。当用户键入域名时,系统会根据集合中的记录对其进行验证。 问题:会对集合执行很多操作(读、写、更新)。由于集合托管在云端,因此会导致高昂的成本。
选项2:不上传到Mongo集合,而是在用户输入域名时读取文件以验证名称。 问题:如果多个用户使用该应用程序,可能会导致性能问题。
各位,可以帮我一下吗?
另外,我对 Nosql 数据库还很陌生。
谢谢
编辑1:我找不到如何上传文件。因此,该对象在文件中的外观如下(文件中将有 560K 个此类对象):
{
"domainName": "VETERANFAMILYHOME.COM",
"link": "https://auctions.godaddy.com/trpItemListing.aspx?miid=547130809&isc=json_expiring",
"auctionType": "Bid",
"auctionEndTime": "2024-03-26T18:19:00",
"price": "$25",
"numberOfBids": 0,
"domainAge": 3,
"pageviews": 2,
"valuation": "$1,156",
"monthlyParkingRevenue": "$0",
"isAdult": false
}
这种设计选择很大程度上取决于应用程序的具体要求,包括性能、成本、可扩展性以及数据的最新程度。让我们评估这两个选项的优缺点。
选项 1:上传到 MongoDB 集合
优点:
查询性能:从 MongoDB 集合中读取数据速度很快,尤其是在建立适当的索引的情况下。它可以有效地处理并发读取请求。 数据管理:数据集的更新可以自动化,MongoDB提供了很好的更新文档的机制。 可扩展性:随着应用程序的增长,MongoDB 可以处理更大量的数据和更复杂的查询。
缺点:
成本:持续执行读取、写入和更新操作的成本可能很高,特别是如果托管在按操作收费的云提供商上。 数据新鲜度:根据更新机制,FTP 更新和数据库更新之间可能存在延迟。
选项 2:从文件中读取
优点:
成本效益:没有与数据库操作相关的成本。 简单:逻辑很简单 - 只需从文件中读取并检查域是否存在。 缺点:
并发访问:处理多个并发读取可能会出现问题,并可能导致性能瓶颈。 内存使用:将大文件加载到内存中的成本可能很高,特别是当应用程序在有限的资源上运行时。 数据新鲜度:数据与上次下载一样新鲜,系统需要确保文件始终是最新的。
混合方法
考虑到这两种方法的权衡,混合解决方案可能会在性能和成本之间提供平衡:
每日导入: 自动执行每日导入过程,从 FTP 服务器获取文件并更新 MongoDB 集合。
缓存:实现缓存层(例如Redis),临时存储频繁的域名查询,以最大程度地减少数据库读取。
批量操作:使用批量操作进行更新,以最大限度地减少与多个写入操作相关的成本。
索引:确保domainName字段被索引以加快读取操作。
增量更新:如果可能,仅更新更改的记录而不是整个数据集。
其他注意事项
异步更新:应用程序可以在新数据的同时处理前一天数据的域验证请求 正在处理和上传中。
监控和指标:监控数据库操作的性能和成本,以根据需要调整策略。
故障转移策略:实施故障转移策略,在数据库因某种原因不可用时直接使用文件。
最终,最好的方法取决于实时验证对最新数据的重要性以及您期望并发用户的负载有多大。如果成本是一个主要问题,并且域列表在一天内不会频繁更改,那么从文件中读取可能就足够了,特别是如果您可以缓存常用查询。如果数据频繁变化并且性能至关重要,那么使用带有缓存层的 MongoDB 可能是更好的方法。
在采用一种方法之前,始终首先分析每种方法的实际性能和成本影响,并在部署后保持监控,以确保它继续满足您的需求。