Java GAE:实例和队列之间的分工

Java GAE:实例和队列之间的分工,java,google-app-engine,ejb,esb,n-tier-architecture,Java,Google App Engine,Ejb,Esb,N Tier Architecture,我通常喜欢使用2或3层组件部署JBoss服务器应用程序: 一个myws.war文件,包含我的服务器的所有web服务,包括“web层”,并部署到JBoss的web容器中;及 一个my esb.war文件,由我的服务器的“esb”(服务总线)组成,基本上是一个使用ApacheCamel构建的esb,用于服务异步请求 1+EJBs由我的服务器的所有业务逻辑组成,包括“业务层”,并部署到JBoss的应用程序容器中;所有EJB都负责为同步请求提供服务 因此,Web服务(myws.war)是后端的“网关

我通常喜欢使用2或3层组件部署JBoss服务器应用程序:

  • 一个
    myws.war
    文件,包含我的服务器的所有web服务,包括“web层”,并部署到JBoss的web容器中;及
  • 一个
    my esb.war
    文件,由我的服务器的“esb”(服务总线)组成,基本上是一个使用ApacheCamel构建的esb,用于服务异步请求
  • 1+
    EJB
    s由我的服务器的所有业务逻辑组成,包括“业务层”,并部署到JBoss的应用程序容器中;所有EJB都负责为同步请求提供服务
因此,Web服务(
myws.war
)是后端的“网关”,根据请求的性质,Web服务知道如何将它们路由到适当的EJB(在需要及时响应的同步请求的情况下),或者它将它们路由到一个队列中,在那里它们被我的基于Camel的ESB接收和处理(在异步请求的情况下)。这对我来说一直很有效,我真的很喜欢它的架构

我现在正在设计我的第一个GAE后端,并且正在努力找出如何将相同的架构映射到GAE平台上

显然,我必须将所有内容都部署为单个WAR文件(没有更多的EAR或EJB)。但我在这里没有“明白”的是:

  • 如果Web服务确定请求是异步的并且应该在ESB上运行,我可以将请求排队到任务队列,但不确定如何指示骆驼路由的第一个端点拾取任务并开始处理它(我习惯于在骆驼和ActiveMQ之间工作)
  • 我假设我的ESB应该部署到后端实例,这样它就不受时间或线程限制,
  • 如果Web服务确定请求是同步的并且必须快速响应,那么我需要EJB的GAE版本。我是否只是创建处理程序pojo并将请求路由到它们?我的Web服务将尽可能多线程(我相信对于前端实例,最多10个线程),因此我假设这样的处理程序POJO需要是线程安全的,?还是有更好的方法在GAE上模拟EJB/模块化业务逻辑

  • 此外,如果有人认为试图将我的正常架构映射到GAE有什么固有的错误,请大声说出来,让我知道什么/为什么!提前谢谢

    您描述的体系结构非常简单。您可以决定是否为应用程序保证隐式复杂性

    我不熟悉Camel的细节,所以您需要尝试在它上面映射概念。但是,这真的没什么大不了的。在这个级别上,ESB是ESB,ESB是ESB

    对于#1,有两种选择。GAE有
    push
    pull
    队列<代码>推送队列由您设置并由GAE管理,只能在GAE环境中使用
    Pull
    队列由您设置和管理,但可以驱动GAE和外部应用程序

    对于您的应用程序来说,
    push
    队列只不过是一个普通的web请求,细节是GAE是发出实际请求的客户端。您将要发送的URL及其负载发布到队列中,GAE将捕获、路由和限制对URL的请求。为了向Camel注入请求,如果您可以从Servlet或任何任意Java类中抽取Camel管道,那么您可以在这里这样做。我知道Camel有很多连接器和监听器等等,但在本例中,您只需要一个简单的、基于代码的注入点。我毫不怀疑骆驼能做到这一点,只是说不出细节

    pull
    队列是完全不同的。在这里,您需要一个自由运行的线程(使用GAE租用机制)将任务从队列中拉出并处理它们。您很可能能够利用一些Camel基础设施来创建一个
    pull
    queue兼容的线程端点,并让Camel管理整个工具包。但最后,您必须启动线程,管理要运行的线程数量,监视它们,关闭它们,等等。因此,与推送队列相比,这里还有更多的工作要做<如果GAE中的所有内容都是合理的要求,那么从内部基础架构的角度来看,代码>推送队列更容易实现。如果需要一些外部集成,可以通过HTTP请求从外部源中提取
    pull
    队列

    因此,尽管Camel可能没有现成的功能来管理GAE
    pull
    队列,但我敢打赌,调整现有组件来处理这个问题是非常简单的,然后您可以让Camel管理整个事情。如果您在这个级别上已经对Camel感到满意,那么这可能会更容易为您使用

    对于#2,GAE后端的两个主要好处是稳定性和寿命。普通实例作为通用web应用程序存在,适用于负载平衡。GAE根据流量和响应模式动态创建和销毁这些实例。但是,在任何特定的时间,你的应用程序都很可能没有实际运行的实例,GAE在看到第一个请求时会将它们旋转起来。因此,任何内部(即未在DB中持久化)管理状态都不能保证具有任何实际寿命

    后端是由您控制的实例。它们很像其他云提供商的实例。你启动它,你调整它的大小,你给它们发送流量,你关闭它们。因此,您可以更好地断言正常运行时间和系统容量

    如果您的请求在CPU时间或资源方面不是特别苛刻,那么您可能不需要后端实例,尤其是对于
    push
    队列。基本上想象一下从web浏览器获取请求,并将信息传递给
    YourTrnCtx ctx = startNewTransaction();
    registerContextToThread(ctx);
    YourBean b = new YourBean();
    injectResources(b);
    b.start();
    b.service();
    b.end();
    commitTransaction(ctx);