【实战场景一】设计一个分布式环境下全局唯一的信号器

news2024/9/29 3:20:05

前面,我们罗列了一些面试时可能会到的一些技术上的问题。但都是基于理论,也就是外面所说的八股文。应付一些基础的或者中级的开发岗位来说,是没什么问题的,但如果想拿高薪,或者升职的话,仅靠八股文是仅仅不够的,所以今天就开始进行场景实战,以此来提升大家的内功。

如何设计一个分布式环境下全局唯一的信号器

今天,叶秋面试到最后环节,一位美女面试官问了一个分布式的基础实战问题:如果让你去设计一个分布式环境下的全局唯一的信号器,你会怎么设计?

这里先说下本人的思路,完整的正确答案放到后面。

我刚听到这个问题第一反应就是:

  1. 使用UUID

优点:全球唯一,如果后续有项目迁移或者数据合并之类的,就完全不用担心数据冲突问题

缺点:使用字符串存储,会消耗一定量的存储空间,如果数据比较大,会很耗性能。

  1. 使用数据库自增的id

优点:它的优点就是UUID的缺点,简单且节省空间和性能

缺点:它的缺点就是UUID的优点,数据库自增的id是仅限于单库,如果后续数据合并冲突问题会很令人头疼。可以说,它和UUID的优缺点刚好相反。

  1. 使用雪花算法生成的ID

优点:它是个long型ID,灵活方便,不担心数据冲突的问题

缺点:这个没说上来,是叶秋考虑不周了。(一般分布式项目中使用的都是雪花算法,倒是没考虑到它的缺点)。

这边说了一些通用对方法,但实际上还要考虑到具体的场景和产品需求来确定采用哪一种方法。

只见那个美女面试官,微笑着点了点头说,整体来看,说的还是不错,但还是少了一种常用的方法,然后巴拉巴拉了一堆,最后总结如下:

  1. UUID

利用程序生成的ID,一般来说全球唯一。

优点:

  1. 简单,代码方便,且生成ID性能非常好,基本不会有性能问题。
  2. 全球唯一,在遇见数据迁移,系统数据合并,或者数据库变更等情况下,可以从容应对。

缺点:

  1. 没有排序,无法保证趋势递增。
  2. UUID往往是使用字符串存储,查询的效率比较低。
  3. 存储空间比较大,如果是海量数据库,就需要考虑存储量的问题。
  4. 传输数据量大
  5. 不可读。

是叶秋菜鸡了,自以为回答的很不错了,结果还是漏说了许多,看来还得加强学习。基础不牢固。

  1. 数据库自增长序列或字段

最常见的方式。利用数据库,当前数据库唯一。

优点:

  1. 简单,代码方便,性能可以接受。
  2. 数字ID天然排序,对分页或者需要排序的结果很有帮助。

缺点:

  1. 不同数据库语法和实现不同,数据库迁移的时候或多数据库版本支持的时候需要处理。
  2. 在单个数据库或读写分离或一主多从的情况下,只有一个主库可以生成。有单点故障的风险。
  3. 如果遇见多个系统需要合并或者涉及到数据迁移会相当痛苦。
  4. 分表分库的时候会有麻烦。

优化方案:

针对主库单点,如果有多个Master库,则每个Master库设置的起始数字不一样,步长一样,可以是Master的个数。比如:
Master1 生成的是 1,4,7,10,Master2生成的是2,5,8,11 Master3 生成的是 3,6,9,12。这样就可以有效生成集群中的唯一ID,也可以大大降低ID生成数据库操作的负载。

汗,真是汗颜,看到这个优化方案,真是醍醐灌顶啊,竟然连这个也没想到,顿感对不起当前拿的工资了。是安逸太久了,不说了,这次要真去面试了。

  1. snowflake算法

snowflake 是 twitter 开源的分布式ID生成算法,其核心思想为,一个long型的ID:

在这里插入图片描述

优点:

  1. 不依赖于数据库,灵活方便,且性能优于数据库。
  2. ID按照时间在单机上是递增的。

缺点:

  1. 在单机上是递增的,但是由于涉及到分布式环境,每台机器上的时钟不可能完全同步,也许有时候也会出现不是全局递增的情况。

4 Redis生成ID

我们可以通过Redis生成全局唯一的ID。用Redis的原子操作 INCRINCRBY来实现。

可以使用Redis集群来获取更高的吞吐量。假如一个集群中有5台Redis。可以初始化每台Redis的值分别是1,2,3,4,5,然后步长都是5。各个Redis生成的ID为:

A:1,6,11,16,21
B:2,7,12,17,22
C:3,8,13,18,23
D:4,9,14,19,24
E:5,10,15,20,25

优点:

  1. 不依赖于数据库,灵活方便,且性能优于数据库。
  2. 数字ID天然排序,对分页或者需要排序的结果很有帮助。

缺点:

  1. 如果系统中没有Redis,还需要引入新的组件,增加系统复杂度。
  2. 需要编码和配置的工作量比较大。

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

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

相关文章

2022年直播电商成交额,更是达到了24816亿元的成交额

近年来移动网络覆盖率、网速提升,直播行业不在是陌生的行业,直播也诞生了繁多的领域,游戏直播、户外直播等,当然还有今天的主题“直播带货”。直播带货是线上销售模式的一种,由衷是为了更好的把商品展示给用户观看&…

【Redis】Redis 常用数据类型操作 ② ( 数据库操作 | 切换数据库 | 查询当前数据库键个数 | 清空当前数据库 | 清空所有数据库 )

文章目录一、Redis 数据库操作1、切换数据库2、查询当前数据库键个数3、清空当前数据库4、清空所有数据库一、Redis 数据库操作 在之前的博客 【Redis】Redis 数据库 安装、配置、访问 ( Redis 简介 | 下载 Redis 安装包 | 安装 Redis 数据库 | 命令行访问 Redis | 使用可视化工…

保姆级Vue3+Vite项目实战正则在线校验工具

写在前面注:本文首发掘金签约专栏,此为文章同步!本文为 Vue3Vite 项目实战系列教程文章第五篇,系列文章建议从头观看效果更佳,大家可关注专栏防走失!点个赞再看有助于全文完整阅读!此系列文章主…

为什么PMP的含金量会被质疑呢?(含pmp资料)

1、考的人越来越多,物以稀为贵,且PMP也不是非考不可,也不是项目管理的门槛证书; 2、PMP的通过率是越来越高,就有种我上我也行的错觉,随便一考就考过了,还谈什么含金量? 3、PMP考了不…

Windows中MySQL 8.x版本忘记密码如何重设

Windows中MySQL 8.x版本忘记密码如何重置 文章目录Windows中MySQL 8.x版本忘记密码如何重置一、前言二、重置密码操作1、停止MySQL服务2、以安全模式启动MySQL服务3、无密码登录mysql4、重置登录密码5、验证密码是否重置成功三、最后我想说一、前言 好久之前在电脑下载的MySQL…

【Linux】初学Linux你需要掌握这些基本指令(二)

目录 1.man指令 2.cp指令 3.mv指令 4.tree指令 5.echo指令 6.more指令 7.less指令(重要) 8.head与tail指令 9.date指令 显示时间常用参数: 设置时间常用参数: 10.cal指令 11.find & whereis & which指令 …

为知笔记 wiz 支持实时预览的md markdown编辑器 对比 typora Vditor

1.为什么退回到为知笔记老版本 升级到为知笔记最新版(wiznote X)已经快一年了(最近编辑文档不多,所以一直也将就使用,并且告诉自己习惯了新版就会更舒服),最近还是退回到老版本了. (1)新版本没有了顶部编辑菜单,全靠号提示,感觉不方便.好像在用命令行编辑文档.完全不喜欢这种…

OpenCV Canny边缘检测

本文是OpenCV图像视觉入门之路的第13篇文章,本文详细的介绍了Canny边缘检测算子的各种操作,例如:Canny算子进行边缘检测等操作。 Canny函数是OpenCV中用于执行边缘检测的函数之一,其参数包括: threshold1:…

【NVMEM子系统】一、Efuse介绍及安全启动浅析

个人主页:董哥聊技术我是董哥,嵌入式领域新星创作者创作理念:专注分享高质量嵌入式文章,让大家读有所得!文章目录1、Efuse是什么2、OTP是什么3、什么是Secure Boot4、CPU内部安全机制4.1 bootROM4.2 iRAM4.3 eFUSE4.5 …

高通开发系列 - USB不能正常工作

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 返回高通开发系列 - 总目录 目录 USB不能正常工作问题概述问题分析USB不能正常工作 问题概述 升级完linux内核后,msm-4.9内核中usb、adb…

[22] Rodin: A Generative Model for Sculpting 3D Digital Avatars Using Diffusion

paper: https://arxiv.org/abs/2212.06135 总结:提出一种基于扩散模型和tri-plain features的3D虚拟人像生成方法。该方法包含多个模型,需要多次训练: 使用Blender synthetic pipeline(Fake it untill you make it)生…

LeetCode-257. 二叉树的所有路径

目录题目分析递归法题目来源 257. 二叉树的所有路径 题目分析 前序遍历以及回溯的过程如图: 递归法 1.递归函数参数以及返回值 要传入根节点,记录每一条路径的path,和存放结果集的result,这里递归不需要返回值,代…

时间序列预测--基于CNN的股价预测(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 时间序列预测有很多方法,如传统的时序建模方法ARIMA、周期因子法、深度学习网络等,本次实验采用最简单的…

趣味三角——第11章——一个著名的公式

目录 1. 著名无限积公式简述及证明 2. Jules Lissajous 和他的图形(Jules Lissajous and His Figures) 11章 一个著名的公式 The prototype of all infinite processes is repetition. . . . Our very concept of the infinite derives from the notion that what has bee…

umap 速度测试

今天终于把umap的速度给测了一下,结果如下 预处理文件(83万的数据量) # import scanpy as sc # adatasc.read("/DATA1/zhangjingxiao/yxk/dataset/FullMouseBrain/FullMouseBrain_raw.h5ad") # print(adata) # sc.pp.normalize_…

HTTP协议---详细讲解

目录 一、HTTP协议 1.http 2.url url的组成: url的保留字符: 3.http协议格式​编辑 ①http request ②http response 4.对request做出响应 5.GET与POST方法 ①GET ②POST 7.HTTP常见Header ①Content-Type:: 数据类型(text/html等)在上文…

H5/APP客服端源码/uniapp在线客服系统源码开源了,全源码代码解读及发行安装教程...

前言 目前,即时通讯在线咨询在网站、APP、小程序中已经是不可获取的功能,尤其是专注于线上营销的商家,迫切需要一套可以随时与访客交流的即时通讯工具。 如果使用市面上的SaaS客服系统,会在功能上受限制,需要开通高级V…

AWS Control Tower

Hello大家好,在本课时我们将讨论AWS Control Tower。 **AWS Control Tower是AWS organizations的一个功能延伸,**它是设置在organizations的上层,并为您提供一些额外的控制。 通过Control Tower可以创建一个Landing zone,Landing…

linux安装jenkins

1. 官网寻找安装方式 进入到jenkins官网,找到对应的下载页面:https://www.jenkins.io/download/ 根据自己系统还有想要使用的版本,进行选择即可。这里我们使用CentOS作为示例,版本选择长期支持版(LTS) 2.…

DaVinci:色彩扭曲器

调色页面:色彩扭曲器 Color:Color Warper色彩扭曲器 Color Warper是一个非常强大的调色工具,它基于网格的形式,能将控制点从一个位置“扭曲”到另一位置,从而可同时调整两个颜色属性:“色相 - 饱和度”&…