“月末清零”场景的业务逻辑设计

文章讨论了一个在高并发流控场景下,关于用户每月API使用阀值的问题。原程序设计在月末23:59:00执行清零任务,但可能因宕机或延迟导致数据异常。作者提出了优化方案,即按月份区分redis计数key,调用时根据当前月份计数,实现无缝切换,避免了额外的定时任务和数据异常。这种设计提高了系统的稳定性和准确性。
摘要由CSDN通过智能技术生成

前几天遇到一个有关于“月末清零”的业务场景下的异常问题,在这里跟大家分享一下。

一、场景

这是一个高并发下的流控场景,每个用户每月使用API都设定一个阀值,超出阀值的调用受限。

二、原程序设计

程序设计需要记录用户对API的使用量,这里使用redis存储计数。当月底时对使用量进行清零。清零的定时任务设定在月末最后一天的23:59:00,之所以未设定零点,是因为零点的定时任务太多了,0点执行后到完成有一定的延时,这段时间的调用不会被记入本月,所以,虽然23:59:00一样使数据切割的不准确,但是也可以接受。

然后,问题来了。

三、问题

主要是下面几个问题:

1程序在月末零点前后宕机或关闭,导致定时任务未执行。

2.因系统压力等因素,本应23:59:00执行的定时任务直到零点后才执行。然而这时判断已不是月末最后一天,任务内容未正常执行。

类似上面问题导致的后果就是,上月的调用量计数累计到了下个月,数据异常了。

四、优化

如何避免这个问题呢,能否是数据切割变得自然而准确呢?

来看看这个方案:

redis中计数的key按月区分,如:key202105,key202106.

在调用计数时,获取当前月份拼接key来计数,月份交界点完美切换,而且无需额外定时任务操作数据。控制台等需要处理数据是也以月份维度来处理。

对比两个方案就发现,第二种方案跟合理准确。逻辑跟简单。

好的设计可以大大提高系统的性能、稳定性,降低复杂度等等优点,所以,在设计上多下功夫是绝对值得的。

作者:Alanwalker

链接:https://ecloud.10086.cn/api/query/developer/user/home.html?ticket=ST-73970-zgKSaunSCucpa1PYWDaF-cas01.example.org#L2FwaS9xdWVyeS9kZXZlbG9wZXIvZm9ydW0vZmxvb3JsaXN0Lmh0bWw/aWQ9Yzc2OGJiY2UxMzk0NDMxNzlkODQ3ZTRmMjgxMDA3Y2Umc291cmNlPXVzZXI=

来源:移动云开发者社区

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值