京东面试题 – 有一个生成唯一串的需求,并发请求量非常大,该如何实现?

面试题分类: Architecture京东面试题 – 有一个生成唯一串的需求,并发请求量非常大,该如何实现?
Ceker 管理员 asked 4年 ago

多个机器,多个JVM,要生成唯一串,并发量非常大,该如何实现?
面试官说,他们是借鉴表锁和行锁实现的。

FavoriteLoading添加本文到我的收藏
魔尼尼 管理员 replied 3年 ago

他们这个表锁和行锁是用数据库来实现的吗?

7 Answers
冬日阳光 管理员 answered 4年 ago

ip+进程号+当前时间(精确到纳秒)+计数器(每次批量生成串的时候重置计数器为0),由定时检查队列的线程批量生成后放到队列(可以采用LinkedBlockingQueue )中,一秒种检查一次队列中的串数量,队列大小可以设置为指定的数量,当队列中的串数量低于多少时,往队列中追加新生成的串。获取串的线程访问由队列控制即可。
思路:
1、生成串由单线程批量生成。
2、并发获取的线程由队列(队列采用链表的阻塞队列实现)进行控制。
 
串的生成格式:ip+进程号+当前时间(精确到纳秒)+计数器(每次批量生成串的时候重置计数器为0)
可以解决,多机多JVM实例的问题,计数器可以解决时间相同的问题

FavoriteLoading添加本文到我的收藏
jadechenfei 管理员 answered 3年 ago

唯一串的格式:集群编号+机器ip+jvm进程号+线程编号+时间+计数器
如果上述还达不到性能需求的话,那就将上述生成的串池化(形式多样),各集群全部运行起来不停的生成串,供消费者调用。
实现上,可以单独部署这样的集群,提供服务;也可以就部署在应用服务器上,本地获取唯一的串。
如果上面还满足不了,那就加机器。

FavoriteLoading添加本文到我的收藏
witree 管理员 answered 3年 ago

这个简单,使用数据库行锁,每次去固定数量的索引到单机里比如1000,单机里在通过内存递增就可以实现集群全局唯一了,后面的你们自己想吧

FavoriteLoading添加本文到我的收藏
witree 管理员 answered 3年 ago

这个简单,使用数据库行锁,每次去固定数量的索引到单机里比如1000,单机里在通过内存递增就可以实现集群全局唯一了,后面的你们自己想吧

FavoriteLoading添加本文到我的收藏

return top