我有一个应用程序,其中消息以每小时70K XML的速率传输。我们使用这些XML消息并将其存储到中间队列中。创建中间队列是因为我们需要满足24小时消耗所有消息的SLA。我们能够在24小时内使用XMLS并将其加载到内部队列中。在将其加载到内部队列之后,我们处理XMLS(解析,应用非常少的转换,执行很少的验证)并将数据存储到严格规范化的数据模型中。我知道数据模型会对性能产生巨大影响,遗憾的是,我们无法控制数据模型。目前,我们需要3.5分钟来处理2K消息,这是不可接受的。对于2K消息,我们希望将其降低到1分钟。以下是我们迄今为止所做的工作:
1)适用的应用指数 2)使用XMLBeans来解析XML(每个XML的大小不是很大) 3)删除了所有不必要的验证,transformatios等。
应用程序运行于:
操作系统:RHEL 5.4 64位
平台:JDK 1.6.0_17,64位
数据库:Oracle 11g R2 64位(2节点集群)
外部MQ:IBM队列
内部临时存储MQ:JBoss MQ
Application Server:Jboss 5.1.0.GA(EAP版本)
我们使用和处理XML消息的顺序非常重要,因此我们无法进行并行处理。
我们还能做些什么来改善表现吗?
答案 0 :(得分:2)
消息传递调整之外的一些建议,因为它似乎不是您的[主要]瓶颈:
关于消息传递的一个快速项目.....
您没有提及是否使用带有WebSphere MQ的消息驱动bean,但如果您使用,则Inbound Configuration中有一个名为 pollingInterval 的设置,引用文档引用,意思是:
如果会话中的每个消息侦听器在其队列中没有合适的消息,则这是在每个消息侦听器再次尝试从其队列中获取消息之前经过的最大间隔(以毫秒为单位)。如果经常发生会话中没有适当的消息可用于任何消息侦听器,请考虑增加此属性的值。仅当TRANSPORT具有值BIND或CLIENT时,此属性才相关。
默认 pollingTime 为5000毫秒。您当前的消息处理时间是
(3.5 * 60 * 1000/2000)
=每条消息105毫秒。
如果你在这里引入5000毫秒的暂停,这将严重降低你的吞吐量,所以你可能想要通过测量消息入队时间和你收到的时间之间的持续差异来研究这个问题。 JBoss消息监听器中的消息。可以从以下消息标题中确定入队时间:
总而言之,您最好的选择是找出如何并行化。
祝你好运。//尼古拉斯
答案 1 :(得分:1)
WebSphere MQ,即使在小型服务器上,也可以比您描述的速率更快地卸载消息。 Windows Performance Report for WMQ V7通过客户端渠道每秒超过2,200次2k持续往返(一次请求和一次回复)测试。这是每秒超过4,000条消息。
您的案例中的瓶颈似乎是处理消息的延迟以及以特定顺序处理消息的依赖性。可以为您提供最佳性能提升的选项是消除顺序依赖性。当我在银行工作时,我们有一个系统按照他们到达的确切顺序发布交易,每个人都说这个要求是强制性的。但是,我们最终修改了系统,以便在白天执行备忘录,然后在稍后的步骤中重新发布。备忘录发布以任何顺序发生,并支持并行性,故障转移和多实例处理的所有其他好处。最后的帖子在逻辑顺序中(并且实际上以对客户最有利的顺序)应用了交易,一旦它们都在数据库中。序列依赖关系将您锁定为单例模型,并且是异步消息传递的最坏情况要求。尽可能消除它们。
另一个需要改进的方面是解析和处理消息。只要您遇到顺序依赖,这是提高性能的最佳选择。
最后,您总是可以选择以更多内存,CPU,更快的磁盘I / O等形式来解决问题。从本质上讲,这是针对具有强大功能的软件架构,并且永远不是最好的解决方案,但通常会为您提供足够的时间来解决根本原因。