codeigniter 处理快速API调用相同的查询

hivapdat  于 2022-12-07  发布在  其他
关注(0)|答案(1)|浏览(108)

你好,我如何处理快速api调用相同的查询。下面是我有一个api url的场景
example.com/send_sms?apikey=abcdef&contact=123123123&text=your+is+otp+112233
当我的客户端调用url这个它会检查这个用户是否有足够的信用在他的帐户之前发送短信了。我一直在使用这种方法多年,但就在昨天我的一个客户端继续垃圾邮件我的服务器由于他们的编程逻辑。
下面是我的PHP方法和Mysql用户信用表
第一个
当我检查我的mysql进程列表时,它创建了很多进程,这会减慢mysql的速度。
我不能放慢客户调用我们的API,因为短信,特别是OTP(一次性密码)必须立即处理。
我想知道我应该做什么来优化这个查询?我应该添加另一列来存储最后一个客户的信用吗?

f0brbegy

f0brbegy1#

基于当前环境的优化建议:

  • apikey列建立索引以加快查找速度。
alter table `users_credit`
 add index `apiKey_index` (apiKey)
  • 不要为一个用户创建多个具有相同api关键字但具有不同信用评分的行,并在最后将其相加。相反,只存储一次总信用,并使用如下事务从该行开始不断递减。当达到0时,拒绝服务。
START TRANSACTION;
UPDATE `users_credit`
SET credit = credit - YOUR_AMOUNT
WHERE apikey = 'your_key';
COMMIT;
  • 通过这种方式,您还可以解决争用条件问题,并通过每个API键只有一行来保存磁盘上占用的大量内存。
  • 也有基于每分钟/每小时/每个帐户等的API速率限制规则,这样他们就不会因为他们的请求(无论是真正的还是任何垃圾邮件机器人明智的)而使您的服务器超载。许多大公司确实采用这种方法来避免任何类型的DDOS或DOS攻击在非常基本的水平。

您可以查看Facebook rate limiting approach并实现类似的内容。

相关问题