请教分布式下如何用锁确保更新不丢失?

1次阅读

共计 887 个字符,预计需要花费 3 分钟才能阅读完成。

场景是这样的,我想要用 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
正文完
 0