实例教程之记性能测试的一个问题

网友投稿 707 2022-11-29

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

实例教程之记性能测试的一个问题

于是让开发帮忙搭建一个最小化工程单测Rabbitmq发送性能,发现在启用发送端事务后性能下降非常明显。

测试机SSD硬盘测试结果1,0w条消息未开启事务,大约10s发送完毕;但开启了事务后,需要将近320s,差了30多倍。

接着翻阅Rabbitmq官网,发现开启事务性能最大损失超过250倍。

事务为什么会慢

该标志位开启后表示Rabbitmq的发送统一被spring事务管理。当一段代码被@Transactional包裹,那么只有当事务结束后,消息才会正在的发送到Rabbitmq的exchange中。

是否可以去掉事务呢?

实践证明,不行。

因为某些消息,特别是实体的新增或者更新消息发出后,消费者有可能会通过API反查,这时如果生产者本地事务未提交。消费者就有可能消费到空数据或者旧数据。所以生产者必须将发送消息的事务包裹在本地数据库事务当中。

在过去的实践中,有一种解法可以在不开启事务的情况下解决这个问题,就是利用本地消息表,即生产者调用后不发送,而是将消息写入到本地消息表,当事务失败那么此次写入操作也会回滚。真正发送消息到MQ就开启另一个定时线程轮询该本地消息表异步发送消息。这种方法理论上可行,但实际操作非常复杂,当有多个生产者实例时,定时发送线程也会有多个,那么就会遇到各种并发问题。

最大限度改善性能

再次测试,性能明显提高。

上一篇:软件测试面试官之请问N95该怎么测试?
下一篇:软件测试职业发展规划
相关文章

 发表评论

暂时没有评论,来抢沙发吧~