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,一经查实,立即删除!

相关文章

Pillow:Python图像处理库详解

Pillow&#xff08;之前称为PIL&#xff0c;Python Imaging Library&#xff09;是一个开源的Python图像处理库&#xff0c;它提供了广泛的文件格式支持、强大的图像处理能力和易于使用的API。Pillow可以处理几乎所有类型的图像文件&#xff0c;并且可以进行复杂的图像操作&…

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

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

在 Webpack 中配置多入口应用并实现公共依赖的提取

1. 配置多入口点 首先&#xff0c;在 webpack.config.js 文件中定义多个入口点。你可以通过对象形式来指定多个入口点&#xff0c;每个入口点对应一个输出文件。 const path require(path);module.exports {entry: {app1: ./src/app1/index.js,app2: ./src/app2/index.js},…

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

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

Java使用Map数据结构配合函数式接口存储方法引用

Java使用Map数据结构配合函数式接口存储方法引用 背景 需求中存在这样一直情况 一个国家下面有很多的州 每个州对应的计算日期方法是不同的 这个时候 就面临 可能会有很多if else 为了后期维护尽量还是不想采用这个方式&#xff0c;那么就可以使用策略模式 但是 使用策略带来的…

【论文笔记】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.…

富文本编辑器wangEdittor使用入门

一、wangEdittor介绍 富文本编辑器为开源产品wangEditor。wangEditor是一款轻量级Web富文本编辑器&#xff0c;配置方便&#xff0c;使用简单。读者可在其官网和GitHub仓库进行更多了解。主要有以下功能&#xff1a; 1&#xff09;图文混排 wangEditor可以编辑的内容比较丰富…

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;帮助你在日常工作中逐步构…

大语言模型量化方法GPTQ、GGUF、AWQ详细原理

大语言模型量化的目的是减少模型的计算资源需求和存储占用&#xff0c;同时尽量保持模型的性能。以下是几种常见的量化方法的原理&#xff1b; 1. GPTQ (Gradient-based Post-training Quantization) GPTQ 是一种基于梯度的后训练量化方法&#xff0c;主要目的是在减少浮点计…

macOS 系统中python的安装步骤

访问Python官网&#xff1a; 打开浏览器&#xff0c;访问Python的官方网站&#xff08;https://www.python.org/&#xff09;。 下载Python安装包&#xff1a; 在官网首页找到“Downloads”链接&#xff0c;点击进入下载页面。选择适用于macOS的安装包。在撰写本文时&#xff…

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

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

Ubuntu USB设置别名

在 Ubuntu 中&#xff0c;可以通过创建 udev 规则为 USB 设备设置别名。这样你可以通过自定义的别名访问设备&#xff0c;而不是使用随机分配的设备节点&#xff08;例如 /dev/ttyUSB0&#xff09;。 1. 确认设备信息 首先&#xff0c;你需要找到设备的相关信息&#xff08…

linux 内存屏障(barrier)分析

谈起内存屏障,大家感觉这个"玩意儿"很虚,不太实际,但是内核代码中又广泛地可以看到起身影。内存屏障,英文barrier,这个"玩意儿"它还不太好去定义它。barrier,中文翻译为栅栏&#xff0c;栅栏大家都见过,现实生活中就是防止他人或者动物非法闯入而用来进行隔…

iptables限制网速

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