如何构建分布式Java应用程序?

首先,我有一个概念性问题,“分布式”这个词是否仅仅意味着应用程序在多台机器上运行?或者还有其他方法可以将应用程序视为分布式(例如,如果有许多独立模块一起交互,但在同一台机器上,这是分布式的吗?)。

其次,我想建立一个执行四种类型的任务的系统,将有多个客户,每个客户将有每种类型的许多任务定期运行。例如:客户 1 今天将有task_type1,task_type2两天后依此类推,可能有客户 2 task_type1同时执行,就像客户 1 的task_type1一样。即需要并发。用于执行任务的配置将存储在数据库中,这些任务的结果也将存储在数据库中。客户将从Web浏览器(html页面)使用系统与系统进行交互(基本上,配置任务并查看结果)。我想过使用 rest Web 服务(使用 JAX-RS),其中 html 页面将与后端通信,并在后端使用线程进行并发执行。问题:

  1. 这听起来很简单,但我正朝着正确的方向前进吗?或者我应该使用其他技术或概念,例如Java Beans?

2.如果我的方法很好,我是否需要使用像JSP这样的脚本语言,或者我可以直接将html表单提交到其余的URL并得到结果(例如使用JSON)?

  1. 如果我想使应用程序分发,我的想法是否可行?如果不是,我需要使用什么?

很抱歉有很多问题,但我对此感到非常困惑。


答案 1

我只想在已经发布的答案中增加一点。请谨慎对待我的评论,因为我构建的所有Web应用程序都只在一台服务器上运行(除了部署到Heroku的应用程序,它可能会为您“分发”您的应用程序)。

如果您觉得您可能需要分发应用程序以实现可伸缩性,那么您应该考虑的第一件事不是Web服务和多线程以及消息队列以及Enterprise JavaBeans和...

首先要考虑的是应用程序域本身以及应用程序将要执行的操作。CPU 密集型部件将位于何处?这些部分之间有什么依赖关系?系统的各个部分是否自然地分解成并行过程?如果没有,你能重新设计系统来实现它吗?重要说明:哪些数据需要在线程/进程之间共享(无论它们是在相同还是不同的计算机上运行)?

理想的情况是,每个并行线程/进程/服务器都可以获取自己的数据块并对其进行处理,而无需共享。更好的是,如果系统的某些部分可以成为无状态的 - 无状态代码是无限并行化的(容易和自然地)。并行进程之间的数据共享越频繁且越细粒度,应用程序的可扩展性就越低。在极端情况下,您甚至可能不会从分发应用程序中获得任何性能提升。(你可以从多线程代码中看到这一点 - 如果你的线程不断争夺相同的锁,那么使用多个线程+CPU的程序甚至可能比使用一个线程+CPU的程序慢。

要完成的工作的概念分解比实际用于分发应用程序的工具或技术更重要。如果您的概念分解是好的,那么如果您只从一台服务器开始,那么以后分发应用程序将容易得多。


答案 2

术语“分布式应用程序”是指应用程序系统的各个部分将在不同的计算节点上执行(这些节点可能是不同机器上的不同CPU/内核,也可能是同一台机器上的多个CPU/内核之间的CPU/内核)。

对于如何构建系统的问题,有许多不同的技术解决方案。例如,由于您询问的是Java技术,因此您可以使用Google的Web Toolkit构建Web应用程序,这将为您提供基于浏览器的丰富客户端用户体验。对于系统中服务器部署的部分,您可以从使用在 servlet 容器(如 Tomcat)中运行的简单 servlet 开始。您的 servlet 将使用基于 HTTP 的远程过程调用从浏览器调用。

稍后,如果遇到可伸缩性问题,则可以开始将部分业务逻辑迁移到 EJB3 组件,这些组件本身最终可以部署在应用程序服务器上下文中的许多计算节点上,例如 Glassfish。我不认为你需要解决这个问题,直到你把它解决它。很难说您是否会不更多地了解客户将要执行的任务的性质。