java - 扩展 Spring Integration Web 应用程序

标签 java spring spring-mvc spring-integration

我使用 Spring Integration API 编写并维护了这个无状态 REST 应用程序/API,并结合了以下基本概念:

1) 入站 HTTP 网关作为 RESTful 入口点 2) 少数服务激活器、路由器、 channel 和转换器 3) 一个拆分器(和一个聚合器),前者订阅了一个 channel ,而后者又连接了一个任务执行器,包括一个大小为 100 的线程池,用于并行执行拆分(ted)消息

到目前为止,该应用程序正在无缝执行 - 作为下一步,我的尝试是扩展该应用程序以处理更多请求,以适应池中所有 100 个线程都被占用的最坏情况同时。

请注意,服务的行为始终是同步的(这是一项业务需求),有时服务的运行时间可能会稍长一些。最坏情况下的往返时间约为 15 秒,最佳情况下约为 2 秒,这两者都在业务团队可接受的范围内。

手头的应用程序服务器是多实例集群环境中的 WebSphere 8.5,可以增加集群的大小以及每个实例在内存和处理器内核方面的能力。

也就是说,我正在探索解决在实现层内扩展应用程序的问题的方法,这些是我能想到的几种方法:

1) 将任务执行器线程池的大小增加很多倍,比如从 100 增加到 1000 或 10000,以容纳更多的并行请求。 2) 保持任务执行器线程池的大小不变,而是通过使用一些 Spring 代码将单个应用程序上下文转换为上下文池进行扩展,以便每个请求都可以获取一个可用的并且每个上下文都有完全访问权限到线程池。 示例:一个包含 250 个应用程序上下文的池,每个上下文都有一个大小为 100 的线程池,促进了总共 250 × 100 = 25000 个并行线程。

第二种方法可能会导致高内存消耗,所以我在考虑是否应该从方法 1) 开始。 但是,我不确定这两种方法从长远来看是否可行。

任何人都可以提供一些帮助吗?提前感谢您的宝贵时间。

真诚的, 巴拉特

最佳答案

根据我的经验,在扩大规模时很容易遇到障碍。相比之下,向外扩展更灵活,但增加了系统的复杂性。

The application server at hand is WebSphere 8.5 in a multi-instance clustered environment and there is a provision to grow the size of the cluster as well as the power of each instance in terms of memory and processor cores.

我会继续朝这个方向发展(通过向集群添加实例来横向扩展),如果可能的话我会在它前面添加一个负载平衡机制。从随机分配负载开始,然后通过“实例池中的空闲线程”分配负载来增强。

此外,确定系统中较重的部分,并评估将它们迁移到他们自己的专用服务是否会有所收获。

Please note that the behaviour of the service is always meant to be synchronous (this is a business need) and there are times when the service can be a slightly long-running one.

上面的陈述引起了一些人的注意。当业务说“一切都完成后才返回结果”时,我明白了。如果是这种情况,那么如果您可以将范例从同步请求/响应更改为观察者模式,那么该系统将会受益匪浅。

关于java - 扩展 Spring Integration Web 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46397852/

相关文章:

java - 如何使用 DevKit 在 Intellij 中添加选择框以运行工具栏

Java 使用引用

spring - 所有 Spring-MVC Controller 的 ALPS 元数据

java - fragment 中的回收器 View 为空

java - 如何在 String.xml 中使用两个具有相同名称的不同字符串值?

java - 如何更好地处理@RequestParam(required=true)

jquery - Spring MVC 未找到匹配的编辑器或转换策略

spring-mvc - 为内部依赖于 ContextLoader.getCurrentWebApplicationContext() 的 Spring MVC 应用程序编写 Junit 测试

java - 哪个是 CDI @Produces 注释的 Spring 等效项?

json - 使用 jackson 将 JSON 对象数组映射到 @RequestBody List<T>