我有一个相对简单的 java 服务,它从各种 SOAP Web 服务中获取信息,并在底层使用 apache cxf 2.5.2 来实现。该服务每小时启动 20 个工作线程来处理 1000-8000 个请求,每个请求可以根据请求的性质进行 2-5 个 Web 服务调用。
设置
- 我在 Web 服务连接上使用连接池
- 连接超时设置为 2 秒,以便切实有效地处理请求量。
- 所有连接均通过 http 代理传出。
- 20 个工作线程
- Grunty 16 cpu 盒
问题是我开始在日志中看到“连接超时”错误,而且数量相当多,并且应用程序服务似乎也影响了计算机的网络性能,因为命令行中的curl需要>只需 5 秒即可建立与相同 Web 服务的连接。但是,当我停止服务应用程序时,curl 性能大幅提高到 < 5ms
其他人如何使用 CXF 解决这种情况?它有效还是他们切换到了不同的库?如果您要从头开始,您将如何设计“小有效负载高频”交易?
最佳答案
有一次我们遇到了与您类似的问题,请求花了很长时间才能完成。这不是 CXF 问题,每个 Web 服务的堆栈对于非常频繁的请求都会运行很长时间。
为了解决这个问题,我们实现了 JMS EJB
消息驱动 bean。流程如下:当用户向 Web 服务发送请求时,所有请求都会放入 JMS
队列中,以便对用户的响应非常快,而请求则留在后台处理。随后,用户能够看到他们的操作:是否仍在发送处理、是否正在处理、是否成功完成或由于某种原因未能完成。
如果我必须设计频繁的事务应用程序,我肯定会使用JMS
。
希望这有帮助。
关于java - 线程化 apache cxf 客户端和高频请求的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11578404/