【发布时间】:2011-07-22 00:03:25
【问题描述】:
我必须重新设计一个现有应用程序,该应用程序在后端使用 Pylons (Python),在前端使用 GWT。
在重新设计的过程中,我还可以更改后端系统。
我试图了解各种后端系统(Java、Python 等)的优缺点,但我会感谢社区的一些反馈。
现有应用程序:
现有应用程序是使用 GWT 1.5 开发的(现在在 2.1 上运行)并且是多主机页面设置。
Pylons MVC 框架定义了一组控制器/主机页面,其中嵌入了 GWT 小部件(“经典网站”)。
数据存储在 MySQL 数据库中,并由后端使用 SQLAlchemy/Elixir 访问。服务器/客户端通信使用 RequestBuilder (JSON) 完成。
该应用程序不是具有复杂 CRUD 功能(事务、锁定等)或复杂权限系统(需要一个简单的 ACL)的典型业务应用程序。
该应用程序用于科学数据的可视化(图表、表格)。客户端界面主要用于以只读模式显示数据。可能有一些 CRUD 功能,但这不是应用程序的主要方面。
只有一部分科学数据将被传输到客户端界面,但该子集是从大型数据集生成的。
现有的后端使用 numpy/scipy 从 db/files 读取数据,创建矩阵并过滤它们。
访问或使用应用程序的用户数量相对较少,但每个用户/请求的后端负担相当高,因为它必须读取和过滤大型数据集。
对新系统的要求:
我想从多主机页面设置转移到 MVP 架构(一个单一主机页面)。
所以后端只服务一个主机页面,并作为 AJAX 调用的数据源。
数据仍将存储在关系数据库中(PostgreSQL 而不是 MySQL)。
会有一个简单的 ACL(定义谁可以看到什么样的数据),也许还有一些 CRUD 功能(但这不是优先事项)。
数据集的大小将会增加,因此后端的负担可能会更高。不会有很多并发请求,但少数几个必须由后端快速处理。后端服务器的硬件(RAM 和 CPU)不是问题。
可能的后端解决方案:
Python(SQLAlchemy、Pylons 或 Django):
优点:
- 快速原型制作。
- 重复使用现有应用程序的部分内容
- 用于处理大型数据集的 Numpy/Scipy。
缺点:
- 弱类型语言 -> 调试会很痛苦
- 服务器/客户端通信(JSON 解析或使用 3rd 方库)。
- Python GIL -> 通过并发请求进行扩展?
- 服务器语言 (python) 客户端语言 (java)
Java(Hibernate/JPA、Spring 等)
优点:
- 客户端和服务器都使用一种语言 (Java)
- “更容易”调试。
- 服务器/客户端通信(RequestFactory、RPC)更易于实现。
- 性能、多线程等
- 可以传输对象图(RequestFactory)。
- CRUD“易于”实现
- Multitear 架构(功能)
缺点:
- Multitear 架构(复杂,需要大量配置)
- 数组/矩阵的处理(不确定java中是否有numpy/scipy的挂件)。
- 并未使用 Java Web 应用程序层/框架的所有功能(矫枉过正?)。
我没有提到任何其他后端系统(RoR 等),因为我认为这两个系统对于我的用例来说是最可行的。 老实说,我对 Java 并不陌生,但对 Java Web 应用程序框架相对较新。我知道 Pylons 的使用方法,但在新设置中不会使用太多 Pylons 功能(MVC、模板),因为它可能仅用作 AJAX 后端。
如果我使用 Java 后端,我必须决定是使用 RESTful 服务(并将客户端与服务器明确分开)还是使用 RequestFactory(更紧密的耦合)。 “RESTful”没有具体要求。如果是 Python 后端,我可能会使用 RESTful 后端(因为无论如何我都必须处理客户端/服务器通信)。
虽然将主要显示科学数据(不是任何域对象图的一部分),但相关元数据也将显示在客户端上(这将有利于 RequestFactory)。
在 python 的情况下,我可以重用用于加载和过滤科学数据的代码。
如果是 Java,我将不得不重新实现这部分。
两种后端系统都有其优点和缺点。
如果您有任何进一步的反馈,我将不胜感激。
也许有人在后端和/或该用例方面都有经验。
提前致谢
【问题讨论】:
标签: java python gwt architecture web-frameworks