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