【问题标题】:GWT RPC - Multiple RPC Services Per AppGWT RPC - 每个应用程序多个 RPC 服务
【发布时间】:2012-09-14 01:43:07
【问题描述】:

我目前正在使用具有一个大型 RPC 服务的 GWT 应用程序。它有 100 多种方法,所有方法都做不同的事情。如果我将其拆分为多个 RPC 服务,我会获得什么样的性能优势/障碍?我相信我必须为每个人制作一个新的 servlet。

所以我的主要问题是: GWT 是否为每个正在运行的客户端创建一个新的 RPC servlet? 如果我有两个 RPC 服务,GWT 会为一个应用程序提供两个 servlet 吗? 拥有两个 RPC 服务会导致任何性能问题。目前(一个 tomcat 实例上有 10-15 个并发用户)

【问题讨论】:

    标签: java gwt tomcat servlets rpc


    【解决方案1】:

    如果我将其拆分为多个 RPC 服务,我会获得什么样的性能优势/障碍?

    我相信这不会改变任何事情。

    我相信我必须为每个 servlet 创建一个新的 servlet。

    不一定。您可以有一个 RemoteServiceServlet 实现多个 RemoteService 接口。您必须在所有接口上设置相同的 @RemoteServiceRelativePath 以使客户端使用相同的 URL,但您也可以将相同的 servlet 映射到几个不同的 URL(多个 servlet-mapping 具有相同的 servlet-name)。

    GWT 是否为每个正在运行的客户端创建一个新的 RPC servlet?

    GWT 不会创建新的 RPC servlet,如果您将 Web 应用程序托管在 Tomcat 中,那么 Tomcat odes 会创建 servlet 实例(通常每个类只有一个实例)。

    【讨论】:

    • 我应该补充一点,真正的好处是更具可读性/模块化的代码。对可维护性而非性能的巨大好处(无论如何性能不会受到惩罚)。
    • 谢谢,这确实回答了我的问题。我想我会尝试拆分其中的一些功能,以便于代码可维护性。
    • @helios:我没有强调这一点,因为我认为这是阿格拉斯曼的意图,他担心影响。但是,是的,当然,分裂分裂分裂!你知道,Single responsibility principle 等人。
    【解决方案2】:

    多个 RPC 接口的一个可能缺点:如果接口之间有许多共享模型对象,GWT 将为每个模型对象生成FieldSerializers - 这些将被正确共享。但是,为了确保每个 RPC 实例只引用它需要的序列化程序,每个服务代理都会创建一个 TypeSerializer。在 10 个服务每个使用 100 个模型对象的情况下,这将导致 10 个TypeSerializers,每个具有 100 个FieldSerializer 注册(每个序列化程序的三个组件 - 序列化、实例化、反序列化)。

    我已经看到至少有一个应用程序在这些共享模型对象的重量下几乎增加了三倍 - 超过一百个 RPC 接口,以及它们之间共享的数千个可能的模型对象。并非每个接口都使用了每个模型,但足以造成这种损害。通过分别维护每个接口对并制作一个扩展每个其他接口的巨型对来缓解这种情况 - 这样GWT.create 仅在该一种类型上调用,因此只创建一个巨型TypeSerializer 而不是数百个。

    因此,请注意编译后的输出大小,并不时查看 SOYC(编译的故事)报告,看看是什么占用了所有空间。

    【讨论】:

    • 感谢您的提示。我必须做一些分析,以确保拆分服务不会导致输出大小增加太多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多