2

我一直在运行一些测试来检查 MSMQ 的性能,并测试它在将大量消息传递给单独的服务进行处理方面是否符合我们的需求。我们的要求是某些消息很重要,并且必须使用事务以可恢复的方式传递,而其他消息则不是。

我的实验包括向 MSMQ 发送 1000 个 108 字节长的文本字符串,并执行 50 次,以获得平均值并记录每批 1000 条消息的最小、最大和平均性能。

我正在使用 C++ 服务将消息分派到两个本地私有队列,一个是非事务性的,一个是事务性的(在必要时)。我进行了四个实验,它们是:

1) 仅交易发送

2) 仅非事务性发送

3) 以非事务方式发送每组 1000 条消息中的 500 条,然后以事务方式发送另外 500 条

4) 发送 500 条事务性消息和 500 条非事务性消息,在事务性和非事务性之间交替发送,以便每个事务性后跟一个非事务性消息,依此类推

我已经消除了任何其他外部因素,得到的结果很奇怪,所以我想知道是否有人可以解释一下?结果如下:

1) 事务性

Average: 1436   
Min: 398
Max: 1902

2) 非交易性

Average: 35
Min: 30
Max: 100

3)混合跟进

Average: 40
Min: 29
Max: 323

4)混合穿插

Average: 4944
Min: 1214
Max: 5941

让我感到困惑的两个问题是,首先在事务性发送和非事务性发送之间交替导致比以事务方式发送所有内容的性能降低大约 5 倍——我曾认为以事务方式发送所有内容比只发送一半消息更昂贵无论以何种方式完成事务,都不会慢 5 倍。其次,在 500 条非事务性消息之后发送 500 条事务性消息似乎实际上加快了事务性发送的速度,而当它们作为单批 1000 个单独的事务发送时,根据该测试的平均发送速率仅为 40 毫秒来判断。

将单个消息写入事务性消息和非事务性队列之间的交替是否由于 MSMQ 必须在以同步方式或类似方式序列化的文件之间切换而重复?

作为参考,我正在使用 MSMQ 中内置的单个消息事务。我也进行了几次这些实验,结果总是大体相似。我还验证了数据计算正确。

任何帮助解释切换队列的性能影响,以及在事务队列之前发送到非事务队列的性能增益将不胜感激。

提前致谢。

4

0 回答 0