场景是这样的,我想要用 golang 的 NewSingleHostReferseProxy 来代理一个第三方系统的接口,然后在拿到接口响应的时候记录这次调用到数据库(按照用户每天每个资源类型来统计次数),程序部署到多个节点上,请求记录表大概是这样子,我需要确保更新不丢失,数据表大概是下面这样,因为我没做过高并发和分布式场景下的业务,我想的是表里扩展 fersion 来用乐观锁来处理,更新失败的话重试,但是重试也不知道要重试几次,重试失败应该怎么办,请教大家最好用那种方式?
更新/插入逻辑(伪代码):
```
err := dao.DB.Where("`uid` = ? AND `date` = ? AND `type` = ?", uid, today, type).FirstOrInit(&record).Error
if err != nil {
return err
}
if record.RequestKey != "" {
record.RequestCount++
} else {
record.RequestCount = 1
}
return dao.DB.Save(&record).Error
```
表大致的字段(伪代码):
```
CREATE TABLE `sys_request_record` (
`uid` varchar(32) NOT NULL COMMENT '用户 uid',
`type`int(11) NOT NULL COMMENT '请求资源类型',
`date` date NOT NULL COMMENT '日期',
`request_count` int(11) NOT NULL DEFAULT '0' COMMENT '请求次数',
`created_at` bigint(20) NOT NULL DEFAULT '0' COMMENT '创建时间',
`updated_at` bigint(20) NOT NULL DEFAULT '0' COMMENT '更新时间',
`deleted_at` bigint(20) NOT NULL DEFAULT '0' COMMENT '删除时间',
PRIMARY KEY (`uid`,`type`,`date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
``` |
|