问题描述
在OpenShift上有一个系统,其中包括5个源数据存储(主要是PostgreSQL数据库)。用户希望将所有这些数据源连接到在OpenShift上运行的容器:一个包含React应用程序库,其组件通过AJAX请求从运行在OpenShift上的薄服务器实例获取数据源。
用户已经做了以下准备工作:
1. 创建了一个测试服务器(使用Flask和flask_restful
、sqlalchemy
),直接连接到其中一个数据存储,并能够返回所请求数据库中任何表的REST JSON响应。
2. 创建了一个包含两个React组件(D3.js可视化和数据表格)的Node.js应用程序,这些组件在挂载/更新时,会消耗来自数据库表的JSON响应。
在生产系统中,用户的计划是:
1. 添加GraphQL以避免当前正在执行的过度获取。
2. 将服务器与Redis数据缓存连接,以减少对数据存储的需求。
用户的问题:
由于一些来自数据存储的数据可能较大(>1M记录),在OpenShift上如何以最优的方式实现这一目标?
1. 我应该使用Node.js重新编写我的服务器(我的想法是JavaScript对JSON“本地”,所以处理速度更快?)。
2. 我已经在研究BSON和msgpack,但我不清楚这些是否能够与React组件很好地配合使用?
3. 是否存在一种情况,可以选择在OpenShift应用程序之间传递数据,而不是发送大型JSON响应对象?
解决方案
请注意以下操作可能涉及版本差异,建议在操作前做好备份。
优化JSON响应
在OpenShift上实现快速JSON响应,需要综合考虑多个因素,包括服务器性能、网络延迟和前端处理能力。以下是一些建议的优化方案:
使用合适的编程语言和框架:考虑服务器的性能,选择合适的编程语言和框架。Node.js可以处理高并发的IO操作,但对于CPU密集型操作,可能不如其他语言。Flask等轻量级框架也可以考虑,但要根据具体情况进行选择。
分页和懒加载:如果从数据存储获取的数据较大,可以考虑实现分页机制,只返回所需的部分数据,减少单次请求的数据量。另外,对于前端展示的数据,可以使用懒加载策略,仅在需要时获取数据。
压缩和缓存:在服务器端启用压缩功能,如Gzip,可以减小传输数据的大小,加快响应速度。另外,考虑在服务器和客户端之间使用适当的缓存机制,减少重复请求。
是否重新编写服务器
关于是否重新编写服务器,由于你已经使用Flask和SQLAlchemy创建了测试服务器,这取决于多个因素:
性能需求:如果对于大规模数据响应,服务器性能是关键因素,可以考虑使用性能较高的框架。Node.js在处理高并发IO操作方面表现良好。
开发成本:重新编写服务器可能需要一定的开发工作量,需要评估重写的成本和收益。
现有功能:你已经在Flask中实现了一些功能,如果这些功能在新的服务器中仍然需要,需要确保新的服务器也能提供相应的功能。
BSON和Msgpack的使用
BSON和Msgpack是一种数据序列化格式,用于将数据在网络传输中进行编码。它们可以有效地减小数据大小,但需要在前后端进行支持。
BSON:BSON(Binary JSON)是一种二进制JSON格式,它可以减小数据大小并提高解析速度。如果你的前端React组件支持解析BSON格式,可以考虑在服务器和前端之间使用BSON格式进行数据传输。
Msgpack:Msgpack是一种轻量级的二进制数据序列化格式,可以有效地压缩数据。你需要确保你的前端组件能够解析Msgpack格式的数据。
传递数据而不发送大型JSON响应
如果你希望在OpenShift应用程序之间传递数据而不发送大型JSON响应对象,可以考虑以下策略:
消息队列:使用消息队列(如RabbitMQ、Apache Kafka等)来传递数据。数据产生方将数据发送到消息队列,数据接收方从消息队列中获取数据。这种方式可以实现异步数据传输,减少直接的HTTP请求。
API调用:如果你的应用程序之间有共享的API,可以直接调用API来获取所需的数据,而不是发送大型JSON响应。这可以减少数据在网络中的传输。
综合考虑以上因素,根据你的具体需求和现有技术栈来选择最适合的优化和传输策略。同时,确保前端组件对所选择的数据格式有支持。