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

13
首先,我有一个概念性的问题,"分布式"这个词只是指应用程序在多台机器上运行吗?还是说有其他方式可以将应用程序视为分布式(例如,如果有许多独立的模块在同一台机器上相互交互,这也算是分布式吗)。
其次,我想构建一个系统,执行四种类型的任务,会有多个客户端,每个客户端都有多个不同类型的任务需要定期运行。例如:今天客户1将拥有任务类型1,两天后他将获得任务类型2,可能会有客户2与客户1同时执行任务类型1。即需要并发处理。执行任务的配置将存储在数据库中,并且这些任务的结果也将存储在数据库中。客户端将使用Web浏览器(HTML页面)与系统进行交互(基本上是配置任务和查看结果)。我考虑使用Rest Webservice(使用JAX-RS),其中HTML页面将与之通信,后端使用线程进行并发执行。
问题:
1.听起来很简单,但我是否正在正确的方向上?或者我应该使用其他技术或概念,比如Java Beans?
2.如果我的方法是正确的,我是否需要使用像JSP这样的脚本语言,还是可以直接提交HTML表单到REST URL并获取结果(例如使用JSON)?
3.如果我想让应用程序分布式,是否可以使用我的想法?如果不行,我需要使用什么?
抱歉问题有点多,但我真的对此感到困惑。

你真的认为 task_type1task_type2 等任务会非常 CPU 密集吗?你已经进行了测试以确认吗?真的会有很多用户同时使用应用程序吗?也许单个服务器就可以很好地处理负载,分发应用程序只会使事情变得更加复杂,没有任何额外的好处。其次,不要假设你需要线程,因为“任务需要同时执行”。除非你需要利用多个 CPU,否则单个线程从工作队列中拉取任务可能就足够了。 - Alex D
@AlexD,这些任务本身并不需要大量的CPU资源,但如果我有很多客户和很多任务,这可能会成为未来的问题,因此我正在考虑未来的可扩展性。我现在假设一个服务器可以处理,但我想知道如何分布式处理,以防需要。也就是说,我想了解分布式概念。 - Sami
我认为重要的问题是:“你为什么需要一个分布式应用程序?” - Qnan
2
如果你不确定什么是“Java Beans”,那么你应该使用其他技术或概念,比如Java Beans。这听起来像是随意混合技术流行语。如果你试图编写一个分布式系统,那么你应该了解这些概念和技术。 - millimoose
@SyAu,是的,你可以这么说。 - Alex D
显示剩余9条评论
3个回答

10
我只想在已发布的答案中添加一点。请注意,由于我所构建的所有Web应用程序都仅在一个服务器上运行(除了部署到Heroku的应用程序可能会为您“分发”应用程序),因此请对我的评论持保留态度。
如果您觉得需要扩展应用程序以进行可伸缩性,则应首先考虑的不是Web服务、多线程、消息队列和企业JavaBean等技术。
首先要考虑的是应用程序本身以及应用程序将要执行的任务。哪些部分需要大量使用CPU?这些部分之间存在什么依赖关系?系统的各个部分是否自然地分解成并行进程?如果不是,你能否重新设计系统使其如此?重要提示:哪些数据需要在线程/进程之间共享(无论它们是在同一台机器上还是在不同的机器上运行)?
理想情况是每个并行线程/进程/服务器都可以获得自己的数据块并处理,而无需共享。更好的方案是使系统的某些部分无状态——无状态代码具有无限的可并行性(易于且自然)。在并行进程之间频繁地共享数据,应用程序的可扩展性就越低。在极端情况下,甚至可能从分发应用程序中得不到任何性能提升。(您可以在多线程代码中看到这一点——如果您的线程不断争夺同一个锁,使用多个线程/ CPU可能比使用一个线程/ CPU 还要慢。)
将要执行的任务的“概念”分解比实际用于分发应用程序的工具或技术更重要。如果您的概念分解良好,则即使从一个服务器开始,以后分发应用程序也会容易得多。

6
“分布式应用程序”一词意味着应用系统的部分功能将在不同的计算节点上执行(这些节点可能是不同机器上的不同CPU/核心或同一机器上的多个CPU/核心)。
对于如何构建系统,有许多不同的技术解决方案。由于您问及Java技术,例如,您可以使用Google的Web Toolkit构建Web应用程序,这将为您提供丰富的基于浏览器的客户端用户体验。对于系统中部署的服务器部分,您可以首先使用在servlet容器(如Tomcat)中运行的简单servlet。您的servlet将通过基于HTTP的远程过程调用从浏览器中调用。
稍后,如果遇到可扩展性问题,您可以开始将业务逻辑的部分迁移到EJB3组件,这些组件本身最终可以在应用服务器(例如Glassfish)上的许多计算节点上部署。我认为您无需处理此问题,直到遇到它。很难说是否会遇到,除非更了解客户要执行的任务性质。

5

回答你的第一个问题 - 你可以让表单直接提交到其余的URL。显然,这取决于你的具体要求。

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

如果你想要生成一个动态分布式应用程序,运行在多个低资源VM(例如Amazon EC2微实例)或物理硬件上,可以根据需求随时添加和删除它们,那么你可能希望考虑将其与Project Shoal集成,它是一个Java框架,允许应用程序节点进行集群,并在任何时候出现/消失。项目Shoal使用JXTA和JGroups作为底层通信协议。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接