当前位置: 首页 > news >正文

bwmarrin/snowflake生成ID重复问题排查记录

现象

某日,运营反馈,在某个时间区间丢失了一段日志,让看看是什么问题。

排查

  1. 查看项目日志有无错误
    发现项目日志有报错信息Error 1062 Duplicate entry '149059529550598144' for key 'PRIMARY',很显然,问题在此,数据库主键冲突,无法插入数据,导致这部分数据被丢弃。那么问题来了,我们使用的雪花算法,为什么会生成重复的ID呢?

进一步排查

  1. 猜想可能早成该问题的原因,可能有两个
    1. 两个项目用了同样的MachineId,然而并没有,我们是单体应用
    2. 时钟回拨,存疑,需进一步确定,大概率是这个问题

  2. 进一步查看代码,bwmarrin/snowflake库的生成方法

// Generate creates and returns a unique snowflake ID
// To help guarantee uniqueness
// - Make sure your system is keeping accurate system time
// - Make sure you never have multiple nodes running with the same node ID
func (n *Node) Generate() ID {n.mu.Lock()now := time.Since(n.epoch).Nanoseconds() / 1000000if now == n.time {n.step = (n.step + 1) & n.stepMaskif n.step == 0 {for now <= n.time {now = time.Since(n.epoch).Nanoseconds() / 1000000}}} else {n.step = 0}n.time = nowr := ID((now)<<n.timeShift |(n.node << n.nodeShift) |(n.step),)n.mu.Unlock()return r
}

可以看出确实没对 now <n.time做判定,而且方法的注释中有说明Make sure your system is keeping accurate system time要自己保障系统时间的准确性。
3. 进一步找运营确认情况,运营老哥说问题是自两天前才有的,想想两天前我对服务器做了什么。两天前我把项目的容器内编译,改为了本地编译,采用挂载时区的方式来设置时区。

FROM golang:1.16 as builder
ENV GO111MODULE=on \CGO_ENABLED=0 \GOOS=linux \GOARCH=amd64 \GOPROXY=https://goproxy.cn,direct
WORKDIR /go/release
COPY go.mod .
COPY go.sum .
RUN go mod download
RUN go build -ldflags="-s -w" -installsuffix cgo -o serve .
FROM scratch as prod
COPY --from=builder /usr/share/zoneinfo /usr/share/zoneinfo
ENV TZ=Asia/Shanghai
COPY --from=builder /go/release/* ./
CMD ["/serve"]//以上每次部署需要3分钟左右,我觉得太慢,改为宿主机执行go build 然后直接把二进制镜像丢给scratch镜像
FROM scratch
ENV TZ=Asia/Shanghai
COPY . /
CMD ["/serve"]
//启动容器时挂载时区
docker run -p 8080:8080 -v /usr/share/zoneinfo:/usr/share/zoneinfo:ro -d test:v1.0.0

但是我没想到的是,宿主机会通过NTP对时间进行矫正,每次矫正,都会造成时钟回拨,生成的ID重复。

解决方案

让容器读自己的时区信息

FROM alpine:latest as base
RUN echo "https://mirrors.aliyun.com/alpine/v3.8/main/" > /etc/apk/repositories \&& echo "https://mirrors.aliyun.com/alpine/v3.8/community/" >> /etc/apk/repositories \&& apk add --no-cache tzdata \&& cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime  \&& echo Asia/Shanghai > /etc/timezone
FROM scratch
COPY --from=base /usr/share/zoneinfo /usr/share/zoneinfo
ENV TZ=Asia/Shanghai
COPY . /
CMD ["/serve"]

相关文章:

bwmarrin/snowflake生成ID重复问题排查记录

现象 某日&#xff0c;运营反馈&#xff0c;在某个时间区间丢失了一段日志&#xff0c;让看看是什么问题。 排查 查看项目日志有无错误 发现项目日志有报错信息Error 1062 Duplicate entry 149059529550598144 for key PRIMARY,很显然&#xff0c;问题在此&#xff0c;数据库…...

操作系统题目收录(十)

1、在存储管理中&#xff0c;采用覆盖与交换技术的目的是&#xff08;&#xff09;。 A&#xff1a;节省主存空间B&#xff1a;物理上扩充主存容量C&#xff1a;提高CPU效率D&#xff1a;实现主存共享 解析 覆盖和交换的提出就是为了解决主存空间不足的问题&#xff0c;但不…...

IOS 自动化测试环境搭建

购买MacPDD 比TB JD 便宜500&#xff0c;下单安装homebrew/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"安装npm cnpmbrew install node; npm install -g cnpm --registryhttps://registry.npm.taobao.org;安装类似Andro…...

系统设计原则

系统设计原则 好的系统是迭代出来的。先解决核心问题&#xff0c;预测未来可能出现的问题&#xff0c;对现有的问题有方案&#xff0c;对未来的问题有预案。不是一上来就按1亿用户量设计&#xff0c;也不要过度复杂化系统。 业务千变万化&#xff0c;技术层出不穷&#xff0c…...

推荐130个网站,非常实用,比涨工资都重要

搞学习 TED&#xff08;最优质的演讲&#xff09;&#xff1a;https://www.ted.com/ 谷粉学术&#xff1a;https://gfsoso.99lb.net/scholar.html 大学资源网&#xff1a;http://www.dxzy163.com/ 简答题&#xff1a;http://www.jiandati.com/ 网易公开课&#xff1a;https…...

手机棋牌游戏开发的流程是怎样的?

最近几年&#xff0c;随着网络游戏的兴起&#xff0c;棋牌手游开发也越来越受欢迎&#xff0c;在国内&#xff0c;几乎随处可见从事手游和手游的公司。不过&#xff0c;虽然公司和产品很多&#xff0c;但效果也不一样&#xff0c;区别就在于&#xff0c;他们能不能掌握好这款游…...

浅谈C++函数重载

C相较于C语言来说,重载是一重大特性,让我们一起简单的回顾一下重载那些事 传送门函数重载是什么为什么有函数重载函数重载是如何实现的总结函数重载是什么 函数重载:是函数的一种特殊情况,C允许在同一作用域中声明几个功能相似的同名函数 这些同名函数的形参列表(参数个数or类…...

数据分析spss应急考试

数据分析spss应急考试 前言 单项选择 15(项)*2&#xff08;分&#xff09;30 判断题 10*1 10 计算题 2*10 案例分析题目(考实验内容) 总四十分&#xff0c;分值不等 老师重点强调了回归分析因子分析方差分析参数、非参数检验 2独立样本的非参数检验应该用什么方法多独立样本…...

Handler postDelayed的实现原理

Handler postDelayed的实现原理 问题描述 Handler.postDelayed()的原理是如何保证延时执行的&#xff1f; 扩展&#xff1a;这样实现的好处是什么&#xff1f; 题目分析 猜测一下 以我们对Handler的了解&#xff0c;内部使用了Looper对消息队列进行循环获取执行&#xff0…...

【数据结构】平衡二叉树

目录 一、平衡二叉树的介绍 二、平衡二叉树的插入 1、平衡二叉树的插入步骤 2、平衡二叉树的旋转 2.1左单旋 2.2右单旋 2.3左右双旋 2.4右左双旋 三、平衡二叉树的删除&#xff08;略&#xff09; 四、个人对平衡二叉树见解 五、平衡二叉树整体代码 一、平衡二叉树的…...

Minecraft服务端配置

✨✨前言 ✨✨ 我的世界大家肯定都不陌生&#xff0c;在网易拿下中国区的代理后&#xff0c;很多小伙伴也是都转向了网易版我的世界&#xff0c;网易版我的世界可以说已经做是的十分全面了&#xff0c;使用起来也十分方便&#xff0c;一部分小伙伴也是看重了网易庞大的玩家数量…...

yunUI组件库解析:图片上传与排序组件yImgPro

yunUI是笔者开源的微信小程序功能库。目前其中包含了一些复杂的功能组件。方便使用。未来它将分为组件、样式、js三者合为一体&#xff0c;但分别提供。 本文所用代码皆来源于组件库中的yImgPro组件。详细代码可至github查看。地址&#xff1a; yunUI 。 npm地址&#xff1a;yu…...

Java基础:回调函数

因为在看Android代码的时候发现了许多关于回调函数的知识, 所以去了解了一下. 对于我来说不太好懂, 因为我觉得看的那些博文的讲法对我来说很绕, 所以我在理解了之后想写一篇关于回调函数的博文来给和我一样理解能力稍差的人一点帮助. 回调函数的作用其实就是将需要这个功能的调…...

Springboot多环境配置

此文章是根据黑马程序员课程所做的笔记课程视频 多环境开发 ​ 什么是多环境&#xff1f;其实就是说你的电脑上写的程序最终要放到别人的服务器上去运行。每个计算机环境不一样&#xff0c;这就是多环境。常见的多环境开发主要兼顾3种环境设置&#xff0c;开发环境——自己用的…...

Java Number Math 类,超详细整理,适合新手入门

目录 一、什么是Java Number类&#xff1f; 二、Java Number类提供了哪些基本的数字操作&#xff1f; 三、什么是包装类&#xff1f; 所有的包装类都是抽象类 Number 的子类。 四、什么是Java Math 类 Test类案例&#xff1a;&#xff08;Math.PI 表示一个圆的周长与直径…...

俯瞰·明统系列·落霞与孤鹜齐飞、南征与北伐并举

尽江南百万兵&#xff0c;腰间宝剑血尤腥。 引言 元至正二十七年&#xff08;1367年&#xff09;四月&#xff0c;吴王朱元璋命中书右丞相徐达为征虏大将军、平章常遇春为副将军&#xff0c;率军25万由淮入河、北进中原&#xff08;第一次北伐&#xff09;。北伐中发布告北方官…...

Nodejs环境搭建和配置

Nodejs环境的搭建和配置 1、下载 官网&#xff1a;http://nodejs.cn/download/&#xff0c;选择windows64位 msi文件 2、安装和配置环境 双击安装之后&#xff0c;配置环境变量&#xff1a; ①系统变量那边创建NODE_PATH变量&#xff0c;值为nodejs文件夹的node_modules文…...

MybatisPlus------条件构造器Wrapper以及QueryWrapper用法(七)

MybatisPlus------条件构造器Wapper&#xff08;七&#xff09; Wrapper:条件构造器抽象类&#xff0c;最顶端父类 AbstarctWrapper&#xff1a;用于查询条件封装&#xff0c;生成sql的where条件。 QueryWrapper&#xff1a;查询条件封装&#xff08;可以用于查询、删除&#x…...

NetSuite Intercompany Framework 101

今朝&#xff0c;谈一谈Intercompany Framework&#xff0c;这是一个彰显NetSuite市场野心的基础功能框架。从20.2开始逐渐浮出水面&#xff0c;虽然经过过往的几个版本&#xff0c;不断推出组成功能&#xff0c;但目前仍然未见其全貌。 作为顾问&#xff0c;你必须关注它&…...

限时活动|凭徽章领披萨大奖,玩转Moonbeam治理论坛

动动手指&#xff0c;无需每天打卡&#xff0c;用刷手机的零碎时间领一份Web3惊喜&#xff01; 本次挑战的目标是鼓励大家参与社区治理、熟悉论坛操作。有关参与方式和原因的信息在Twitter上共享&#xff1a;有兴趣可以和ThinkWildCrypto一起探索论坛以解锁其功能、了解最近和正…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

用鸿蒙HarmonyOS5实现中国象棋小游戏的过程

下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...

VisualXML全新升级 | 新增数据库编辑功能

VisualXML是一个功能强大的网络总线设计工具&#xff0c;专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑&#xff08;如DBC、LDF、ARXML、HEX等&#xff09;&#xff0c;并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...

【深度学习新浪潮】什么是credit assignment problem?

Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...