Mik*_*eC8 5 testing concurrency multithreading
我正在开发一个包含以下内容的系统:
关键的一点是,不应该有一个工人同时连续操作.
当然这里有很多策略......我可以锁定数据库级别的东西,我可以使用互斥锁等.
但无论我如何实现这一点,我都需要能够测试系统以确保我做得对.
测试这个的正确方法是什么?
我一直在做的就是运行数百个线程并不断检查是否意外重叠.问题是,它是命中还是错过.这是概率.即使我运行500个线程一小时,仍然可能有一个线程与另一个重叠,很少.
另外,我如何正确检查重叠?"重叠检查器"本身具有有限的分辨率,可能缺少正在发生的实际重叠......
我知道并发是一个复杂的话题,但肯定必须有一些最佳实践或推荐的方法来测试这样一个系统,除了运行它很长一段时间并且交叉指...
测试这个的正确方法是什么?
这里没有简单的答案。需要考虑的一件事是创建一个数据库代理,您可以在工作线程和数据库层之间注入该代理以捕获重叠。您可以在某个并发映射中记录客户端操作的 row-id,并在数据库 RPC 调用完成时将其删除。
我将使用 Java 作为伪代码。
try {
// add it to some atomic concurrent hash-map
if (workingRowIdMap.putIfAbsent(rowId, null) != null) {
// scream and shout and log a concurrency failure
}
// do the _real_ database stuff here
} finally {
workingRowIdMap.remove(rowId);
}
Run Code Online (Sandbox Code Playgroud)
如果您正在处理 SQL 来提取相关数据的 row-id 可能会很困难。如果您正在处理的 SQL 很复杂,这甚至可能是不可能的。如果没有有关您的架构的更多详细信息,很难知道。
另外,您将希望您的代理尽可能轻量级,否则如果添加额外的锁或太多内存屏障,您可能会隐藏问题。
另一个想法是使用数据库工具查看二进制更改日志,以查看指令中是否存在重叠。我知道 MySQL 有一些工具可以让你调查他们的二进制日志。然而,定制一个工具来确定数据更新是否重叠可能需要做很多工作。
另外,我如何正确检查重叠?“重叠检查器”本身具有有限的分辨率,可能会丢失正在发生的实际重叠......
同意。错误测试并不是一门精确的科学——尤其是对于高度并发的软件。我们的想法是尽最大努力。我总是尝试模拟实时服务流量,这通常是复制软件在生产中看到的条件的最佳方式。重播生产日志也许能够帮助您检测问题。
除了测试之外,您可能还需要围绕软件的高并发部分进行一些小组代码审查会议。正确地隔离该代码,以便通过良好的 try/finally 块等使锁定变得简单,这也是一项不错的投资。
归档时间: |
|
查看次数: |
343 次 |
最近记录: |