< p > 文本
让我先描述一下臭虫现象:
这两个输入框的值都是从KV(存储中间件,如Redis)获得的,可以实时修改。我足够聪明地假设,如果千伏没有值,默认情况下将采用静态变量,因此有一个底线。当加载一个类时,静态变量将被加载,并且我的效率也很高。
这也为我身后的Bug打下了基础。问题是这个Bug让我很恼火,因为它在高级环境下是好的,但在网上就不好了。
首先看看代码是如何编写的:
可以在代码中看到。我使用千伏作为静态代码块的初始值。如果有一个值,我将使用千伏作为初始值。如果没有值,我也会有默认值。我仍然认为我的想法很聪明。千伏比数据库更有效率,常量被用作基数,因此在没有配置和空指针等情况下没有值。
试图让自己振作起来。太棒了。我不知道我写的代码有多蠢。
在这方面似乎没有问题,但是我的值可以修改,这是一个问题,而且我仍然一直采用几个变量而不是千伏。
和常数被我用作变量,也违背了这个东西的初衷
我上网后,三味说:奥冰有个大问题。为什么刷新值是错误的,然后我会回来
我吓坏了,知道自己写了一个BUG。我擦了擦太阳穴上的汗水,没有留下任何痕迹,深吸了一口气。
回答:我还没有写我的代码。你为什么要弄乱它?我告诉过你不要乱动它。你现在在摆弄它吗
三味似乎真的认为自己错了,二话没说就走了
这一次我立即打开了电脑,也顾不上掉链子的感觉,思绪转得很快,开始在海上建立起整个价值传递环节
我改变了页面的值,然后我也改变了这个静态变量和千伏的值,但是我发现我在修改后刷新了一段时间,在修改前刷新了一段时间。
这很奇怪啊,主要是在报账时不能重现,这很欺骗人,可悲啊歪歪扭扭
tipp:最令人愤慨的是代码与在线相同,数据库相同,环境配置不同。
我把代码读了一遍又一遍,还是没有发现问题。
那天吃了一顿丰盛的午餐后,我突然在一瞬间发现了问题的核心。提前是好事,因为他是一台机器。
和我们生产线上的机器是负载平衡的,有两台机器,我一次只更改了一台机器的值,另一台没有更改为
那么问题很简单,让我们看看下图:
的高级版本是独立的。无论我如何阅读或修改它,数据每次都是准确的(我没有意识到每次提取变量都是错误的)
在网上是不同的,但是,当服务器启动时,每台机器都被赋予一个值,所以如果只是读取就不是问题了(难怪静态常数是私有的,基本上如果它们可以被修改就有问题了)
但是如果你修改,你的修改请求只命中一台机器。如果下一个负载平衡请求击中了这台机器,那么你很幸运,结果是正确的。但是负载平衡算法通常非常公平,在这种情况下,1/2的请求会得到错误的结果。
这里还有一个问题,就是在KV修改后,变量也修改了。在某些地方,我采用变量,因为我认为无论如何每次我改变它,都可以采用它们。
事实上,正确的方法是我每次去的时候都应该读《千伏》。我应该只在KV为空时读取静态变量。作为一个自下而上的方案,我不应该改变常量的值。
而且每个人都应该知道,我成功地修改了千伏。如果我在修改常数时犯了一个错误呢?你接受常数值是错误的。
所以查询、修改应该这样做:
主要想提醒大家小心操作静态常数。如果静态常数不能改变,它们也不会改变。不要写如此令人发指的行动。我只有40或50台在线机器的几项服务。这种问题真的很难找到。
我万万没想到,我居然写了这个代码,下次再写,只能让歪歪扭扭的不要乱点,免得再点破了哈哈