场景是这样的,我想要用 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
```
举报· 40 次点击
登录 注册 站外分享
快来抢沙发
0 条回复  
返回顶部