【问题标题】:How to design an enterprise application with many independent processes?如何设计具有多个独立进程的企业应用程序?
【发布时间】:2013-08-10 04:30:22
【问题描述】:

我应该如何设计一个由众多(但相同)独立进程组成的应用程序,这些进程需要将数据传送到企业应用程序并通过 Web 界面进行监控和访问?

这是一个更具体的 Java 示例:

  1. 独立进程是独立 J2SE 应用程序的多个实例,它接收有关“用户”实体的初始化数据,然后开始执行有关此“用户”的操作(这是一个无限进程,因此任何批处理设计在这里是错误的,同样,这些过程的开始时间是无关紧要的)

  2. 企业应用程序是一组 J2EE bean 和 Web 服务,它们实现业务逻辑、数据库访问等,并且(例如)托管在 GlassFish 上。

  3. Web 前端是一组与 bean 一起工作的 JSP(可能也在 GlassFish 上)。

现在理想情况下,我希望 (1) 中的进程能够从 (2) 中的 bean 调用方法,但 让 (2) 中的 bean 能够并更新有关事物的流程 (1)。

所以这些是所需的执行流程,假设有 10 个独立的进程(1)为 10 个不同的用户运行(考虑一个“用户”,可以通过一个数字轻松识别):

  • 在 (1) 的一个过程中发生了一些事情,它们使用一些数据从企业应用程序 (2) 调用一个方法。
  • 其中一个真实的人类用户(已由 Web 应用程序识别)单击 (3) 的网页上的某些内容,这会调用 (2) 中的方法,然后是一些“神奇”实体 (我不知道如何命名)从 (1) 中找到负责此特定用户的独立进程,并使用一些新数据更新该进程。

到目前为止,我最好的方法是通过 JMX 公开这些 J2SE 应用程序并从那里开始,但我有一件我不明白的事情 - 谁或什么应该持有“流程在URI X 负责用户 Y”,然后相应地引导调用。

顺便说一句,请随时在 Java 平台 (!) 之外提供任何建议,只要它是一个可以轻松扩展的平台。

编辑: 另外,有没有办法在某些应用服务器上“托管”这样的独立进程?如果它们失败会重新生成进程,允许在远程机器上部署和监控这些进程等?

【问题讨论】:

  • 你不能使用 JMS 吗?当有人从管理 GUI 中单击时,将发布一条包含用户 ID 的消息。客户端将侦听消息,如果 id 与他们有关,则他们可以采取行动。还是比这更复杂?
  • 这是一个简单的好建议!但是,这确实会产生相当多的开销,因为从企业应用程序 (2) 到流程 (1) 的更新可能非常大。但也许如果发送的消息只是“用户#8 已更改”,然后与用户#8 相关的进程提取来自 (2) 的完整数据,这可能会起作用。你怎么看?除了可行性之外,一个主要问题是该解决方案的扩展,请评论您对此事的看法。

标签: java jakarta-ee design-patterns architecture jmx


【解决方案1】:

自从我过去使用 Java 消息服务以来已经有一段时间了,所以我担心我没有及时了解技术细节,但从你的描述来看,它似乎适合你的情况,处理管理 GUI 和客户端进程之间的通信。

有多种选择(我相信您对异步通信感兴趣)因此您应该看看最新的发展,以检查自己是否适合您的情况。

关于服务器将与进程交换的数据大小,我认为这是一个不同的话题,我必须说答案取决于。在消息中发送所有数据会更好吗?或者该消息是否只是一个通知,以便通知客户端,然后连接到某个企业 bean 以检查一些新状态?我更喜欢后一种情况,但这是你应该根据你的要求决定的。我不会盲目地排除第一个选项,除非我有一些明显的证据表明这不起作用。

关于缩放,我认为它不会比其他 bean 的缩放更糟糕。就服务器而言,它们的进程都是需要服务的客户端。

请对上述建议持保留态度:我不知道您的问题/设计的细节。我说的更多是笼统的。

希望对你有帮助

【讨论】:

  • 这个建议很好,是我选择的实现方式(具体来说,我决定采用一种解决方案,即广播消息很小,然后按请求提取大数据)。但是,答案仍然缺乏对我的编辑的回应。
  • @Stav 抱歉,我错过了您的编辑,因为系统只会在您提及我的昵称时(即在评论中或您对我的答案发表评论)通知我(就像您现在所做的那样)。因此,您现在想要将您的 J2SE 独立进程转换为在 J2EE 远程服务器中运行(即与 2. 所在的主机不同)?我的理解正确吗?
  • 这几乎正是我想要的。从理论上讲,我不介意独立进程在远程 JVM 上继续作为 J2SE 运行,但我不想自己构建一个完整的机制来监控它们,启动/停止和重新启动故障。谢谢。
  • @Stav hmmm 恐怕我不知道可以为您部署/重新生成进程的开箱即用解决方案。我更多的是考虑自定义解决方案,但你说你想避免它。也许您可以使用 JMX(如果您还没有使用它),但我的知识仅限于该领域:(
猜你喜欢
  • 2016-02-26
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多