Go Sonyflake学习与使用

文章目录

      • Sonyflake 特点
      • Sonyflake ID 结构
      • Sonyflake 使用场景
      • Sonyflake 与 Snowflake 的对比
      • Sonyflake 的实现
      • 安装 Sonyflake 库
      • 注意
      • 1. `panic: no point`
        • 解决方法:
      • 2. `panic: memory`
        • 解决方法:
      • 示例代码中的改进

Sonyflake 是一种分布式唯一 ID 生成器,它的设计灵感来自 Twitter 的 Snowflake 算法。Sonyflake 特别适用于分布式系统中生成唯一标识符,具有较高的性能和效率。相比于 Snowflake,Sonyflake 主要改进了 ID 中的时间精度、机器位和序列号位,适合在分布式环境中广泛应用。

Sonyflake 特点

  1. 时间戳

    • Sonyflake 使用 64-bit 的整数来生成唯一的 ID,其中时间戳占据了一部分位数。它的时间起点是 2014-09-01,精度为 10ms。
  2. 机器 ID

    • Sonyflake 支持通过 MAC 地址的后 16 位生成唯一的机器 ID,确保不同机器生成的 ID 唯一性。
  3. 序列号

    • 每台机器上都有一个 16-bit 的序列号,用于在同一个时间戳内生成不同的 ID。如果序列号达到最大值,会等待下一个时间戳。
  4. 高性能

    • Sonyflake 能够在高并发的分布式环境下快速生成 ID,且不会因分布式系统的时间同步问题导致重复 ID。

Sonyflake ID 结构

Sonyflake 生成的 64-bit ID 被划分为不同的字段,各个字段分别表示时间戳、序列号和机器 ID:

  • 39-bit 时间戳:从起点时间(2014-09-01)起以 10ms 为单位的时间戳。
  • 16-bit 序列号:用于在同一时间戳下生成不同的 ID。
  • 8-bit 机器 ID:用来区分不同的机器。

Sonyflake 使用场景

  1. 分布式系统:Sonyflake 非常适合在分布式系统中使用,因为它可以在不依赖中央协调器的情况下生成唯一 ID。

  2. 数据库主键生成:由于生成的 ID 是递增的,它们可以很自然地用于数据库的主键,这有助于提升数据库插入和查询效率。

  3. 日志系统和消息系统:Sonyflake 生成的 ID 能够确保在分布式环境中唯一性,因此在分布式日志系统、消息队列等场景中非常适用。

Sonyflake 与 Snowflake 的对比

特性SonyflakeSnowflake
时间精度10 毫秒1 毫秒
机器 ID8-bit MAC 地址后 16 位生成10-bit 机器 ID
序列号长度16-bit12-bit
时间戳起点2014-09-011970-01-01

Sonyflake 更适合时间粒度要求稍低的系统,特别是对机器标识符要求不同的环境。

Sonyflake 的实现

Sonyflake 常见的实现语言有 Go 语言。以下是一个简单的 Go 示例:

package mainimport ("fmt""github.com/sony/sonyflake"
)func main() {// 配置 Sonyflakesettings := sonyflake.Settings{}// 初始化 Sonyflakesf := sonyflake.NewSonyflake(settings)if sf == nil {fmt.Println("Sonyflake initialization failed!")return}// 生成唯一 IDid, err := sf.NextID()if err != nil {fmt.Println("Failed to generate ID:", err)return}fmt.Printf("Generated ID: %d\n", id)
}

安装 Sonyflake 库

在 Go 中,可以通过以下方式安装 Sonyflake:

go get github.com/sony/sonyflake

Sonyflake 非常适合在分布式环境中生成唯一标识符,其简单的设计和高效的性能使其在微服务架构中尤为受欢迎。

注意

在使用 Sonyflake 生成唯一 ID 时,如果遇到 panic: no pointpanic: memory 错误,通常是由于以下原因引起的:

1. panic: no point

这个错误提示的主要问题在于 Sonyflake 无法生成新的 ID,原因可能是时间戳没有前进。Sonyflake 依赖系统时钟来生成 ID,如果时钟回退或时间停滞,就可能导致这种情况。可能的原因包括:

  • 系统时钟回退:如果系统时间出现了倒退(例如通过手动设置时间或者 NTP 时间同步导致时钟回调),Sonyflake 会出现时间不一致的问题,无法生成新 ID。

  • 生成 ID 的速率太快:Sonyflake 的时间戳精度是 10ms,如果在同一个 10ms 内生成的 ID 数量超过了序列号的最大值(16-bit,最多 65536 个 ID),它就会进入等待状态,直到时间前进。如果时间没有前进足够多,可能会抛出 no point 错误。

解决方法:
  • 确保系统时间不会回退。可以通过配置系统时间同步服务(如 NTP)以确保系统时间是连续递增的。

  • 降低生成 ID 的速率,或者增加并发机器数量(即增加 machine ID 的数量),避免过多请求集中在同一个时间点。

  • 在程序中引入重试机制:当生成 ID 失败时,可以捕获错误并重试。

2. panic: memory

panic: memory 错误通常与内存分配有关。可能是由于以下原因导致的:

  • 内存不足:如果程序运行在内存有限的环境中,并且分配的资源不够,可能会导致内存溢出错误。

  • 内存泄漏:某些情况下,如果程序中存在内存泄漏,长期运行后可能会导致内存耗尽,从而出现 panic: memory

解决方法:
  • 检查程序的内存使用情况,确保在生成大量 ID 时,内存分配是足够的。

  • 检查程序是否存在内存泄漏,尤其是长时间运行的服务,定期监控内存使用情况并进行优化。

示例代码中的改进

你可以通过以下方式在 Sonyflake 使用中添加错误处理和重试机制,防止 panic

package mainimport ("fmt""log""time""github.com/sony/sonyflake"
)func main() {// 配置 Sonyflakesettings := sonyflake.Settings{}// 初始化 Sonyflakesf := sonyflake.NewSonyflake(settings)if sf == nil {log.Fatal("Sonyflake initialization failed!")}for i := 0; i < 10; i++ {id, err := generateID(sf)if err != nil {log.Printf("Failed to generate ID: %v\n", err)continue}fmt.Printf("Generated ID: %d\n", id)}
}// 重试生成 ID 的函数
func generateID(sf *sonyflake.Sonyflake) (uint64, error) {for retries := 0; retries < 3; retries++ { // 最多重试 3 次id, err := sf.NextID()if err != nil {if retries < 2 {log.Printf("Retrying... (%d/3)\n", retries+1)time.Sleep(10 * time.Millisecond) // 等待时间戳前进continue}return 0, err}return id, nil}return 0, fmt.Errorf("exceeded maximum retries")
}

在这个示例中,如果 NextID 失败,程序会进行重试,并等待时间戳前进,减少错误的发生概率。

通过这些改进,应该可以有效避免 panic: no pointpanic: memory 的问题。如果问题依然存在,请检查系统时间设置和程序的内存使用情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/54633.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[C#]winform 使用opencvsharp实现玉米粒计数

【算法介绍】 这段代码是使用OpenCvSharp库&#xff08;OpenCV的C#封装&#xff09;对图像进行处理&#xff0c;主要流程包括图像的二值化、腐蚀操作、距离变换、轮廓检测&#xff0c;并在原图上标出检测到的轮廓位置及数量。下面是对代码的详细解读&#xff1a; 初始化&…

Ubuntu22.04安装GNSS数据处理软件GAMIT/GLOBK

由于微信公众号改变了推送规则&#xff0c;为了每次新的推送可以在第一时间出现在您的订阅列表中&#xff0c;记得将本公众号设为星标或置顶喔~ 手把手带您安装gamit/globk软件~ &#x1f33f;前言 受朋友之托&#xff0c;出一期Ubuntu22.04安装GNSS数据处理软件——gamit软件…

【论文笔记】Are Large Kernels Better Teacheres than Transformers for ConvNets

Abstract 本文提出蒸馏中小核ConvNet做学生时&#xff0c;与Transformer相比&#xff0c;大核ConvNet因其高效的卷积操作和紧凑的权重共享&#xff0c;使得其做教师效果更好&#xff0c;更适合资源受限的应用。 用蒸馏从Transformers蒸到小核ConvNet的效果并不好&#xff0c;原…

MySQL篇(存储过程 触发器 存储函数)(持续更新迭代)

目录 一、存储过程 1. 简介 2. 特点 3. 语法 3.1. 创建 3.2. 调用 3.3. 查看 3.4. 删除 4. 示例 二、变量 1. 简介 2. 系统变量 2.1. 查看系统变量 2.2. 设置系统变量 2.3. 演示示例 3. 用户定义变量 3.1. 赋值 方式一 方式二 3.2. 使用 3.3. 演示示例 4.…

Rust - 字符串:str 与 String

在其他语言中&#xff0c;字符串通常都会比较简单&#xff0c;例如 “hello, world” 就是字符串章节的几乎全部内容了。 但是Rust中的字符串与其他语言有所不同&#xff0c;若带着其他语言的习惯来学习Rust字符串&#xff0c;将会波折不断。 所以最好先忘记脑中已有的关于字…

华为---代理ARP简介及示例配置

目录 1. 概念 2. 前提条件 3. 使用环境 4. 工作过程 5. 优点 6. 缺点 7. 示例配置 7.1 示例场景 7.2基本配置 7.3 配置端口隔离 7.4 开启代理ARP 7.4.1 VLAN内代理ARP 7.4.2 VLAN间代理ARP 7.4.3路由式ARP代理 1. 概念 代理ARP&#xff08;Proxy ARP&#xff09;&…

C#使用实体类Entity Framework Core操作mysql入门:从数据库反向生成模型

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

matlab恢复默认窗口布局

1.点击主页&#xff0c;选择布局 2.选择默认&#xff0c;即可恢复到默认的窗口布局

LIN总线CAPL函数—— 设置LIN报文字节间隔长度(linSetInterByteSpace)

&#x1f345; 我是蚂蚁小兵&#xff0c;专注于车载诊断领域&#xff0c;尤其擅长于对CANoe工具的使用&#x1f345; 寻找组织 &#xff0c;答疑解惑&#xff0c;摸鱼聊天&#xff0c;博客源码&#xff0c;点击加入&#x1f449;【相亲相爱一家人】&#x1f345; 玩转CANoe&…

利士策分享,如何培养良好的工作习惯?

利士策分享&#xff0c;如何培养良好的工作习惯&#xff1f; 在这个快节奏、高压力的职场环境中&#xff0c;培养良好的工作习惯不仅关乎个人职业发展的顺畅度&#xff0c; 更是提升工作效率、保持身心健康的关键。 以下是一些实用的建议&#xff0c;帮助你在日常工作中逐步构…

智慧水利采砂船在线监控平台:构建高效、智能的河道采砂监管体系

随着科技的不断发展&#xff0c;水利行业的智慧化转型也日益受到重视。智慧水利采砂船在线监控平台便是这一转型的重要成果之一。该平台主要服务于水政执法人员&#xff0c;针对取得河道采砂许可证的采砂公司及采砂船&#xff0c;实施在线自动监控&#xff0c;旨在提高监管效率…

iptables限制网速

1、使用hashlimit来限速 #从eth0网卡进入INPUT链数据&#xff0c;使用模块hashlimit 限制网速为100kb/s或2mb/s,超过限制的数据包会被DROP。OUTPUT链同理&#xff0c;mode为srcip&#xff0c;有4个mode选项: srcip&#xff08;默认匹配每个源地址IP&#xff0c;配置指定源地址…

【STM32开发笔记】移植AI框架TensorFlow到STM32单片机【上篇】

【STM32开发笔记】移植AI框架TensorFlow【上篇】 一、TFLM是什么&#xff1f;二、TFLM开源项目2.1 下载TFLM源代码2.2 TFLM基准测试说明2.3 TFLM基准测试命令 三、TFLM初步体验3.1 PC上运行Keyword基准测试3.2 PC上运行Person detection基准测试3.3 No module named numpy问题解…

保障电气安全的电气火灾监控系统主要组成有哪些?

电气火灾是什么&#xff1f; 电气火灾一般是指由于电气线路、用电设备、器具以及供配电设备出现故障性释放的热能&#xff1a;如高温、电弧、电火花以及非故障性释放的能量&#xff1b;如电热器具的炽热表面&#xff0c;在具备燃烧条件下引燃本体或其他可燃物而造成的火灾&…

递归基础训练-路径总和

路径总和 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 我们可以把之前的…

计算机组成原理(笔记4)

定点加减法运算 补码加法&#xff1a; 补码减法&#xff1a; 求补公式&#xff1a; 溢出的概念 在定点小数机器中,数的表示范围为|&#xff58;|<1。在运算过程中如出现大于1的现象,称为 “溢出”。 上溢&#xff1a;两个正数相加&#xff0c;结果大于机器所能表示的最…

数据结构-线性表的单链式存储结构图解及C语言实现

概念 链式存储&#xff1a;结点在存储器中的位置是任意的&#xff0c;即逻辑相邻的数据元素在物理上不一定相邻 链式存储结构也称非顺序映像或链式映像 图解 链式存储结构中结点一般有两个部分组成&#xff0c;即数据域(data)和指针域&#xff0c;数据域是用于存放数据的&…

开源ids snort (windows版)

Snort-IPS-on-Windows-main资源-CSDN文库 GitHub - eldoktor1/Snort-IPS-on-Windows: A comprehensive guide to installing and configuring Snort IPS on Windows, ensuring robust network security 手动打造Snortbarnyard2BASE可视化告警平台 - FreeBuf网络安全行业门户 …

JavaWeb--小白笔记07:servlet对表单数据的简单处理

这里的servlet对表单数据的处理是指使用IDEA创建web工程&#xff0c;再创建html和class文件进行连接&#xff0c;实现html创建一个表单网页&#xff0c;我们对网页中的表单进行填充&#xff0c;可以通过class文件得到网页我们填充的内容进行打印到控制台。 一登录系统页面---h…

Linux网络之UDP与TCP协议详解

文章目录 UDP协议UDP协议数据报报头 TCP协议确认应答缓冲区 超时重传三次握手其他问题 四次挥手滑动窗口流量控制拥塞控制 UDP协议 前面我们只是说了UDP协议的用法,但是并没有涉及到UDP协议的原理 毕竟知道冰箱的用法和知道冰箱的原理是两个层级的事情 我们首先知道计算机网…