[go]分布式系统之snowflake与锁

news2024/11/15 15:58:35

文章目录

    • 分布式id生成器
    • 分布式锁
    • 负载均衡

go语言在网络服务模块有着得天独厚的优势; https://www.cnblogs.com/thepoy/p/14573822.html中详细介绍了涉及到的分布式相关技术。

分布式id生成器

Snowflake(雪花算法),由Twitter提出并开源,可在分布式环境下用于生成唯一ID的算法。
在这里插入图片描述

生成的Id是64位(int64)数值类型,包含4部分:

  • 41bit的时间戳(毫秒):一般是相对系统上线时间的毫秒数(可用69年);
  • 5bit的数据中心id+5bit的机器id:表示工作的计算机;实际使用时可根据情况调整两者间的比例;
  • 12bit序列号:区分同一个计算机在相同毫秒时间内的生产的ID(支持1毫秒4096条);

github.com/bwmarrin/snowflake提供了一个轻量级的实现:

package main

import (
    "fmt"
    "github.com/bwmarrin/snowflake"
	"time"
)

func main() {
    n, err := snowflake.NewNode(time.Now().UnixMilli() % 1024)
    if err != nil {
        fmt.println(err)
        os.Exit(1)
    }

    for i := 0; i < 10; i++ {
        id := n.Generate()
        fmt.Println("id", id.Int64())
        fmt.Println(
            "node: ", id.Node(),
            "step: ", id.Step(),
            "time: ", id.Time(),
        )
    }
}

分布式锁

可通过redis的setnx来模拟分布式锁:

  • 设定成功时,为上锁;
  • 释放锁时,删除对应的键;
import (
    "fmt"
    "sync"
    "time"

    "github.com/go-redis/redis"
)

func incr() {
    client := redis.NewClient(&redis.Options{
        Addr:     "localhost:6379",
        Password: "", // no password set
        DB:       0,  // use default DB
    })

    var lockKey = "counter_lock"
    var counterKey = "counter"

    // lock
    resp := client.SetNX(lockKey, 1, time.Second*5)
    lockSuccess, err := resp.Result()
    if err != nil || !lockSuccess {
        fmt.Println(err, "lock result: ", lockSuccess)
        return
    }

    // counter ++
    getResp := client.Get(counterKey)
    cntValue, err := getResp.Int64()
    if err == nil {
        cntValue++
        resp := client.Set(counterKey, cntValue, 0)
        _, err := resp.Result()
        if err != nil {
            // log err
            println("set value error!")
        }
    }
    println("current counter is ", cntValue)

    // unlock
    delResp := client.Del(lockKey)
    unlockSuccess, err := delResp.Result()
    if err == nil && unlockSuccess > 0 {
        println("unlock success!")
    } else {
        println("unlock failed", err)
    }
}

也可通过zookeeper或etcd来模拟;

负载均衡

从n个服务节点中,挑选一个的思路了:

  • 按顺序挑
  • 随机挑一个
  • 根据某种权重,对节点进行排序,选择权重最大/小的那一个

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

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

相关文章

六问 Kafka 为啥那么牛

1 Kafka 简介 1.1 Kafka 概述 Kafka 是一个分布式的基于发布/订阅模式的消息队列&#xff0c;依靠其强悍的吞吐量&#xff0c;Kafka 主要应用于大数据实时处理领域。在数据采集、传输、存储的过程中发挥着举足轻重的作用。 Apache Kafka 由 Scala 写成&#xff0c;是由Apache软…

转行IT行业学什么比较好?月薪过万要多久?

学什么&#xff0c;比穿什么衣服的问题更难&#xff0c;因为职业的背后&#xff0c;更多的是抉择而不是选择&#xff0c;选错一件衣服可以重来&#xff0c;而选错一个职业所面对的结果&#xff0c;是非常让人痛苦的。 本文是小编对想转行IT行业的你最真挚的建议。 任何事情&a…

QT5.14.2搭建Android开发环境

项目需求:因项目需求需要使用QT开发功能类似的一个跨平台项目&#xff0c;基于Android系统上运行单机软件。 开发环境&#xff1a;Windows 10 QT5.14.2 搭建步骤&#xff1a; 1、安装Java软件&#xff0c;配置环境变量 java软件安装可以选择默认安装位置&#xff0c;我下载…

KNN学习

学习B站 【什么是KNN&#xff08;K近邻算法&#xff09;&#xff1f;【知多少】】 https://www.bilibili.com/video/BV1Ma411F7Y4/?share_sourcecopy_web&vd_sourced928ac2eb2c6b562d9488d15f78dfbf4 什么是KNN NN neural network 并不是 KNN 是k-Nearest Neighbors K 近…

[附源码]Node.js计算机毕业设计孤儿院救助平台Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

jsp+ssm计算机毕业设计大学生就业信息检索系统【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…

《Python多人游戏项目实战》第四节 实现房间功能

目录 4.1 确定同一聊天室玩家及房主 4.2 绘制开始或准备按钮 4.3 实现按钮功能 4.4 完整代码下载地址&#xff1a; 在本节&#xff0c;我们会在原有的程序基础上加上房间的功能。当玩家打开游戏窗口后&#xff0c;会自动出现在1号或者2号聊天室。只有当1号聊天室所有玩家准…

【5G MAC】Beam Failure Recovery(BFR)

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

https建立连接加解密原理

https建立连接加解密原理 本文目录https建立连接加解密原理加密并建立连接过程CA的作用服务器获取数字证书过程客户端认证证书过程如何防止中间人攻击解决问题的方法加密并建立连接过程 1.客户端发起HTTPS请求 用户在浏览器里输入一个https网址&#xff0c;然后连接到server的…

EEG- gan:用于脑电图(EEG)大脑信号的生成对抗网络2018

EEG-GAN: Generative adversarial networks for electroencephalograhic (EEG) brain signals Abstract 生成对抗网络(GANs)最近在涉及图像的生成应用中非常成功&#xff0c;并开始应用于时间序列数据。在这里&#xff0c;我们将EEG- gan描述为生成脑电图(EEG)大脑信号的框架…

18-19-20 - 深入特权级转移

---- 整理自狄泰软件唐佐林老师课程 文章目录1. 初识任务状态段&#xff08;TSS&#xff0c;Task State Segment&#xff09;1.1 TSS中不同特权级的栈信息1.2 特权级转移时的栈变化1.3 问题一1.4 目标实验&#xff08;操作系统雏形&#xff09;1.5 编程实验&#xff08;特权级转…

QT系列第3节 QT中混合UI设计

QT开发过程中&#xff0c;经常使用Qt designer设计器和代码方式结合来及进行ui设计&#xff0c;本节将介绍这两种方式混合进行ui开发。 目录 1.工程添加图片资源 2.添加菜单 3.添加工具栏 4.简单文本编辑器实现 5. QT Creator常用快捷键 1.工程添加图片资源 &#xff08;…

javaee之MyBatis框架1

什么是MyBatis框架 先来说一下&#xff0c;什么是框架&#xff0c;框架就是不断升级的半成品软件 框架主要解决的问题&#xff1a;就是应用自身的设计与具体实现解耦&#xff0c;重点放到应用自身的设计上&#xff0c;而不是具体技术实现&#xff0c;具体的技术实现是由底层支…

【JVM知识】插入式注解处理器实现java编程规范检测

【JVM知识】插入式注解处理器实现java编程规范检测一、前言二、Java 规范提案三、注解分类四、java编译器五、插入式注解处理器六、代码规范检测实现&#xff08;代码示例&#xff09;七、项目版本统一控制实现&#xff08;代码示例&#xff09;一、前言 最近在看**《深入理解…

人人都能看懂的Spring原理,看完绝对不会懵逼

人人都能看懂的Spring原理&#xff0c;绝对不会懵逼为什么要使用Spring&#xff1f;Spring的核心组件Spring是如何实现IOC和DI的&#xff1f;定义了BeanDefinition扫描加载BeanDefinition根据BeanDefinition进行Bean的实例化和初始化实例化属性赋值保存到单例缓冲池一个Bean从创…

【Java开发】 Staffjoy 01 :项目目标及案例需求

Staffjoy 是 Spring Boot & Kubernetes 云原生微服务实践&#xff0c;是一个贴近生产的微服务云原生教学案例&#xff0c;本文依波波老师的课程。新开了一个坑&#xff0c;希望能搞懂微服务框架&#xff0c;感兴趣的同学也欢迎讨论~ 目录 1 Staffjoy 项目目标 2 Staffjoy…

【Java寒假打卡】Java基础-StringBuilder类

【Java寒假打卡】Java基础-StringBuilder类一、概述二、构造方法三、常用方法四、StringBuilder提高效率的原理五、StringBuilder实现字符串反转一、概述 也就是使用String 拼接字符串每一次都要开辟新的堆内存空间&#xff0c;使用StringBuilder不需要开辟新的内存空间 String…

软件架构设计的七大原则

学习设计原则是学习设计模式的基础。千万不能形成强迫症。当碰到业务复杂的场景时&#xff0c;需要随机应变。 在实际开发过程中&#xff0c;并不是一定要求所有代码都遵循设计原则&#xff0c;而是要在适当的场景遵循设计原则&#xff0c;就可以帮助开发者设计出更加优雅的代…

glibc内存管理那些事儿

Linux内存空间简介 32位Linux平台下进程虚拟地址空间分布如下图: 进程虚拟地址空间分布 图中&#xff0c;0xC0000000开始的最高1G空间是内核地址空间&#xff0c;剩下3G空间是用户态空间。用户态空间从上到下依次为stack栈(向下增长)、mmap(匿名文件映射区)、Heap堆(向上增长…

网络编程之IO多路复用

目录 一. 同步与阻塞 1.1 同步阻塞 1.2 同步非阻塞 1.3 异步阻塞 1.4 异步非阻塞 1.5 I/O多路 二.多路复用的技术 2.1 UNIX I/O Models 2.1.1 blocking I/O 2.1.2 nonblocking I/O 2.1.3 I/O Multiplexing Model 2.1.4 SIGIO 2.1.5 asynchronous I/O 2.2 IO多路复…