用哪种方式调用方法?

时间:2009-12-13 11:57:19

标签: java

我想在程序的两个部分之间建立连接,这两个部分可以位于离开的地方。 我有一些选择来建立这种联系:

  1. 使用PRC / RMI:在每个请求中,调用方法将发送到第二部分
  2. 使用普通函数调用
  3. 使用队列(在内存中):每个请求都将被放入队列中,第二部分将获得该请求并回答请求
  4. 使用队列(在DB中):类似于数字3但在数据库中
  5. 使用套接字发送数据(TCP / IP或UDP或......)
  6. 使用网络服务
  7. 任何人都可以比较这些可用的方式吗?

3 个答案:

答案 0 :(得分:3)

那里有很多答案。简言之:

  1. 如果您的程序被拆分为客户端/服务器,则无法使用常规方法调用。
  2. 如果您的方法调用是单向(没有返回值),排队可能会有效。但是,如果您想同步返回值,那么您会怎么做?有两个队列 - 一个用于传出,一个用于传入结果?你做了什么呢?例外。这不太自然。
  3. Web服务将起作用。然而,它们通常用于在不同平台上的客户端/服务器之间进行桥接并用不同语言编写,因此这里可能需要做很多不必要的工作。这同样适用于CORBA,顺便说一句。
  4. TCP套接字解决方案可行,但需要进行大量额外工作(如果要调用单独的方法等)。请注意(另外)TCP和UDP基本上是不同的,出于可靠性目的,我不会正常使用UDP这类东西。
  5. 在Java中设置RMI非常简单,这可能是一个很好的第一步。查看the RMI tutorial here

答案 1 :(得分:3)

以下是我的想法:

  1. RPC / RMI - 需要通过线路的RMI / IIOP协议,这限制了您为客户端和服务器使用Java。
  2. 普通函数调用意味着两个对象都驻留在同一个JVM中,无法分发。这将是单个方法调用的最快选项。重用该对象意味着必须将其打包在JAR中并将其重新分发给需要它的所有其他应用程序。现在,如果代码发生变化,您必须知道所有这些JAR的位置。分发是一个问题。
  3. 异步处理,但您必须编写所有队列和处理代码。这将需要强大的多线程技能。可能是最快的,因为它全部在内存中并且如果你有多个内核将允许并行处理。它也是最危险的,因为你必须是线程安全的。
  4. 不明白为什么你在数据库中有队列。我更喜欢Java EE应用服务器来做这件事。并非所有RDBMS都在其中运行队列。如果您同意并使用JMS,那么这将是异步的,分布式和健壮的。它将允许主题或队列,这可以是灵活的。但它会比其他人慢。
  5. 使用套接字就像RMI一样,除了你必须编写整个协议。很多工作。
  6. Web服务的性能与RMI类似。但它会使用HTTP作为协议,这意味着任何可以制定HTTP请求的客户端都可以调用它。 REST或SOAP将为您提供有关消息选择的灵活性(例如,XML,JSON等)
  7. 同步调用意味着调用者和被调用者直接耦合。界面必须保持不变。

    异步调用意味着调用者和被调用者之间的耦合更松散。与同步情况一样,消息必须相对稳定。

    更新:您添加的图片使问题更加模糊。与第三方商家和卡处理程序的交互使您的错误情况更加严峻。如果其中一个失败会怎么样?如果其中一个不可用怎么办?如果银行破产,您如何将其传达给第三方?确实很复杂。除了在RMI和Web服务之间进行选择之外,您将面临更大的问题。

答案 2 :(得分:0)

选项(2)仅在程序的两个部分都在同一个JVM中运行时才有效。

选项(3)和(4)仅在您不介意调用是异步的时才起作用,即不直接将结果返回给调用者。

选项(5)和(6)需要做很多工作才能设置,你最好用(1)。