0

我正在编写一个基于消息的客户端/服务器应用程序。我想尽可能地重复使用,而不是编写另一个实现并好奇其他人在使用什么。

图书馆应提供的功能:

  • 客户端和服务器端功能
  • 应该基于消息工作
  • 支持多线程
  • 应该在负载平衡器/防火墙后面工作

我用HTTPCore做了几个测试,但底线是必须同时实现客户端和服务器,只覆盖传输层。由于网络相关要求,RMI 也不是一个选项。

任何想法都受到高度赞赏。


细节

我的想法是实现一个客户端/服务器包装器,它处理客户端通信(包括用户/密码验证)并将传入请求写入 JMS 队列:

#1  User --> Wrapper (Check for user/password) --> JMS --> "Server"
#2  User polls Wrapper which polls JMS

单独的进程将处理请求,并可以通过包装器回复客户端。我想使用 JMS,因为:

  • 它很好地处理持久性
  • 负载平衡——通过添加额外的服务器作为消费者很容易处理峰值
  • JMSTimeToLive 也很方便

不幸的是,我没有看到自己使用 JMS 的方法,因为客户端应该只能访问他们的消息,并且在 JMS 端设置不同的用户听起来也不可行。

4

7 回答 7

3

好吧,就实现它的客户端和服务器代码而言,HTTP 可能是最好的支持 - 但根据您的要求,它可能完全不合适。我们需要真正了解一些要求(或者至少对应用程序的情况有一个模糊的了解),然后才能真正为您提供适当的建议。

于 2009-01-16T16:31:13.493 回答
2

RMI 非常适合我们。存在一些限制,例如除非您可以直接连接到该计算机,否则无法回叫客户端(如果客户端位于防火墙后面则不起作用)。您还可以轻松地将通信包装在 SSL 中,或者通过可以包装在 SSL 中的 HTTP 进行隧道传输。

如果您最终使用它,请记住始终设置分发给客户端的类的串行版本。您可以在创建时将其设置为 1L,或者如果客户端已经拥有该类,请使用 serialver.exe 来发现现有类的序列号。否则,一旦您更改或添加公共方法或变量,与现有客户端的兼容性就会中断。

静态最终长serialVersionUID = 1L

编辑:进入服务器的每个 RMI 请求都有自己的线程。你不必自己处理这个。

编辑:我认为稍后在问题中添加了一些细节。您可以通过 HTTP 建立 RMI 隧道,然后可以使用负载均衡器。

我最近开始和 Hessian 一起玩,它显示出很大的希望。它本机使用 HTTP,这使得它比 RMI over HTTP 更简单,而且它是一个二进制协议,这意味着它比所有基于 XML 的协议都快。让 Hessian 前进非常容易。我最近通过在我们的应用程序中嵌入 Jetty、配置 Hessian Servlet 并使其实现我们的 API 接口来做到这一点。Hessian 的伟大之处在于它的简单性……与基于 HTTP 的 JMS 或 RMI 完全不同。还有其他语言的 Hessian 库。

于 2009-01-16T16:42:26.250 回答
1

我会说,Java 的最佳支持(如果不是最佳实现的话)客户端/服务器通信包是 Sun 的 RMI(远程方法调用)。它包含在标准 Java 类库中,可以完成工作,即使它不是最快的选项。当然,它也得到了 Sun 的支持。几年前我用它实现了一个回合制游戏框架,它相当稳定。

于 2009-01-16T16:33:33.413 回答
1

很难根据给出的信息提出建议,但可能使用 TemporaryQueues,例如基于每个客户端动态创建的 PTP 目的地可能适合这个问题?

是一个合理的概述。

于 2009-01-16T16:59:03.017 回答
1

您是否尝试过RMICORBA?使用它们,您可以分配逻辑并创建会话

于 2009-01-16T17:03:35.800 回答
1

使用 Spring....然后选择协议。

于 2009-01-16T18:13:48.873 回答
0

我们正在标准化 Adob​​e 的 AMF,因为我们在客户端层使用 Adob​​e Flex/AIR,在我们的中间层堆栈中使用 Java6/Tomcat6/BlazeDS/Spring-Framework2.5/iBATIS2.3.4/ActiveMQ-JMS5.2 ( Oracle 10g 后端)。

因为我们正在对 Flex 客户端开发进行标准化,所以 AMF 和 BlazeDS(由于 Adob​​e 和 SpringSource 在集成方面的合作,现在更好地与 Spring 耦合)是我们可以用来与服务器端交互的最有效和最方便的方式。

我们还在数据中心大量构建了 JMS 消息传递 - BlazeDS 使我们能够将 Flex 客户端作为 JMS 主题订阅者进行桥接。这是非常强大和有效的。

我们的 Flex .swf 和 Java .class 代码捆绑到同一个 .jar 文件中以进行部署。这样,客户端代码的正确版本将被部署以与将处理客户端服务调用(或消息传递操作)的相应中间层 java 代码进行交互。这一直是客户端-服务器计算的祸根——确保各个层的正确版本相互连接。我们已经通过我们特殊的打包和部署方法有效地解决了这个古老的问题。

我们所有的客户端-服务器交互都在 HTTP/HTTPS 端口 80 和 443 上工作。甚至我们使用 BlazeDS 进行的服务器端消息推送也桥接到我们的 ActiveMQ JMS 消息代理。

于 2009-01-16T16:36:32.720 回答