我们正在为我们的一个金融应用程序构建新的功能集。我们有自己的SQL服务器数据库,我们将调用多个返回JSON响应的RESTful API。例如,一些返回新闻数据,一些返回股票信息,一些返回财务数据和我们自己的sql服务器数据库包含员工数据。因此,它们都有自己不同的数据格式。我们正在构建的这个新应用程序将聚合所有这些数据,将其转换为有意义的网络显示,就像 mint.com 一样。
- Web 应用程序将显示基于这些数据的分析报告
- 将有一个选项可以通过各种模板下载报告
我们在后端和中间层的技术堆栈方面是完全开放的。我们首先想到的是像mongodb和elasticsearch这样的NoSQL搜索和报告。将在这些数据(从API存储或检索)之上构建一个Web应用程序,最有可能 Asp.net MVC中。
我们需要您的意见,特别是如果您有构建类似企业解决方案的经验。
你能分享一下你的看法吗,
- 你会为这个应用程序选择哪些好的技术堆栈?
- 当 API 数据格式发生变化时,现在和将来将如何扩展。
- 性能也很重要,因为数据将显示在 Web UI 上。
我们有一个与您提到的类似的设置,使用 ASP.Net MVC 和 ElasticSearch(用于关系数据的 SQL 服务器,定期更新 ES),聚合来自多个来源的数据 (XML/JSON),尽管目的是改进搜索和过滤结果而不是报告。但是,我希望您正在查看的场景也适合 ElasticSearch,具体取决于您的特定要求。
1)由于您已经在使用SQL Server(我希望对此很熟悉),因此我建议将其与ElasticSearch结合使用 - 就维护另一种技术和开发而言,额外的mongodb层似乎没有必要。有一个非常好的 C# 库(实际上是两个,ElasticSearch.Net 和 NEST,一起使用),它公开了大部分 ES 功能。
2) 我们选择 ElasticSearch 是因为它具有可扩展性、灵活性和易用性。您可能面临的挑战可能是将文档从 C# 类映射到 ElasticSearch 文档。从本质上讲,它的设置非常容易,但是您确实需要进行一些规划,以您想要搜索和检索数据的方式索引数据。因此,如果选择 ES 作为平台,请花一些时间了解文档的结构 - 默认情况下,dynamic mapping
已启用,因此您几乎可以将任何 JSON 放入文档中。但是,对于生产环境,最好将其关闭并设置一个或多个映射,以便能够以标准化方式查询它们。
3)性能对我们来说也是一个关键因素,这就是为什么我们在研究时要考虑基于Lucene的引擎,如Solr和ElasticSearch,以及NoSQL数据库。在大多数情况下,ElasticSearch 的性能比 SQL Server 高出 10 比 1 或更高。Solr与ElasticSearch的性能取决于场景,如果你用谷歌搜索它们,基准和比较是存在的。例外情况可能是,如果应该在一个查询中检索许多文档 - ES(或Lucene)不是为该用例制作的,它最好是快速检索每页较少的结果(类似于Google的每页结果计数)。如果每页/结果需要 1000 个文档,NoSQL 数据库可能是更好的选择。
ElasticSearch 可以快速启动和运行 - 将其安装在本地开发盒上并试用,您将了解它是否合适。
根据我的经验,mongodb 是报告的最糟糕选择,尤其是对于聚合。它缺乏良好的聚合功能,有一些数据类型冲突(例如小数存储为字符串,你不能在聚合框架 API 中使用它),并且在大多数情况下,您可能必须在 javascript 中维护 map-reduce 函数。
如果您的应用程序的真正性质只是报告,并且它们不必实时更新,我会放弃对外部 API 的按需 RPC 调用。我会考虑提前复制尽可能多的数据,并将其存储在最方便您使用的架构下,然后按照计划的预测间隔进行同步。
我不会急于假设这些数据一直可用,也不会总是以您期望的格式提供。您还可以通过运行自己的副本获得优化优势,以您想要的方式编制索引,而不是试图确定哪个 RPC 是您的瓶颈。
至于你的问题:
1)如果你不介意使用Python,我会在PostgresSQL数据库之上选择Django。Django是一个功能齐全的坚固的ORM + Web框架,非常适合此类工作。如果没有,只需坚持使用关系SQL数据库。我听说过卡桑德拉的奇迹,但还没有尝试过。
2 + 3)正如我之前提到的,为了自己的利益,尽可能多地复制数据。一切都在"内部"之后,您可以对其进行集群并自由调整。对繁重的客户端请求使用分布式缓存也是一个好主意(例如 REDIS),而不是每次都按需生成这些报告。
我一直在使用 Jasper 报表和 Jasper 报表服务器集成到我们的 Web 应用程序中。 Jasper 接受许多不同的数据源类型,包括 JSON 和 SQLServer。核心版本是免费的,允许您生产高度复杂的html和pdf报告。带有服务器的付费版本使您可以轻松地集成到Web应用程序中。核心是在tomcat/jboss上运行的Java spring(部分开源),您可以使用REST Web服务或Web前端的visualize.js库与之交互。它使用可以产生一些漂亮结果的高图表,并具有从许多报告构建的临时报告和仪表板选项。
在此处查看演示:http://www.jaspersoft.com/
这有一个假定的后端数据库和数据源堆栈,tomcat与Java Spring,Web前端HTML/Javascript。
该工具被包括亚马逊在内的许多大型企业使用,因此可扩展性应该不是问题。
如果数据的格式发生变化,则需要更改报告。这是由GUI使用所见即所得编辑的xml格式。