分库分表 序列号耗尽 数据堆积

简介: 【7月更文挑战第15天】

有一个问题,不管你怎么设计雪花算法,你的序列号长度都有可能不够。比如前面标准的是12比特,那么有没有可能并发非常高,以至于12比特在某一个特定的时刻机器上的比特全部用完了吗?

解决方案:

  • 如果12比特不够,你就给更多比特,这部分比特可以从时间戳里面拿出来
  • 如果还不够,那么就让业务方等待一下,到下一个时刻,自然又可以生成新的ID了,也就是时间戳变了,这也算是一种变相的限流

所以可以这样回答:

一般来说可以考虑加长序列号的长度,比如缩减时间戳,然后挪给序列号ID。当然也可以更加粗暴地将64位地ID改成96位地ID,那么序列号ID就可以有三四十位。不过彻底地兜底方案还是要有地,我们可以考虑引入类似限流地做法,在当前时刻地ID已经耗尽以后,可以让业务方等一下。我们的时间戳一般都是毫秒数,那么业务方最多就会等一毫秒。

这里也有个问题就是:如果业务方等一下会有什么问题?

业务方等待算是一个比较危险的方案,因为这可能导致大量业务方阻塞住,导致线程耗尽或协程耗尽之类的问题,不过如果是偶发性的序列号不够,那么问题不大,因为阻塞的业务方很快就能拿到ID。
那么如果序列号耗尽不是偶发性一个问题,是长期的问题,还是要考虑从业务角度切割,不同业务使用不同的ID生成,就不要共享了。又或者,逼不得已还是用96或128位的。

设想一个场景:分库分表是按照ID除以32的余数来进行的,那么如果你的业务非常低频,以至于每个时刻都只生成了尾号为1的ID,那么是不是所有的数据都分到了一张表里呢?

解决方案也很简单:

  • 某一个时刻使用随机数作为起点,而不是每次从0开始计数
  • 使用上一个序列号作为起点,比如上一个序列只分到了3,那么下一个时刻的序列号就从4开始
目录
相关文章
|
11月前
|
网络协议 网络架构
广播是否不会增加网络通信量?
广播是否不会增加网络通信量?
43 0
|
2月前
|
消息中间件 Java Apache
消息队列 MQ产品使用合集之Broker内存瞬间增大一倍一般是什么导致的
阿里云消息队列MQ(Message Queue)是一种高可用、高性能的消息中间件服务,它允许您在分布式应用的不同组件之间异步传递消息,从而实现系统解耦、流量削峰填谷以及提高系统的可扩展性和灵活性。以下是使用阿里云消息队列MQ产品的关键点和最佳实践合集。
|
3月前
|
网络协议 Linux 网络安全
socket的心跳间隔和可用连接数的矛盾和平衡
socket的心跳间隔和可用连接数的矛盾和平衡
35 0
|
3月前
|
消息中间件 存储 NoSQL
消息队列之堆积问题分析
消息队列之堆积问题分析
109 1
|
3月前
|
前端开发 UED
面试官:【后端一次性返回10万条数据怎么处理/后端发送大数据量的数据如何处理】
面试官:【后端一次性返回10万条数据怎么处理/后端发送大数据量的数据如何处理】
99 0
|
9月前
|
监控 网络协议 安全
关于数据包丢失你需要知道的一切(以及如何避免它)
关于数据包丢失你需要知道的一切(以及如何避免它)
|
SQL Arthas 监控
MQ-消息堆积-业务线程阻塞案例分析
使用arthas定位【MQ-消息堆积】的原因
226 1
|
存储 消息中间件 Java
消息堆积问题究竟是什么
消息堆积问题究竟是什么
238 0
|
消息中间件 存储 监控
MQ的作用及如何解决消息队列的丢失、重复和积压问题
引入 MQ 消息中间件最直接的目的是:做系统解耦合流量控制,追其根源还是为了解决互联网系统的高可用和高性能问题。 系统解耦:用 MQ 消息队列,可以隔离系统上下游环境变化带来的不稳定因素,比如京豆服务的系统需求无论如何变化,交易服务不用做任何改变,即使当京豆服务出现故障,主交易流程也可以将京豆服务降级,实现交易服务和京豆服务的解耦,做到了系统的高可用。
168 0
|
SQL 运维 监控
redis瞬时查询返回量过多导致出口流量打满,影响系统整体响应时间
redis瞬时查询返回量过多导致出口流量打满,影响系统整体响应时间
403 0
redis瞬时查询返回量过多导致出口流量打满,影响系统整体响应时间