我的团队一直在努力改善API的性能,并确定了导致某些问题的数据库调用。
该团队提出了三种解决此问题的方法:
- 扩大数据库直到可以满足我们的要求。
- 在应用程序中引入一些轻量级缓存,以减少数据库负载。
- 检查此数据库调用的查询计划,以了解是否可以优化查询。
我们应该首先尝试哪个? 对此进行了激烈的讨论,并提出了支持每种方法的论点。 我们需要一个简单的框架来制定有关如何改善系统的决策。
这就是约束理论(ToC)可以提供帮助的地方。 ToC最初是作为改进制造系统的范例进行阐述的,它在软件工程中非常有用,无论是在管理项目还是在改善我们创建的系统的性能时。
约束理论
应用ToC的第一步是确定系统目标。 对于此API,目标是向消费者提供准确的数据。
现在,我们了解了系统的目标,我们可以将系统的吞吐量定义为可以交付该目标单位的速率,在我们的示例中为API响应。 我们还可以定义系统的运营费用(服务器的成本)及其库存(请求等待响应的费用)。
下一步是确定系统的约束。 这是决定系统吞吐量的系统元素。 在物理系统中,有用的启发式方法是在此元素之前建立库存。 在我们的API中,我们的监控帮助我们确定了瓶颈。
接下来的三个步骤为我们提供了一系列解决约束的方法:
- 首先,通过查找可以进行改进的本地更改来利用约束。
- 其次,通过找到减轻系统压力的方法使系统的其余部分服从于Constraint,以使其性能更加平稳。
- 第三,通过增加可用资源来提高约束条件,并在必要时投入额外的运营费用。
首先是开发,因为它是快速,廉价和本地化的。 要从属,您需要考虑对系统其余部分的影响,但不应涉及重大成本。 提升约束可能会花费相当多的费用,因此它排在最后。
一旦应用了这些步骤,您将发现约束已移至其他位置(您已经“破坏”了原始约束),或者它仍然存在。 无论哪种情况,您都应将这些步骤重复作为持续改进文化的一部分。 最终,您希望看到约束移出系统,并成为消费者需求的问题。
将ToC应用于我们的问题
如果我们查看团队的三个建议,我们可以看到每个建议都与以下技术之一相对应:
- 提升数据库规模是Elevation:使用大型服务器会带来明显的财务成本。
- 引入缓存是从属的:我们正在更改系统的其余部分以减轻对“约束”的压力,并且在进行此更改之前需要考虑诸如缓存无效之类的问题。
- 优化查询的方法是Exploitation:我们正在对Constraint进行本地更改以提高其性能。
应用ToC会告诉我们首先要考虑哪种方法,即优化查询。 如果优化查询仍然不够,我们可以看一下缓存,并且扩展应该是最后的选择。
在我们的例子中,查询优化就足够了。 我们设法实现了性能目标,而没有给系统增加额外的复杂性或增加成本。
翻译自: https://www.javacodegeeks.com/2016/12/applying-theory-constraints-helped-us-optimise-code.html