13

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

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

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

2.如果我的方法没问题,我是否需要使用 JSP 之类的脚本语言,或者我可以直接将 html 表单提交到其余 url 并获取结果(例如使用 JSON)?

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

很抱歉有很多问题,但我真的很困惑。

4

3 回答 3

9

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

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

首先要考虑的是您的应用程序域本身以及应用程序将要做什么。CPU密集型部分将在哪里?这些部分之间有什么依赖关系?系统的各个部分是否会自然分解为并行进程?如果没有,你能重新设计系统来做到这一点吗?重要提示:需要在线程/进程之间共享哪些数据(无论它们是在同一台机器上还是在不同机器上运行)?

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

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

于 2012-07-05T08:51:37.040 回答
5

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

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

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

于 2012-07-05T03:08:27.473 回答
4

要回答您的第一个问题 - 您可以让表单直接提交到其余网址。显然,这完全取决于您的要求。

正如上面评论中提到的@AlexD,您并不总是需要分发应用程序,但是如果您希望这样做,您可能应该考虑查看JMS,它是一个消息传递 API,它可以让您运行几乎任何工作应用程序机器的数量,从消息队列中准备好消息并处理它们。

如果您想生成一个动态分布式应用程序,例如在多个资源匮乏的虚拟机(例如 Amazon EC2 微型实例)或物理硬件上运行,可以随意添加和删除以应对需求,那么您可能希望考虑将其与Project Shoal集成,后者是一个 Java 框架,允许应用程序节点的集群,并让它们随时出现/消失。Project Shoal 使用 JXTA 和 JGroups 作为底层通信协议。

另一种方法是使用在应用服务器上运行的EJB分发您的应用程序。

于 2012-07-05T03:17:05.243 回答