首先,我有一个概念性问题,“分布式”一词是否仅表示应用程序在多台计算机上运行?或者还有其他方法可以将应用程序视为分布式(例如,如果有许多独立的模块在同一台机器上进行交互,那么这是分布式的吗?)。
其次,我想建立一个执行四种类型任务的系统,会有多个客户,每个客户都会定期运行每种类型的许多任务。例如:customer1今天将有task_type1,两天后会有task_type2,依此类推,可能会有customer2同时执行task_type1,如customer1的task_type1。即需要并发。执行任务的配置将存储在DB中,这些任务的结果也将存储在DB中。客户将使用Web浏览器(html页面)中的系统与系统交互(基本上,配置任务并查看结果)。 我想过使用一个休息webservice(使用JAX-RS),其中html页面将与后端通信并在后端使用线程进行并发执行。 问题:
2.如果我的方法很好,我是否需要使用像JSP这样的脚本语言,或者我可以直接将html表单提交给其他URL并获得结果(例如使用JSON)?
很抱歉有很多问题,但我对此感到很困惑。
答案 0 :(得分:7)
我只想在已发布的答案中添加一点。请稍等我的评论,因为我构建的所有Web应用程序都只在一台服务器上运行(除了部署到Heroku的应用程序,可能会为您“分发”您的应用程序。)
如果您认为可能需要分发应用程序以实现可伸缩性,那么您首先要考虑的是不 Web服务以及多线程和消息队列以及Enterprise JavaBeans和...
首先要考虑的是您的应用程序域本身以及应用程序将要执行的操作。 CPU密集型部件在哪里?这些部分之间有什么依赖关系?系统的各个部分是否会自然地分解为并行进程?如果没有,你能重新设计系统吗?重要提示:线程/进程之间需要共享哪些数据(无论它们是在相同还是不同的机器上运行)?
理想情况是每个并行线程/进程/服务器可以获得自己的数据块并在其上工作而无需共享。更好的是,如果系统的某些部分可以变为无状态 - 无状态代码可以无限可并行化(轻松自然)。并行进程之间更频繁和细粒度的数据共享,应用程序的可伸缩性越低。在极端情况下,您可能甚至无法通过分发应用程序来提高性能。 (您可以通过多线程代码看到这一点 - 如果您的线程经常争用相同的锁,那么您的程序甚至可能比使用一个线程+ CPU的多线程+ CPU更慢。)
要完成的工作的概念细分比实际用于分发应用程序的工具或技术更重要。如果您的概念分解是好的,那么如果您只使用一台服务器,那么稍后分发应用程序将会容易得多。
答案 1 :(得分:5)
术语“分布式应用程序”意味着应用程序系统的某些部分将在不同的计算节点上执行(可能是不同计算机上的不同CPU /核心,也可能是同一台计算机上的多个CPU /核心)。
关于如何构建系统的问题有许多不同的技术解决方案。因为您询问Java技术,所以您可以使用Google的Web Toolkit构建Web应用程序,这将为您提供丰富的基于浏览器的客户端用户体验。对于系统的服务器部署部分,您可以使用在诸如Tomcat之类的servlet容器中运行的简单servlet开始。将使用基于HTTP的远程过程调用从浏览器调用您的servlet。
稍后,如果遇到可伸缩性问题,您可以开始将部分业务逻辑迁移到EJB3组件,这些组件本身最终可以部署在应用程序服务器(如Glassfish)的上下文中的许多计算节点上。我认为你不需要解决这个问题,直到你运行它。很难说您是否会更多地了解客户将要执行的任务的性质。
答案 2 :(得分:4)
要回答您的第一个问题 - 您可以让表单直接提交给其他网址。显然,这完全取决于您的要求。
正如上面评论中提到的@AlexD,您并不总是需要分发应用程序,但是如果您希望这样做,您应该考虑查看JMS,这是一个消息传递API,可以允许你运行几乎任意数量的工作者应用程序机器,从消息队列中准备消息并处理它们。
如果您想生成动态分布式应用程序,运行多个资源不足的虚拟机(例如Amazon EC2 Micro实例)或物理硬件,可以随意添加和删除以应对需求,那么您我们可能希望考虑将它与Project Shoal集成,EJB是一个Java框架,允许集群应用程序节点,并让它们随时出现/消失。 Project Shoal使用JXTA和JGroups作为底层通信协议。
另一种方法可能是使用在应用程序服务器上运行的{{3}}来分发您的应用程序。