Java Vaadin Web应用程序,后端计算量大
我开发了一个java应用程序,它分析来自数据库的大量数据,这会导致相当长的计算时间,并生成我用图表库可视化的cvs文件 因此,为了避免在用户输入的java swing界面和浏览器中的可视化界面之间切换,我决定开发一个Vaadin应用程序,该应用程序使用现有代码作为后端,并提供输入和可视化界面 由于这是我第一次与Vaadin合作,我试图弄清楚我尝试做的事情中有多少是可行的,特别是因为耗时的计算肯定会产生会话超时 如果我使用轮询,那么考虑到许多用户可能同时使用午餐计算,服务器上的工作量会不会太大Java Vaadin Web应用程序,后端计算量大,java,akka,vaadin7,Java,Akka,Vaadin7,我开发了一个java应用程序,它分析来自数据库的大量数据,这会导致相当长的计算时间,并生成我用图表库可视化的cvs文件 因此,为了避免在用户输入的java swing界面和浏览器中的可视化界面之间切换,我决定开发一个Vaadin应用程序,该应用程序使用现有代码作为后端,并提供输入和可视化界面 由于这是我第一次与Vaadin合作,我试图弄清楚我尝试做的事情中有多少是可行的,特别是因为耗时的计算肯定会产生会话超时 如果我使用轮询,那么考虑到许多用户可能同时使用午餐计算,服务器上的工作量会不会太大 我
我应该提到的另一件事是,我在现有应用程序中使用actors,有没有一种方法可以将它用于类似推送的行为,以便在工作完成时发送通知?是的,您的项目可能非常适合应用程序 可伸缩性 可伸缩性可能是Vaadin的一个问题,因为您的整个应用程序都位于服务器上,而客户端上只有UI小部件的表示。所有业务逻辑和数据结构都位于服务器上,而不是客户端。因此,Vaadin应用程序可能会消耗服务器上的内存和CPU使用量 尽可能在服务器上缓存结果,并在用户会话之间共享数据。大多数UI小部件都不能共享,因为它们的状态是每个用户都会更改的。但您可以共享您的支持数据 请参阅这两篇关于Vaadin中可伸缩性的参考资料。瓦丁当然可以扩大规模。Vaadin公司已经对11000名客户同时进行了模拟。见:
- (公司博客帖子)
- 阿伦·古普塔(视频演示,YouTube)
getUI().access(
new Runnable() {
@Override
public void run() {
// Update widgets here.
// Change Label text, TextField contents, and so on.
// Show results of your computation (interim or final).
}
}
); // Or use Lambda syntax in Java 8.
您肯定希望避免在用户的UI线程中进行那些长时间的计算。至少,它会锁定用户界面,导致用户沮丧,并可能认为应用程序已经崩溃。在最坏的情况下,会话可能会像您提到的那样超时。与Swing一样,解决方案是在后台线程上完成繁忙的工作,然后安排在用户界面上完成更新
纺车
如果在计算完成之前,你的应用程序没有其他用处,那么你可以显示一个旋转轮指示器。在“不确定”模式下使用小部件。请参阅,单击齿轮图标以检查“样本”选项卡上的“不确定”模式。使用“主题”选项卡查看Valo和驯鹿主题的每个不同轮子样式
如果可以将计算进度量化为介于0.0f和1.0f之间的数字,则可以使用禁用“不确定”属性的进度条
推
在Vaadin 7中,使用线程进行后台处理比以往任何时候都容易。现在内置于瓦丁
见《瓦丁书》
如果没有推送,用户界面的更新只会在用户点击按钮等操作后发送到浏览器(除非你耍了一些花招)
在vaadin7中,只需将@Push
注释添加到主类中。然后,绑定的库接管。Atmosphere负责自动尝试连接以交付更新。如果WebSockets不可用,则会采用轮询等其他方法
Atmosphere是一个非常成功的项目,用于许多产品。因此,在大多数情况下,它工作得非常好。请注意,Push,尤其是WebSocket是一项相对较新的技术,在规格、实现、服务器和浏览器方面都有很多变化。这条新路可能会有些颠簸
Push的工作示例
我已经提供了两个使用Push和Vaadin的完整示例项目的源代码。看一个简单的例子。请参阅此以了解更多深度
投票
关于你的具体问题:
如果我使用轮询,考虑到许多用户可能同时启动计算,服务器上的工作量会不会太大
在中国,网络上一直在使用各种各样的工具。我想象你现在正在看到它(如果使用web浏览器),StackOverflow更新你的“最近收件箱消息”和“最近成就”标记在本页顶部
根据定义,轮询是低效的。浏览器将对服务器进行调用,但如果服务器上还没有生成新数据,这些调用通常是徒劳的。而且建立连接的成本相对较高
但管理费用和开支并不是无谓的。投票是有效的,可能每天在互联网上进行数十亿次
到达后,这些呼叫将以更少的开销变得更高效
最佳解决方案是服务器在新数据准备就绪时通知客户端。这就是WebSocket技术存在的理由,浏览器和服务器保持开放的实时网络连接,以允许在任何时候进行双向通信。如上所述,Atmosphere库会自动尝试WebSocket,并在需要时返回轮询
所以,对您的问题的答案是“不,服务器的工作量不太大”。轮询是一种实用的解决方案,常用于使web客户端保持服务器端事件的最新状态
更新用户界面
我对演员不在行
更新: