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

标签 java multithreading web-services client-server distributed-computing

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

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

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

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

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

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

最佳答案

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

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

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

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

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

关于java - 如何构建分布式 Java 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11335430/

相关文章:

java - 以线程安全方式创建对象

c++ - 通过 (Args&&...) 构造一个 std::thread

web-services - 消息总线和 MOM - 同样的事情?

c# - 调用线程无法访问此对象,因为另一个线程拥有它

excel - Alpha Vantage API Excel

javascript - Ajax 脚本管理器命名空间

java - 当消息因队列大小而被拒绝时,RabbitMQ 不会导致发送失败

java - 尝试使巨大的图像(与场景 View 相比)移动

java - 在 Firefox 中停止缓存

c# - ThreadStatic 和同步