场景是这样的,我想要用 golang 的 NewSingleHostReverseProxy 来代理一个第三方系统的接口,然后在拿到接口响应的时候记录这次调用到数据库(按照用户每天每个资源类型来统计次数),程序部署到多个节点上,请求记录表大概是这样子,我需要确保更新不丢失,数据表大概是下面这样,因为我没做过高并发和分布式场景下的业务,我想的是表里扩展 version 来用乐观锁来处理,更新失败的话重试,但是重试也不知道要重试几次,重试失败应该怎么办,请教大家最好用那种方式?
更新/插入逻辑(伪代码):
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
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.