Java GAE:实例和队列之间的分工
我通常喜欢使用2或3层组件部署JBoss服务器应用程序: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)是后端的“网关
- 一个
文件,包含我的服务器的所有web服务,包括“web层”,并部署到JBoss的web容器中;及myws.war
- 一个
文件,由我的服务器的“esb”(服务总线)组成,基本上是一个使用ApacheCamel构建的esb,用于服务异步请求my esb.war
- 1+
s由我的服务器的所有业务逻辑组成,包括“业务层”,并部署到JBoss的应用程序容器中;所有EJB都负责为同步请求提供服务EJB
myws.war
)是后端的“网关”,根据请求的性质,Web服务知道如何将它们路由到适当的EJB(在需要及时响应的同步请求的情况下),或者它将它们路由到一个队列中,在那里它们被我的基于Camel的ESB接收和处理(在异步请求的情况下)。这对我来说一直很有效,我真的很喜欢它的架构
我现在正在设计我的第一个GAE后端,并且正在努力找出如何将相同的架构映射到GAE平台上
显然,我必须将所有内容都部署为单个WAR文件(没有更多的EAR或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可能没有现成的功能来管理GAEpull
队列,但我敢打赌,调整现有组件来处理这个问题是非常简单的,然后您可以让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);