分布式ID系统设计(3)

分布式ID系统设计第三集

id-service-SnowFlake方案

第二集说了id-service-Segment-DB可以生成趋势递增的ID,但是ID号是可以计算的。不太适用于一些订单ID生成的场景。因为存在数据暴露的风险

比如我可以对比两天的订单ID号来大致计算出公司一天的订单量。这个有点危险。

所以我们需要id-serviceSnowFlake方案。
id-service-snowFlake完全沿用snowFlake方案的bit位设计。即"1+41+10+12"的方式组装id。对于workid的分配 基本上可以用手动配置。也可以借助Zk或者etcd CP实现的分布式协调者来配置。id-service-SnowFlake按照下面几个步骤启动:

1 启动id-servicesnowFlake。连接zk或者etcd。在id-service-snowflake父节点下检查自己是否已注册。
2 如果有就直接拿到自己的workId zk/etcd 生成的id 启动。
3 如果没有就在根下面生成一个节点id 当作自己的workId
4 start-service

弱依赖zk

如果想做到这一步就在本地osFile上。当zk出现问题的时候,而服务又要重启。这个时候这一步就能提高SLA.

解决时钟问题

因为这种方案依赖时间。如果机器的时钟发生了回拨。那么有可能生成重复的ID.那就需要解决这个问题。

1 首先服务注册到zk 检查自己是否写如果zk
2 如果写过 则用自己的系统时间与id-service-forever/{id}节点记录时间做比较 如果小于则认为机器时间发生了回拨,这个时候可以选择等待也可以选择失败退出。
3 如未写过 则直接注册进去。然后对比其他节点的系统时间判断自己系统时间是否正确。可以选择轮训对比 也可以选择相加/节点数对比
4 若时间正确就启动 写入zk
5 否则认为有回拨。
6 每隔一段时间上报自己的系统时间写入zk

由于强依赖时钟,对时钟要求很敏感。如果机器上有NTP时间服务同步的话。在他同步的时候会造成秒级的回拨。(不过一般的公司也不会有这种业务量 除了大厂)。解决方案就是在回拨的时候等待一段时间(1s 2s 这样)或者直接重试.再或者直接摘除节点 告警。

代码实现也很简单
/发生了回拨,此刻时间小于上次发号时间
if (timestamp < lastTimestamp) {

        long offset = lastTimestamp - timestamp;if (offset <= 5) {try {//时间偏差大小小于5ms,则等待两倍时间wait(offset << 1);//waittimestamp = timeGen();if (timestamp < lastTimestamp) {//还是小于,抛异常并上报throwClockBackwardsEx(timestamp);}    } catch (InterruptedException e) {  throw  e;}} else {//throwthrowClockBackwardsEx(timestamp);}}

从使用情况来看 基本没有出现过问题。

id-service 情况

作为一个基架服务。性能应该是最关心的 能在4C8G机器上跑出4w QPS.可用性也能保证9999.提供给6个BU 一天有个几百万的使用量。作为基架。高SLA和高性能是必须要保证的。

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

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

相关文章

c++ | 字符串与指针的恩断情仇

我想&#xff0c;c/c中难的不是指针&#xff0c;而是其中的变化&#xff0c;尤其是思维的转变。很多东西 就是容易掉进陷阱。好在&#xff0c;你我都是善于思考的码农&#xff01; 大致情况是这样的&#xff0c;底层<–>c语言<–>c<–>应用 而数据的传输的最…

【Git】 如何删除本地分支

注意&#xff1a; 删除本地分支之前&#xff0c;请确保使用以下git checkout命令切换到您不想删除的另一个分支 切换分支&#xff1a; git checkout branch_name删除本地分支&#xff1a; git branch -D local_branch_name

【MongoDB】Windows 安装MongoDB 6.0

一、下载安装包 安装包下载地址https://www.mongodb.com/try/download/community这里我选择的是 二、解压并安装 1、解压 这里我将压缩包解压到了D盘&#xff0c;并重命名成了mongodb&#xff0c;解压后的目录如下&#xff1a; 2、创建配置文件 在D:\mongodb下新建conf目录…

网络工程师应知应会:基础知识(4)

一、虚拟路由冗余协议 (Virtual Router Redundancy Protocol&#xff0c;VRRP) 解决局域网中配置静态网关出现单点失效现象的路由协议&#xff0c;可以配置一个交换机群集。VRRP 允许两台或多台交换机使用同一个虚拟的 MAC 地址和 IP 地址&#xff0c;看起来多台交换机就像是一…

【触想智能】4U触摸工控机具有哪些优势?

工控机也叫工控主机&#xff0c;和我们常见的普通电脑主机是一样的&#xff0c;都是由CPU、主板、内存、硬盘、电源以及机箱组成的。 工控机有很多分类&#xff0c;有无风扇工控机、嵌入式工控机、上架式工控机、4U触摸工控机等。上架式工控机在市场上是比较受欢迎的&#xff0…

Django实战项目-学习任务系统-发送邮件通知

接着上期代码内容&#xff0c;继续完善优化系统功能。 本次增加发送邮件通知功能&#xff0c;学习任务系统发布的任务&#xff0c;需要及时通知到学生用户知晓。 由于目前智能手机普及&#xff0c;人人都离不开手机&#xff0c;所以手机端接收通知信息更加及时有效。 其中微信…

HTTP调试代理工具/Proxyman

Proxyman专为开发人员和网络爱好者设计&#xff0c;它允许用户拦截、查看和修改所有传入和传出的网络请求&#xff0c;并提供详细的分析和调试功能。 Proxyman支持HTTP、HTTPS和WebSocket协议&#xff0c;因此&#xff0c;可以轻松捕获和查看这些协议下的网络流量。用户可以使…

superagent 库

superagent 是一个流行的 JavaScript 库&#xff0c;用于在浏览器和 Node.js 环境中进行 HTTP 请求。它提供了简洁的 API&#xff0c;使得发送异步请求变得非常容易。 以下是一个使用 superagent 的简单示例&#xff1a; 在浏览器环境中&#xff1a; // 发送 GET 请求 supe…

ThingsBoard模板化

1、模板化概念 模板化是使用预定义模板动态地将值插入或替换到文本中的过程。这些模板充当变量的占位符,以后可以用实际数据填充这些变量。 在规则引擎上下文中,模板用于在运行时从传入消息中提取数据。这在规则节点配置中特别有用,其中模板化允许通过用传入消息的实时值替…

Python 批量删除Excel的所有图片对象

Python批量删除xlsx文件的所有图片对象&#xff0c;对于已经嵌入的单元格无法处理 能够将所有表的图片对象都给删除 适用于文件太大&#xff0c;无法打开的情况 from openpyxl import load_workbook# 加载Excel文件 wb load_workbook(r原始文件路径)# 获取所有的工作表 she…

自定义的卷积神经网络模型CNN,对图片进行分类并使用图片进行测试模型-适合入门,从模型到训练再到测试,开源项目

自定义的卷积神经网络模型CNN&#xff0c;对图片进行分类并使用图片进行测试模型-适合入门&#xff0c;从模型到训练再到测试&#xff1a;开源项目 开源项目完整代码及基础教程&#xff1a; https://mbd.pub/o/bread/ZZWclp5x CNN模型&#xff1a; 1.导入必要的库和模块&…

PP-Matting:trimap free的高精度自然图像抠图

论文&#xff1a;https://arxiv.org/abs/2204.09433 代码&#xff1a;https://github.com/PaddlePaddle/PaddleSeg 1、动机 在自然图像抠图领域&#xff0c;大多数方法都是基于Trimap来做抠图&#xff0c;这种trimap-based的方式在抠图时还需要用户绘制一个trimap作为模型输入&…

SpringBoot--Web开发篇:含enjoy模板引擎整合,SpringBoot整合springMVC;及上传文件至七牛云;restFul

SpringBoot的Web开发 官网学习&#xff1a; 进入spring官网 --> projects --> SpringBoot --> LEARN --> Reference Doc. --> Web --> 就能看到上述页面 静态资源映射规则 官方文档 总结&#xff1a; 只要是静态资源&#xff0c;放在类路径下&#xff1…

整理笔记——0欧电阻、电感、磁珠

设计电路时&#xff0c;经常用到0欧电阻、电感、磁珠&#xff0c;这三个基础电子原件万用表量都是“短路”&#xff0c;这三者之间有什么区别&#xff1f;什么情况下用什么原件&#xff1f; 一、0欧电阻 0欧电阻&#xff0c;并不是指元件的电阻值为0&#xff0c;而是电阻值很小…

使用免费 FlaskAPI 部署 YOLOv8

目标检测和实例分割是计算机视觉中关键的任务&#xff0c;使计算机能够在图像和视频中识别和定位物体。YOLOv8是一种先进的、实时的目标检测系统&#xff0c;因其速度和准确性而备受欢迎。 Flask是一个轻量级的Python Web框架&#xff0c;简化了Web应用程序的开发。通过结合Fla…

SpringBoot 日志

一、概述 日志是程序的重要组成部分&#xff0c;程序报错了&#xff0c;我们可以通过查看日志信息排除和定位问题。 二、日志格式 在启动 SpringBoot 项目时&#xff0c;控制台中默认会打印一些日志&#xff0c;下面我们截取一段日志信息&#xff0c;分析一下日志的格式&…

【蓝桥每日一题]-二分类型(保姆级教程 篇3) #路标设置 #跳石头

今天接着讲二分题型 目录 题目&#xff1a;路标设置 思路&#xff1a; 题目&#xff1a;跳石头 思路&#xff1a; 题目&#xff1a;路标设置 思路&#xff1a; 求&#xff1a;放n个路标后的最小空旷指数 二分查找&#xff1a;对空旷指数进行二分 二分依据: 该空旷指数下放…

支付宝本地生活团购服务商如何申请?两个方法教给你

支付开宝的本地生活来了&#xff01;按支付宝财大气粗的做法&#xff0c;它一旦要推什么项目&#xff0c;那自然会在前期疯狂洒钱&#xff0c;以求通过这种模式快速占领市场。 所以&#xff0c;这次支付宝要推本地生活项目&#xff0c;这一贯做法自然得跟上&#xff0c;只是这…

飞致云及其旗下1Panel项目进入2023年第三季度最具成长性开源初创榜单

2023年10月26日&#xff0c;知名风险投资机构Runa Capital发布2023年第三季度ROSS指数&#xff08;Runa Open Source Startup Index&#xff09;。ROSS指数按季度汇总并公布在代码托管平台GitHub上年化增长率&#xff08;AGR&#xff09;排名前二十位的开源初创公司和开源项目。…

win10pycharm和anaconda安装和环境配置教程

windows10 64位操作系统下系统运行环境安装配置说明 下载和安装Anaconda&#xff0c;链接https://www.anaconda.com/download 下载完后&#xff0c;双击exe文件 将anaconda自动弹出的窗口全部关掉即可&#xff0c;然后配置高级系统变量 根据自己的路径&#xff0c;配置…