由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 古德巴大牛,请看这个设计题
相关主题
real time distributed frameworkRedis和Memcached有什么区别?
Spark已经out了,能跳船的赶快准备上Spray了
傻逼太监懂个屁C*vert.x 3预计月底发布beta1版本
akka能代替卡福卡么?抛砖引玉,来谈谈functional programming
请问mongodb + nodejs 如何保证原子操作俺老10年前关于语言未来的论述
感觉vert.x的设计很一般呀scala 真是一个无法无天的糟货
vert.x也支持redis春运这个东西,用Storm就可以轻松搞定了
掏钱买support的的确都是脑子进水的Node做大系统better than Java, .NET
相关话题的讨论汇总
话题: ip话题: uuid话题: node话题: 数据库话题: 请求
进入Programming版参与讨论
1 (共1页)
f**********3
发帖数: 295
1
设计一个系统,每次请求返回一个唯一的id,要求对大部分的请求做到后面请求的id要
比前面的大,要平均每秒能处理10000个请求,而且请求来自全球。还要求id尽量连续
,想过用时间做id,被毛子否了。
g*****g
发帖数: 34805
2
用时间是不行的,会冲突。我能想到的是time based UUID。源码这里有。但是连续就
比较够呛。
https://svn.apache.org/repos/asf/cassandra/trunk/src/java/org/apache/
cassandra/utils/UUIDGen.java

【在 f**********3 的大作中提到】
: 设计一个系统,每次请求返回一个唯一的id,要求对大部分的请求做到后面请求的id要
: 比前面的大,要平均每秒能处理10000个请求,而且请求来自全球。还要求id尽量连续
: ,想过用时间做id,被毛子否了。

f**********3
发帖数: 295
3
这是狗家一毛子出的,说不需要严格连续,但是要尽量,我提了4种方案都被否了...
是不是被黑了

【在 g*****g 的大作中提到】
: 用时间是不行的,会冲突。我能想到的是time based UUID。源码这里有。但是连续就
: 比较够呛。
: https://svn.apache.org/repos/asf/cassandra/trunk/src/java/org/apache/
: cassandra/utils/UUIDGen.java

g*****g
发帖数: 34805
4
如果不用写盘,在内存里放个AtomicLong,或许能顶住1万次/s。但数据库ID一般是不
会这么做的。

【在 f**********3 的大作中提到】
: 这是狗家一毛子出的,说不需要严格连续,但是要尽量,我提了4种方案都被否了...
: 是不是被黑了

f**********3
发帖数: 295
5
我也觉得这个问题没有意义。毛子还说10000次/s只是平均值,有可能峰值很大,也可
能有时基本没有请求。全球同步,毛子不是想spanner吧,这update一次全球同步一次
,光网络时间都不值这么多了。

【在 g*****g 的大作中提到】
: 如果不用写盘,在内存里放个AtomicLong,或许能顶住1万次/s。但数据库ID一般是不
: 会这么做的。

g*****g
发帖数: 34805
6
这种情况,通常都是用time based uuid,就是一个时间+ IP address + synchronized
counter on host. 不同机器无需同步可以保证唯一。老毛子多半是故意刁难。

【在 f**********3 的大作中提到】
: 我也觉得这个问题没有意义。毛子还说10000次/s只是平均值,有可能峰值很大,也可
: 能有时基本没有请求。全球同步,毛子不是想spanner吧,这update一次全球同步一次
: ,光网络时间都不值这么多了。

f**********3
发帖数: 295
7
好吧,算我倒霉。不过还是感谢这个uuid的方法,学习了。

synchronized

【在 g*****g 的大作中提到】
: 这种情况,通常都是用time based uuid,就是一个时间+ IP address + synchronized
: counter on host. 不同机器无需同步可以保证唯一。老毛子多半是故意刁难。

g*****g
发帖数: 34805
8
我说错了,应该是mac address。

【在 f**********3 的大作中提到】
: 好吧,算我倒霉。不过还是感谢这个uuid的方法,学习了。
:
: synchronized

z****e
发帖数: 54598
9
uuid一般怎么做?
我一般是用毫秒数加上机器编号,然后syncrhonized生成方法做
不过因为cpu无法精确到毫秒,所以还是要存上一个生成的数字
然后比较,如果相同的话,+1

synchronized

【在 g*****g 的大作中提到】
: 这种情况,通常都是用time based uuid,就是一个时间+ IP address + synchronized
: counter on host. 不同机器无需同步可以保证唯一。老毛子多半是故意刁难。

g*****g
发帖数: 34805
10
Time+ mac address +
synchronized counter on host.
上面的Link有实现。

【在 z****e 的大作中提到】
: uuid一般怎么做?
: 我一般是用毫秒数加上机器编号,然后syncrhonized生成方法做
: 不过因为cpu无法精确到毫秒,所以还是要存上一个生成的数字
: 然后比较,如果相同的话,+1
:
: synchronized

相关主题
感觉vert.x的设计很一般呀Redis和Memcached有什么区别?
vert.x也支持redis准备上Spray了
掏钱买support的的确都是脑子进水的vert.x 3预计月底发布beta1版本
进入Programming版参与讨论
f**********3
发帖数: 295
11
其实当时想了个类似的,加上每个机器的"offset",但是毛子说还要连续就吐血了...
魏老师的nb单机是不是能做到? 但是毛子会说不scalable

【在 g*****g 的大作中提到】
: 我说错了,应该是mac address。
g*****g
发帖数: 34805
12
得,你说UUID,老毛子最多不满意。你说魏老师的单机很牛逼,无限scalable,
老毛子多半把你轰出去了。

【在 f**********3 的大作中提到】
: 其实当时想了个类似的,加上每个机器的"offset",但是毛子说还要连续就吐血了...
: 魏老师的nb单机是不是能做到? 但是毛子会说不scalable

c*****t
发帖数: 1879
13
可以是每台 id server 每次从 block server 那里要一个 block of IDs 。用完或者
级秒钟以后再从 block server 那里要。
这样的话,该 id server 里拿到的 id 应该是连续的。因为每隔几秒(根据 load
等来决定)或者 id block 用完,所以总的来说 id 是朝大方向走。

【在 g*****g 的大作中提到】
: 如果不用写盘,在内存里放个AtomicLong,或许能顶住1万次/s。但数据库ID一般是不
: 会这么做的。

b*******s
发帖数: 5216
14
估计基本就是几个考点吧,一个是并发能力和同步,就是你一个要有减少同步的锁的开
支和减少每次计算负荷的概念,一个是看你有没有对容量的考虑,我估计基本需要设计
大数类型,否则你的这个ID如果是个int什么的没多久就overflow了,而且要讲出为什
么设计那么长度的数,这个考察你对用户容量的估计,第三个是看你能不能找到或者炮
制一个ever increasing的量,要简单,不需要大量计算,考虑到每秒要10000个请求,
你用时间tick肯定是不行的,这个每秒才1000个增量,需要做额外的计算,不需要计算
的你至少采样率要到你服务数量的2倍甚至更高,奈奎斯特频率嘛
我的直观感觉是可以用cpu clock tick,加到每次服务初始化的一个量,这个量可以是
上次的最后一个id值。
然后一个线程负责拿clock tick,这个线程polling次数不要超过3万/秒,但也别低于2
万/秒,看看有没有机器指令集支持这个好了。可以绑在一个核上
然后就是服务线程,其实和取时间的线程,还是个老掉牙的rw lock,算一下服务线程
的数量,满足服务请求能力就行,反过来可以推算系统硬件需求
然后考虑这个系统比如要运行5年,反过来可以推算你的id的字长是多少

【在 f**********3 的大作中提到】
: 设计一个系统,每次请求返回一个唯一的id,要求对大部分的请求做到后面请求的id要
: 比前面的大,要平均每秒能处理10000个请求,而且请求来自全球。还要求id尽量连续
: ,想过用时间做id,被毛子否了。

z****e
发帖数: 54598
15
那就找单个node专门出id咯

【在 f**********3 的大作中提到】
: 其实当时想了个类似的,加上每个机器的"offset",但是毛子说还要连续就吐血了...
: 魏老师的nb单机是不是能做到? 但是毛子会说不scalable

b*******s
发帖数: 5216
16
use time stamp counter of CPU
b*******s
发帖数: 5216
17
这个设计有一部分是有问题的,我再想想

于2

【在 b*******s 的大作中提到】
: 估计基本就是几个考点吧,一个是并发能力和同步,就是你一个要有减少同步的锁的开
: 支和减少每次计算负荷的概念,一个是看你有没有对容量的考虑,我估计基本需要设计
: 大数类型,否则你的这个ID如果是个int什么的没多久就overflow了,而且要讲出为什
: 么设计那么长度的数,这个考察你对用户容量的估计,第三个是看你能不能找到或者炮
: 制一个ever increasing的量,要简单,不需要大量计算,考虑到每秒要10000个请求,
: 你用时间tick肯定是不行的,这个每秒才1000个增量,需要做额外的计算,不需要计算
: 的你至少采样率要到你服务数量的2倍甚至更高,奈奎斯特频率嘛
: 我的直观感觉是可以用cpu clock tick,加到每次服务初始化的一个量,这个量可以是
: 上次的最后一个id值。
: 然后一个线程负责拿clock tick,这个线程polling次数不要超过3万/秒,但也别低于2

b*******s
发帖数: 5216
18
嗯,锁策略改一下就行了,这下polling线程的负荷也下来了
b*******s
发帖数: 5216
19
context switching的开销需要做点实验,先预估理论值,然后调整
P********l
发帖数: 452
20
101个机器连续给号。100个机器先向头要个号,然后自己产生0到99,结果是头×100+自
己。
其它机器向这100个机器要号。如何?

【在 f**********3 的大作中提到】
: 设计一个系统,每次请求返回一个唯一的id,要求对大部分的请求做到后面请求的id要
: 比前面的大,要平均每秒能处理10000个请求,而且请求来自全球。还要求id尽量连续
: ,想过用时间做id,被毛子否了。

相关主题
抛砖引玉,来谈谈functional programming春运这个东西,用Storm就可以轻松搞定了
俺老10年前关于语言未来的论述Node做大系统better than Java, .NET
scala 真是一个无法无天的糟货异步的话,所有语言都有自己的环境
进入Programming版参与讨论
z****e
发帖数: 54598
21
魏老师的nb单机是不是能做到?
这个太有喜感了

【在 f**********3 的大作中提到】
: 其实当时想了个类似的,加上每个机器的"offset",但是毛子说还要连续就吐血了...
: 魏老师的nb单机是不是能做到? 但是毛子会说不scalable

b*******s
发帖数: 5216
22
我这个也是不能扩展的方案,可扩展方案迟一点我也弄一个。google里面还是c++和
python党的天下,他们的思考习惯和魏老师估计比较接近
l*********s
发帖数: 5409
23
不是有微秒级别的系统时钟吗?

【在 z****e 的大作中提到】
: uuid一般怎么做?
: 我一般是用毫秒数加上机器编号,然后syncrhonized生成方法做
: 不过因为cpu无法精确到毫秒,所以还是要存上一个生成的数字
: 然后比较,如果相同的话,+1
:
: synchronized

l*********s
发帖数: 5409
24
cpu clock tick 这个主意好!

于2

【在 b*******s 的大作中提到】
: 估计基本就是几个考点吧,一个是并发能力和同步,就是你一个要有减少同步的锁的开
: 支和减少每次计算负荷的概念,一个是看你有没有对容量的考虑,我估计基本需要设计
: 大数类型,否则你的这个ID如果是个int什么的没多久就overflow了,而且要讲出为什
: 么设计那么长度的数,这个考察你对用户容量的估计,第三个是看你能不能找到或者炮
: 制一个ever increasing的量,要简单,不需要大量计算,考虑到每秒要10000个请求,
: 你用时间tick肯定是不行的,这个每秒才1000个增量,需要做额外的计算,不需要计算
: 的你至少采样率要到你服务数量的2倍甚至更高,奈奎斯特频率嘛
: 我的直观感觉是可以用cpu clock tick,加到每次服务初始化的一个量,这个量可以是
: 上次的最后一个id值。
: 然后一个线程负责拿clock tick,这个线程polling次数不要超过3万/秒,但也别低于2

l*********s
发帖数: 5409
25
cpu clock tick 这个主意好!

于2

【在 b*******s 的大作中提到】
: 估计基本就是几个考点吧,一个是并发能力和同步,就是你一个要有减少同步的锁的开
: 支和减少每次计算负荷的概念,一个是看你有没有对容量的考虑,我估计基本需要设计
: 大数类型,否则你的这个ID如果是个int什么的没多久就overflow了,而且要讲出为什
: 么设计那么长度的数,这个考察你对用户容量的估计,第三个是看你能不能找到或者炮
: 制一个ever increasing的量,要简单,不需要大量计算,考虑到每秒要10000个请求,
: 你用时间tick肯定是不行的,这个每秒才1000个增量,需要做额外的计算,不需要计算
: 的你至少采样率要到你服务数量的2倍甚至更高,奈奎斯特频率嘛
: 我的直观感觉是可以用cpu clock tick,加到每次服务初始化的一个量,这个量可以是
: 上次的最后一个id值。
: 然后一个线程负责拿clock tick,这个线程polling次数不要超过3万/秒,但也别低于2

N*n
发帖数: 456
26
我来出个主意吧。你没有提到并行处理,所以假设单流程处理
ID分两段。
第一段 是一个 int number. 这个 INT number 从时间零点开始每秒+1。
第二段 counter m bit(m>14,可以用16bit) 1024x16=16384 之间的数字。每来一个新
请求,则+1.新的一秒开始,则清零重新开始
如果要多流程,彼此不通讯,
假设是 Master-worker arch-tech. 则每个worker node get a unique identifier.
for 16 workers, 0-15
If u want to identify the source of request, u could add x bit,
which is from the 1st x bit of IP. x could be 8. This part can be optimized
, based on IP来源的频率分析.
比如 你统计发现 40% request coming from 199.126.* 30%request
from 17.* 30% from all other IP.
在一个简单的 2bit 系统,可以给所有 199.126。* 请求
一个 特殊的ID: 00; 17.* : 01, all others IPs: 10, bit 11 is reserved
in case one of the 3 有超常溢出 etc.. 依次类推,也可以把它变成4bit系统
*****
当然这样分了以后 上面的第二段counter 可以可以相应加少 bit到大约8bit.
time_int,worker_bits(4),IP_bits(4),counter_bits(8)
如果嫌这样麻烦也可以直接
time_int,IP(8bit),counter(8bit)
只要IP分布不是特别偏,可以没问题。
***************
补:如果用上coconut的 block server 的概念应该能更保险。。

【在 f**********3 的大作中提到】
: 设计一个系统,每次请求返回一个唯一的id,要求对大部分的请求做到后面请求的id要
: 比前面的大,要平均每秒能处理10000个请求,而且请求来自全球。还要求id尽量连续
: ,想过用时间做id,被毛子否了。

d******e
发帖数: 2265
27
经典老题用个counter 哦 over

【在 f**********3 的大作中提到】
: 设计一个系统,每次请求返回一个唯一的id,要求对大部分的请求做到后面请求的id要
: 比前面的大,要平均每秒能处理10000个请求,而且请求来自全球。还要求id尽量连续
: ,想过用时间做id,被毛子否了。

d******e
发帖数: 2265
28
当然

【在 z****e 的大作中提到】
: 魏老师的nb单机是不是能做到?
: 这个太有喜感了

x****d
发帖数: 1766
29
would you consider zookeeper? you know, you can generate sequential with
zookeeper. it is not continuous, but distributed. it is said a little bit
slow, but don't know how slow.
for interview, I would slap this on the table, with UUID, if they don't like
, then try implement it raw, but I doubt I can do better than ZK during the
interview, you know short period of time, pressure.
backup your ZK solution with teacherWei's single machine design, 10k/s is
piece of cake. LOL.
f****4
发帖数: 1359
30
学习了~

optimized

【在 N*n 的大作中提到】
: 我来出个主意吧。你没有提到并行处理,所以假设单流程处理
: ID分两段。
: 第一段 是一个 int number. 这个 INT number 从时间零点开始每秒+1。
: 第二段 counter m bit(m>14,可以用16bit) 1024x16=16384 之间的数字。每来一个新
: 请求,则+1.新的一秒开始,则清零重新开始
: 如果要多流程,彼此不通讯,
: 假设是 Master-worker arch-tech. 则每个worker node get a unique identifier.
: for 16 workers, 0-15
: If u want to identify the source of request, u could add x bit,
: which is from the 1st x bit of IP. x could be 8. This part can be optimized

相关主题
现在脚本程序员在进入企业和webSpark已经out了,能跳船的赶快
拿C*当message queue用,不知道哪里面试能通过傻逼太监懂个屁C*
real time distributed frameworkakka能代替卡福卡么?
进入Programming版参与讨论
N*n
发帖数: 456
31
互相学习。。:)

【在 f****4 的大作中提到】
: 学习了~
:
: optimized

c******o
发帖数: 1277
32
Mongodb的object ID不就是这样么?
P********l
发帖数: 452
33
如果一台机器给其他机器产生id, 直接+1不就行了吗?
你这种方式也不能保证两台机器独立产生id.
还有,这道题非常实际. 那个id越有顺序越好.比如保证id(i) 为数据库往往id相邻的逻辑上/物理上也相邻.

optimized

【在 N*n 的大作中提到】
: 我来出个主意吧。你没有提到并行处理,所以假设单流程处理
: ID分两段。
: 第一段 是一个 int number. 这个 INT number 从时间零点开始每秒+1。
: 第二段 counter m bit(m>14,可以用16bit) 1024x16=16384 之间的数字。每来一个新
: 请求,则+1.新的一秒开始,则清零重新开始
: 如果要多流程,彼此不通讯,
: 假设是 Master-worker arch-tech. 则每个worker node get a unique identifier.
: for 16 workers, 0-15
: If u want to identify the source of request, u could add x bit,
: which is from the 1st x bit of IP. x could be 8. This part can be optimized

g*****g
发帖数: 34805
34
实际中time uuid 够用了。而且可以 client产生。也相邻,id 连续在 DB 里意义不大。

【在 P********l 的大作中提到】
: 如果一台机器给其他机器产生id, 直接+1不就行了吗?
: 你这种方式也不能保证两台机器独立产生id.
: 还有,这道题非常实际. 那个id越有顺序越好.比如保证id(i): 为数据库往往id相邻的逻辑上/物理上也相邻.
:
: optimized

P********l
发帖数: 452
35
这要看那个数据库了.

大。

【在 g*****g 的大作中提到】
: 实际中time uuid 够用了。而且可以 client产生。也相邻,id 连续在 DB 里意义不大。
m*******l
发帖数: 12782
36
这个是对的

【在 P********l 的大作中提到】
: 这要看那个数据库了.
:
: 大。

N*n
发帖数: 456
37

从出题的角度,明显不是这个意思。。 如果这样是全连续的。
多机下,每个worker node/机器 有自己的ID 段。独立产生 ID。

【在 P********l 的大作中提到】
: 如果一台机器给其他机器产生id, 直接+1不就行了吗?
: 你这种方式也不能保证两台机器独立产生id.
: 还有,这道题非常实际. 那个id越有顺序越好.比如保证id(i): 为数据库往往id相邻的逻辑上/物理上也相邻.
:
: optimized

P********l
发帖数: 452
38
那个uuid就是产生这个ID段的.它利用了mac地址(基本)唯一这个特点.
IP不行,因为有private ip address space.

【在 N*n 的大作中提到】
:
: 从出题的角度,明显不是这个意思。。 如果这样是全连续的。
: 多机下,每个worker node/机器 有自己的ID 段。独立产生 ID。

g*****g
发帖数: 34805
39
我想起来了,我们给 rdbms分 id 的做法是前头应用服务器集群去数据库某个sequence
表里
做个加法取一段。接下来一直加一到这段用完为止。结点坏了,会跳过一些 id, 但不
会重复,这个貌似满足他的要求。
N*n
发帖数: 456
40
NAT 我当然知道。。所以有后面的IP request 频率分析。。
private IP, 我想你说的10.*, 192.168.* 。。在2bit system, 他们都是在
其它之列。。
如果是 8比特。。就是直接用IP四个数的头一个,那 private IP, 不用的那个刚好
可以做备用。。
MAC 唯一不错,但是用上MAC,全球request..你怎么保证 ID连续?

【在 P********l 的大作中提到】
: 那个uuid就是产生这个ID段的.它利用了mac地址(基本)唯一这个特点.
: IP不行,因为有private ip address space.

相关主题
akka能代替卡福卡么?vert.x也支持redis
请问mongodb + nodejs 如何保证原子操作掏钱买support的的确都是脑子进水的
感觉vert.x的设计很一般呀Redis和Memcached有什么区别?
进入Programming版参与讨论
P********l
发帖数: 452
41
他要10000次/s, 还全球的.

sequence

【在 g*****g 的大作中提到】
: 我想起来了,我们给 rdbms分 id 的做法是前头应用服务器集群去数据库某个sequence
: 表里
: 做个加法取一段。接下来一直加一到这段用完为止。结点坏了,会跳过一些 id, 但不
: 会重复,这个貌似满足他的要求。

N*n
发帖数: 456
42
你是在G家工作,还是面试题啊?

【在 f**********3 的大作中提到】
: 这是狗家一毛子出的,说不需要严格连续,但是要尽量,我提了4种方案都被否了...
: 是不是被黑了

g*****g
发帖数: 34805
43
这个没问题, 是个集群。10个,100个机器都行。

【在 P********l 的大作中提到】
: 他要10000次/s, 还全球的.
:
: sequence

f**********3
发帖数: 295
44
当然是面试题

【在 N*n 的大作中提到】
: 你是在G家工作,还是面试题啊?
p*****2
发帖数: 21240
45
这个用AKKA就可以轻松搞定了吧?
f**********3
发帖数: 295
46
请问二爷这个的原理是什么,我的思路如果不用时间或者uuid的话,毛子说全球,就是
服务器要分布在全球,然后看某个id用过没,就要全球同步,可能就是有些近似算法,
允许一定程度的顺序错乱,但是大大减少同步的次数。在现有的id pool用完之前,下
一次同步已经完成,这样用户就感觉不到wait time。等我下了飞机把我最后提出的思
路详细写写,毛子还是不满意,还要随时增加减少服务器都可以。我提了个方案应该能
做到。对我一只写过单服务器的new grad,至于吗?

【在 p*****2 的大作中提到】
: 这个用AKKA就可以轻松搞定了吧?
g*****g
发帖数: 34805
47
我说的是用一个集群,这个集群也可以全世界分布。一个中心数据库。这个集群的每个
结点每次
到数据库上读当前好,比如100万,然后加上区段长度,10万,写回110万。这样那个结
点就预留了100万-110万,下个结点来拿就是110万-120万,不会跟其他结点冲突。每次
被request的时候,给出当前ID,计数加1即可。

【在 f**********3 的大作中提到】
: 请问二爷这个的原理是什么,我的思路如果不用时间或者uuid的话,毛子说全球,就是
: 服务器要分布在全球,然后看某个id用过没,就要全球同步,可能就是有些近似算法,
: 允许一定程度的顺序错乱,但是大大减少同步的次数。在现有的id pool用完之前,下
: 一次同步已经完成,这样用户就感觉不到wait time。等我下了飞机把我最后提出的思
: 路详细写写,毛子还是不满意,还要随时增加减少服务器都可以。我提了个方案应该能
: 做到。对我一只写过单服务器的new grad,至于吗?

N*n
发帖数: 456
48
这就是 coconut说的那个吧
确实不错,而且加node/服务器 也没问题

【在 g*****g 的大作中提到】
: 我说的是用一个集群,这个集群也可以全世界分布。一个中心数据库。这个集群的每个
: 结点每次
: 到数据库上读当前好,比如100万,然后加上区段长度,10万,写回110万。这样那个结
: 点就预留了100万-110万,下个结点来拿就是110万-120万,不会跟其他结点冲突。每次
: 被request的时候,给出当前ID,计数加1即可。

P********l
发帖数: 452
49
那个中心数据库就是将来的bottleneck.

【在 g*****g 的大作中提到】
: 我说的是用一个集群,这个集群也可以全世界分布。一个中心数据库。这个集群的每个
: 结点每次
: 到数据库上读当前好,比如100万,然后加上区段长度,10万,写回110万。这样那个结
: 点就预留了100万-110万,下个结点来拿就是110万-120万,不会跟其他结点冲突。每次
: 被request的时候,给出当前ID,计数加1即可。

g*****g
发帖数: 34805
50
这个应该不会。比如我说10个server,区段是10万,一秒1万的话,
100秒才需要写这个数据库10次,每个server来数据库写一次。平均10秒一次,完全没
压力。
多几个数量级都还很轻松。

【在 P********l 的大作中提到】
: 那个中心数据库就是将来的bottleneck.
相关主题
准备上Spray了俺老10年前关于语言未来的论述
vert.x 3预计月底发布beta1版本scala 真是一个无法无天的糟货
抛砖引玉,来谈谈functional programming春运这个东西,用Storm就可以轻松搞定了
进入Programming版参与讨论
N*n
发帖数: 456
51
这个设计如果说有缺点就是不一定保证后面的request 比前面的数大。如果每个站的
request不一样。。

【在 g*****g 的大作中提到】
: 这个应该不会。比如我说10个server,区段是10万,一秒1万的话,
: 100秒才需要写这个数据库10次,每个server来数据库写一次。平均10秒一次,完全没
: 压力。
: 多几个数量级都还很轻松。

P********l
发帖数: 452
52
我也想问类似的问题.那个reqest的粒度(一次要几个id)没有控制.如果有哪个应用
不合作,一个一个地要,就有问题了.

【在 N*n 的大作中提到】
: 这个设计如果说有缺点就是不一定保证后面的request 比前面的数大。如果每个站的
: request不一样。。

x****d
发帖数: 1766
53
用zookeeper也是一段一段要。其实就是把zookeeper当成你说的block server。但不知
道为什么会慢。如果zookeeper会慢,我想自己做的东西也会慢。

【在 c*****t 的大作中提到】
: 可以是每台 id server 每次从 block server 那里要一个 block of IDs 。用完或者
: 级秒钟以后再从 block server 那里要。
: 这样的话,该 id server 里拿到的 id 应该是连续的。因为每隔几秒(根据 load
: 等来决定)或者 id block 用完,所以总的来说 id 是朝大方向走。

g*****g
发帖数: 34805
54
zookeeper要比数据库里,一个row的锁慢得多。

【在 x****d 的大作中提到】
: 用zookeeper也是一段一段要。其实就是把zookeeper当成你说的block server。但不知
: 道为什么会慢。如果zookeeper会慢,我想自己做的东西也会慢。

x****d
发帖数: 1766
55
cassandra 和其他nosql 的auto increment怎么解决的?cassandra好象有个counter的
东西,那个是干啥的?
g*****g
发帖数: 34805
56
Cassandra一般用UUID,ID即使连续,也不是存一块的,没有意义。Cassandra有个
distributed counter,挺复杂,你可以看看。
http://www.datastax.com/wp-content/uploads/2011/07/cassandra_sf

【在 x****d 的大作中提到】
: cassandra 和其他nosql 的auto increment怎么解决的?cassandra好象有个counter的
: 东西,那个是干啥的?

p*****2
发帖数: 21240
57

AKKA就是大型分布式计算系统。是一个树形结构。最上边的节点掌控全局,也就是掌控
所有的ID。下边一层想发ID,都要向上边去要。下边可以每个地区一个supervisor, 根
据各个地区的request的量再往下分,一直到可以handle为止。因为是树,所以层次很
浅就可以handle很大的量.

【在 f**********3 的大作中提到】
: 请问二爷这个的原理是什么,我的思路如果不用时间或者uuid的话,毛子说全球,就是
: 服务器要分布在全球,然后看某个id用过没,就要全球同步,可能就是有些近似算法,
: 允许一定程度的顺序错乱,但是大大减少同步的次数。在现有的id pool用完之前,下
: 一次同步已经完成,这样用户就感觉不到wait time。等我下了飞机把我最后提出的思
: 路详细写写,毛子还是不满意,还要随时增加减少服务器都可以。我提了个方案应该能
: 做到。对我一只写过单服务器的new grad,至于吗?

x****d
发帖数: 1766
58
为啥呢?我没深入研究,但表面看不应该呀。
听说是慢,但应该不会慢过10000/s平均吧。而且实施时候并不是每个都从zk生成,而
是一段一段取,用魏老师的nb单机单机去取出来在分配出去,9million/s没问题呀。
lol

【在 g*****g 的大作中提到】
: zookeeper要比数据库里,一个row的锁慢得多。
g*****g
发帖数: 34805
59
我没说ZK不行,我纯粹说比DB慢而已。distributed lock肯定比DB single row lock慢
呀。
另外,就是当年最高ID得找个地方存着,你不能丢了。

【在 x****d 的大作中提到】
: 为啥呢?我没深入研究,但表面看不应该呀。
: 听说是慢,但应该不会慢过10000/s平均吧。而且实施时候并不是每个都从zk生成,而
: 是一段一段取,用魏老师的nb单机单机去取出来在分配出去,9million/s没问题呀。
: lol

P********l
发帖数: 452
60
我印象里google app engine里id改过一次.以前产生的id是分散的,后来改成的连续
的了.(没狗到.)

【在 g*****g 的大作中提到】
: Cassandra一般用UUID,ID即使连续,也不是存一块的,没有意义。Cassandra有个
: distributed counter,挺复杂,你可以看看。
: http://www.datastax.com/wp-content/uploads/2011/07/cassandra_sf

相关主题
Node做大系统better than Java, .NET拿C*当message queue用,不知道哪里面试能通过
异步的话,所有语言都有自己的环境real time distributed framework
现在脚本程序员在进入企业和webSpark已经out了,能跳船的赶快
进入Programming版参与讨论
k**********g
发帖数: 989
61

应该就是spanner。他是纯考你的见识。

【在 f**********3 的大作中提到】
: 我也觉得这个问题没有意义。毛子还说10000次/s只是平均值,有可能峰值很大,也可
: 能有时基本没有请求。全球同步,毛子不是想spanner吧,这update一次全球同步一次
: ,光网络时间都不值这么多了。

P********l
发帖数: 452
62
zkss. spanner有id的特殊处理?

【在 k**********g 的大作中提到】
:
: 应该就是spanner。他是纯考你的见识。

b*******s
发帖数: 5216
63
It makes heavy use of hardware-assisted time synchronization using GPS
clocks and atomic clocks to ensure global consistency.
用你们的那些方法,要保持一致overhead是不低的,还是要找个自然的硬件的方法

【在 P********l 的大作中提到】
: zkss. spanner有id的特殊处理?
b*******s
发帖数: 5216
64
机器编号你很难控制,mac和ip都是可以修改的
cpu可以精确到cycles

【在 z****e 的大作中提到】
: uuid一般怎么做?
: 我一般是用毫秒数加上机器编号,然后syncrhonized生成方法做
: 不过因为cpu无法精确到毫秒,所以还是要存上一个生成的数字
: 然后比较,如果相同的话,+1
:
: synchronized

b*******s
发帖数: 5216
65
这个设计完全没考虑id servers产生重复的id

【在 c*****t 的大作中提到】
: 可以是每台 id server 每次从 block server 那里要一个 block of IDs 。用完或者
: 级秒钟以后再从 block server 那里要。
: 这样的话,该 id server 里拿到的 id 应该是连续的。因为每隔几秒(根据 load
: 等来决定)或者 id block 用完,所以总的来说 id 是朝大方向走。

b*******s
发帖数: 5216
66
这是瓶颈

【在 z****e 的大作中提到】
: 那就找单个node专门出id咯
b*******s
发帖数: 5216
67
你如何保证100个机器不产生冲突的号?解决冲突的代价很大的,别小看,你也无法控
制客户要到的号码是递增的



【在 P********l 的大作中提到】
: 101个机器连续给号。100个机器先向头要个号,然后自己产生0到99,结果是头×100+自
: 己。
: 其它机器向这100个机器要号。如何?

p*****2
发帖数: 21240
68

我那个分层的有什么问题吗?

【在 b*******s 的大作中提到】
: 这是瓶颈
b*******s
发帖数: 5216
69
ip放进id里面我觉得是个坏主意,不能保证递增

optimized

【在 N*n 的大作中提到】
: 我来出个主意吧。你没有提到并行处理,所以假设单流程处理
: ID分两段。
: 第一段 是一个 int number. 这个 INT number 从时间零点开始每秒+1。
: 第二段 counter m bit(m>14,可以用16bit) 1024x16=16384 之间的数字。每来一个新
: 请求,则+1.新的一秒开始,则清零重新开始
: 如果要多流程,彼此不通讯,
: 假设是 Master-worker arch-tech. 则每个worker node get a unique identifier.
: for 16 workers, 0-15
: If u want to identify the source of request, u could add x bit,
: which is from the 1st x bit of IP. x could be 8. This part can be optimized

b*******s
发帖数: 5216
70
用客户方信息来保证唯一性是不可靠的,而且是额外增加负荷的

【在 P********l 的大作中提到】
: 那个uuid就是产生这个ID段的.它利用了mac地址(基本)唯一这个特点.
: IP不行,因为有private ip address space.

相关主题
Spark已经out了,能跳船的赶快请问mongodb + nodejs 如何保证原子操作
傻逼太监懂个屁C*感觉vert.x的设计很一般呀
akka能代替卡福卡么?vert.x也支持redis
进入Programming版参与讨论
b*******s
发帖数: 5216
71
赞,这个是到点子上了

【在 k**********g 的大作中提到】
:
: 应该就是spanner。他是纯考你的见识。

b*******s
发帖数: 5216
72
效率低下

【在 p*****2 的大作中提到】
:
: 我那个分层的有什么问题吗?

b*******s
发帖数: 5216
73
我那个方案是用cpu cycles,而google实际上用的是专门的原子钟和gps时钟,gps时钟
是全球同步的,10ns的误差,对于题目里给的够用了,原子钟估计是给分布在各地的服
务器矫正用的
d******e
发帖数: 2265
74
用上计算机了, 简单说几句。
第一,这题我面过,counter必过无疑。
第二,毛子讲更加清楚。10000这个数不是白给你的。
这里主要靠你知识面,看到10千,有经验的就知道考c10k问题了。
那么前端上任何 c10k server,基本上就是async的了。单机搞定。
后面要么自己写个简单函数/类, counter++搞定。
要么上redis incr,我估计你说出用比如node.js, tornando+redis后面就不用多问了。
follow up可能要问你上百万 requests怎么办。这时你再发挥吧。
这么简单的问题上集群的都是扯淡。

【在 f**********3 的大作中提到】
: 设计一个系统,每次请求返回一个唯一的id,要求对大部分的请求做到后面请求的id要
: 比前面的大,要平均每秒能处理10000个请求,而且请求来自全球。还要求id尽量连续
: ,想过用时间做id,被毛子否了。

b*******s
发帖数: 5216
75
用数据库来做这个,又是锤子党了,非常糟糕的想法,人家用这个服务就是给数据库提
供服务的,你们倒好,先来个数据库
b*******s
发帖数: 5216
76
counter是最直观的想法

了。

【在 d******e 的大作中提到】
: 用上计算机了, 简单说几句。
: 第一,这题我面过,counter必过无疑。
: 第二,毛子讲更加清楚。10000这个数不是白给你的。
: 这里主要靠你知识面,看到10千,有经验的就知道考c10k问题了。
: 那么前端上任何 c10k server,基本上就是async的了。单机搞定。
: 后面要么自己写个简单函数/类, counter++搞定。
: 要么上redis incr,我估计你说出用比如node.js, tornando+redis后面就不用多问了。
: follow up可能要问你上百万 requests怎么办。这时你再发挥吧。
: 这么简单的问题上集群的都是扯淡。

g*****g
发帖数: 34805
77
你这个说得不对。实践当中,这么弄UUID的,一般都是连接DB的应用服务器,他们的IP
/Mac address不会相同。

【在 b*******s 的大作中提到】
: 用客户方信息来保证唯一性是不可靠的,而且是额外增加负荷的
g*****g
发帖数: 34805
78
数据库是保证不重复,最简单最有效的方法。性能也很高。

【在 b*******s 的大作中提到】
: 用数据库来做这个,又是锤子党了,非常糟糕的想法,人家用这个服务就是给数据库提
: 供服务的,你们倒好,先来个数据库

b*******s
发帖数: 5216
79
这个性能很“高”,大概是数据库意义上的,和实际授时系统等比,差很多个数量级呢

【在 g*****g 的大作中提到】
: 数据库是保证不重复,最简单最有效的方法。性能也很高。
b*******s
发帖数: 5216
80
ip/mac顶多做到unique,你放在id里,破坏递增性的

IP

【在 g*****g 的大作中提到】
: 你这个说得不对。实践当中,这么弄UUID的,一般都是连接DB的应用服务器,他们的IP
: /Mac address不会相同。

相关主题
掏钱买support的的确都是脑子进水的vert.x 3预计月底发布beta1版本
Redis和Memcached有什么区别?抛砖引玉,来谈谈functional programming
准备上Spray了俺老10年前关于语言未来的论述
进入Programming版参与讨论
g*****g
发帖数: 34805
81
我说的只是UUID,那个scheme可以保证Unique,UUID没有讲究递增的。
递增的是我说的,数据库里大家都来预取一段,用完再取。

【在 b*******s 的大作中提到】
: ip/mac顶多做到unique,你放在id里,破坏递增性的
:
: IP

p*****2
发帖数: 21240
82

为什么会低下?每次要id都是batch的,异步的。

【在 b*******s 的大作中提到】
: 效率低下
b*******s
发帖数: 5216
83
单机的问题是,递增性是按照请求到达的顺序来的,而不是请求发起的顺序,这样由于
网络路由不同,我们坐在一起,可能你先提交请求,但是拿到的id我比你小。
不过其实也很容易解决,在request里面加时间戳就是了,服务器端处理就用LUT,表对
gps clocks的采样多一点,比如比需求高一个数量级,问题就不大了

了。

【在 d******e 的大作中提到】
: 用上计算机了, 简单说几句。
: 第一,这题我面过,counter必过无疑。
: 第二,毛子讲更加清楚。10000这个数不是白给你的。
: 这里主要靠你知识面,看到10千,有经验的就知道考c10k问题了。
: 那么前端上任何 c10k server,基本上就是async的了。单机搞定。
: 后面要么自己写个简单函数/类, counter++搞定。
: 要么上redis incr,我估计你说出用比如node.js, tornando+redis后面就不用多问了。
: follow up可能要问你上百万 requests怎么办。这时你再发挥吧。
: 这么简单的问题上集群的都是扯淡。

b*******s
发帖数: 5216
84
看和谁比,你数据库再快,快不过barebone的系统,而且这个系统没太多数据要存,上
数据库太笨重,你要在面试里提,估计回去会成为他们的午餐笑话,g那批人就是造轮
子的思维方式,里面c++出身的是主流

【在 p*****2 的大作中提到】
:
: 为什么会低下?每次要id都是batch的,异步的。

b*******s
发帖数: 5216
85
时间戳的精度不够,这个如何解决我再想一下

【在 b*******s 的大作中提到】
: 单机的问题是,递增性是按照请求到达的顺序来的,而不是请求发起的顺序,这样由于
: 网络路由不同,我们坐在一起,可能你先提交请求,但是拿到的id我比你小。
: 不过其实也很容易解决,在request里面加时间戳就是了,服务器端处理就用LUT,表对
: gps clocks的采样多一点,比如比需求高一个数量级,问题就不大了
:
: 了。

b*******s
发帖数: 5216
86
更恶劣的情况是,我同一台机器先后的请求,拿到反序的id

【在 b*******s 的大作中提到】
: 单机的问题是,递增性是按照请求到达的顺序来的,而不是请求发起的顺序,这样由于
: 网络路由不同,我们坐在一起,可能你先提交请求,但是拿到的id我比你小。
: 不过其实也很容易解决,在request里面加时间戳就是了,服务器端处理就用LUT,表对
: gps clocks的采样多一点,比如比需求高一个数量级,问题就不大了
:
: 了。

P********l
发帖数: 452
87
谁说严格递增的?
不冲突太简单了.

【在 b*******s 的大作中提到】
: 你如何保证100个机器不产生冲突的号?解决冲突的代价很大的,别小看,你也无法控
: 制客户要到的号码是递增的
:
: 自

b*******s
发帖数: 5216
88
拿时间戳可以这样做,在全球各地部署高精度的时间服务器,这些服务器利用gps
clock同步,由于近,合理部署可以消除网络路由时延带来的问题。
p*****2
发帖数: 21240
89

我哪里上数据库了?

【在 b*******s 的大作中提到】
: 看和谁比,你数据库再快,快不过barebone的系统,而且这个系统没太多数据要存,上
: 数据库太笨重,你要在面试里提,估计回去会成为他们的午餐笑话,g那批人就是造轮
: 子的思维方式,里面c++出身的是主流

b*******s
发帖数: 5216
90
题设里没有说严格递增?

【在 P********l 的大作中提到】
: 谁说严格递增的?
: 不冲突太简单了.

相关主题
scala 真是一个无法无天的糟货异步的话,所有语言都有自己的环境
春运这个东西,用Storm就可以轻松搞定了现在脚本程序员在进入企业和web
Node做大系统better than Java, .NET拿C*当message queue用,不知道哪里面试能通过
进入Programming版参与讨论
P********l
发帖数: 452
91
你愿意相信就相信呗.good luck.

【在 b*******s 的大作中提到】
: 赞,这个是到点子上了
b*******s
发帖数: 5216
92
好吧,看混了

【在 p*****2 的大作中提到】
:
: 我哪里上数据库了?

b*******s
发帖数: 5216
93
你就说说你那100台是如何避免重复和错序的吧

【在 P********l 的大作中提到】
: 谁说严格递增的?
: 不冲突太简单了.

g*****g
发帖数: 34805
94
错序太难,高并发也没有说不错序的。避免重复就是批量取呀。

【在 b*******s 的大作中提到】
: 你就说说你那100台是如何避免重复和错序的吧
z****e
发帖数: 54598
95
要保证跟硬件独立

【在 l*********s 的大作中提到】
: 不是有微秒级别的系统时钟吗?
N*n
发帖数: 456
96
看了他后面补充的我才发现他是server遍布全球,(我理解成request 来自全球)
按他那个说法,直接可以把 Ip 部分去掉了

【在 b*******s 的大作中提到】
: ip放进id里面我觉得是个坏主意,不能保证递增
:
: optimized

P********l
发帖数: 452
97
面试总不能不看不看题吧

【在 b*******s 的大作中提到】
: 题设里没有说严格递增?
b*******s
发帖数: 5216
98
就算大部分递增 我也看不到你的设计里哪部分是保证这个的

【在 P********l 的大作中提到】
: 面试总不能不看不看题吧
N*n
发帖数: 456
99
这个看来是有经验的。。顶一下再学习。

了。

【在 d******e 的大作中提到】
: 用上计算机了, 简单说几句。
: 第一,这题我面过,counter必过无疑。
: 第二,毛子讲更加清楚。10000这个数不是白给你的。
: 这里主要靠你知识面,看到10千,有经验的就知道考c10k问题了。
: 那么前端上任何 c10k server,基本上就是async的了。单机搞定。
: 后面要么自己写个简单函数/类, counter++搞定。
: 要么上redis incr,我估计你说出用比如node.js, tornando+redis后面就不用多问了。
: follow up可能要问你上百万 requests怎么办。这时你再发挥吧。
: 这么简单的问题上集群的都是扯淡。

P********l
发帖数: 452
100
自己先琢磨一下?

【在 b*******s 的大作中提到】
: 就算大部分递增 我也看不到你的设计里哪部分是保证这个的
相关主题
real time distributed frameworkakka能代替卡福卡么?
Spark已经out了,能跳船的赶快请问mongodb + nodejs 如何保证原子操作
傻逼太监懂个屁C*感觉vert.x的设计很一般呀
进入Programming版参与讨论
p*****2
发帖数: 21240
101

刚看到这个。看来还是得上node呀。

【在 N*n 的大作中提到】
: 这个看来是有经验的。。顶一下再学习。
:
: 了。

z****e
发帖数: 54598
102
哦,原来是铁道部website同类问题
那关键就是异步处理咯

了。

【在 d******e 的大作中提到】
: 用上计算机了, 简单说几句。
: 第一,这题我面过,counter必过无疑。
: 第二,毛子讲更加清楚。10000这个数不是白给你的。
: 这里主要靠你知识面,看到10千,有经验的就知道考c10k问题了。
: 那么前端上任何 c10k server,基本上就是async的了。单机搞定。
: 后面要么自己写个简单函数/类, counter++搞定。
: 要么上redis incr,我估计你说出用比如node.js, tornando+redis后面就不用多问了。
: follow up可能要问你上百万 requests怎么办。这时你再发挥吧。
: 这么简单的问题上集群的都是扯淡。

b*******s
发帖数: 5216
103
他的方法是最简单靠谱的

【在 N*n 的大作中提到】
: 这个看来是有经验的。。顶一下再学习。
:
: 了。

p*****2
发帖数: 21240
104

redis能支持每秒10万吗?

【在 z****e 的大作中提到】
: 哦,原来是铁道部website同类问题
: 那关键就是异步处理咯
:
: 了。

z****e
发帖数: 54598
105
如果只做id generation的话,应该可以吧
这个要做压力测试

【在 p*****2 的大作中提到】
:
: redis能支持每秒10万吗?

p*****2
发帖数: 21240
106

redis是单线程的。估计撑死了这么多。在往上估计就不行了。

【在 z****e 的大作中提到】
: 如果只做id generation的话,应该可以吧
: 这个要做压力测试

b*******s
发帖数: 5216
107
直接说吧

【在 P********l 的大作中提到】
: 自己先琢磨一下?
p*****2
发帖数: 21240
108

single point failure还靠谱?

【在 b*******s 的大作中提到】
: 他的方法是最简单靠谱的
z****e
发帖数: 54598
109
所以大多数产品做得跟屎一样
我天天给三大cloud提供服务
我可以负责任滴说一句
aws比gae,computing engine这些,强一万倍
stevey基本上说出了全部事实
google的cloud比m$还烂一个档次

【在 b*******s 的大作中提到】
: 看和谁比,你数据库再快,快不过barebone的系统,而且这个系统没太多数据要存,上
: 数据库太笨重,你要在面试里提,估计回去会成为他们的午餐笑话,g那批人就是造轮
: 子的思维方式,里面c++出身的是主流

z****e
发帖数: 54598
110
他这种单node做id generation的方式
一般也就是单线程搞定了
多线程和多node并发其实最后问题是一样的

【在 p*****2 的大作中提到】
:
: single point failure还靠谱?

相关主题
感觉vert.x的设计很一般呀Redis和Memcached有什么区别?
vert.x也支持redis准备上Spray了
掏钱买support的的确都是脑子进水的vert.x 3预计月底发布beta1版本
进入Programming版参与讨论
p*****2
发帖数: 21240
111

node request多了要上cluster的。

【在 z****e 的大作中提到】
: 他这种单node做id generation的方式
: 一般也就是单线程搞定了
: 多线程和多node并发其实最后问题是一样的

z****e
发帖数: 54598
112
但是我看他的解法
id还是从那一个node上出

【在 p*****2 的大作中提到】
:
: node request多了要上cluster的。

b*******s
发帖数: 5216
113
他被问到过,过了
够说明问题了,我觉得他的方案只要解决我说的请求由于网络问题倒序就行了

【在 p*****2 的大作中提到】
:
: node request多了要上cluster的。

p*****2
发帖数: 21240
114

100K的量不小了,而且量可能更大。我觉得一个node够呛。另外就一个node挂了怎么办


【在 z****e 的大作中提到】
: 但是我看他的解法
: id还是从那一个node上出

p*****2
发帖数: 21240
115

那我跟你说我被问到过,也过了,你怎么说?

【在 b*******s 的大作中提到】
: 他被问到过,过了
: 够说明问题了,我觉得他的方案只要解决我说的请求由于网络问题倒序就行了

z****e
发帖数: 54598
116
所以这里是trade off

【在 p*****2 的大作中提到】
:
: 那我跟你说我被问到过,也过了,你怎么说?

b*******s
发帖数: 5216
117
那恭喜你了

【在 p*****2 的大作中提到】
:
: 那我跟你说我被问到过,也过了,你怎么说?

p*****2
发帖数: 21240
118

刚做了个试验10万个incr操作,redis要用到1.5秒, 所以撑不住那个量。

【在 z****e 的大作中提到】
: 所以这里是trade off
z****e
发帖数: 54598
119
所以只能是一个纯粹的c10k问题
不是c100k问题

【在 p*****2 的大作中提到】
:
: 刚做了个试验10万个incr操作,redis要用到1.5秒, 所以撑不住那个量。

p*****2
发帖数: 21240
120

靠。我以为是100k呢。10k的话确实没问题。

【在 z****e 的大作中提到】
: 所以只能是一个纯粹的c10k问题
: 不是c100k问题

相关主题
抛砖引玉,来谈谈functional programming春运这个东西,用Storm就可以轻松搞定了
俺老10年前关于语言未来的论述Node做大系统better than Java, .NET
scala 真是一个无法无天的糟货异步的话,所有语言都有自己的环境
进入Programming版参与讨论
b*******s
发帖数: 5216
121


【在 p*****2 的大作中提到】
:
: 靠。我以为是100k呢。10k的话确实没问题。

p*****2
发帖数: 21240
122
还是不对,单机方案如何解释
要求对大部分的请求做到后面请求的id要
比前面的大
z****e
发帖数: 54598
123
incre不行还是什么原因?

【在 p*****2 的大作中提到】
: 还是不对,单机方案如何解释
: 要求对大部分的请求做到后面请求的id要
: 比前面的大

b*******s
发帖数: 5216
124
他的方案是counting,这个其实还有个隐患是大数问题,不过用64 bits够了
刚才算了下可以按每秒1万,挺个几千万年

【在 p*****2 的大作中提到】
: 还是不对,单机方案如何解释
: 要求对大部分的请求做到后面请求的id要
: 比前面的大

b*******s
发帖数: 5216
125
服务用node不错

【在 p*****2 的大作中提到】
: 还是不对,单机方案如何解释
: 要求对大部分的请求做到后面请求的id要
: 比前面的大

p*****2
发帖数: 21240
126

不是不行。是这样可以绝对的按顺序排列了。貌似跟面试官想考察的不是一个东西。不
然面试官为什么说那话。

【在 z****e 的大作中提到】
: incre不行还是什么原因?
z****e
发帖数: 54598
127
你是说绝对按照顺序排列和题目中大部分按照顺序排列有些不符?
这里貌似可以有优化的空间
比如让所有active nodes跑id generator node注册一下
然后id generator node扫描监控所有node上的id pool
低于一定程度,就塞一批过去,这样不能保证绝对顺序
但是大概有那么点意思

【在 p*****2 的大作中提到】
:
: 不是不行。是这样可以绝对的按顺序排列了。貌似跟面试官想考察的不是一个东西。不
: 然面试官为什么说那话。

p*****2
发帖数: 21240
128

我就是这个意思。如果单机的话就可以保证绝对顺序了。
我感觉id generator node不应该主动塞。应该是被动的。

【在 z****e 的大作中提到】
: 你是说绝对按照顺序排列和题目中大部分按照顺序排列有些不符?
: 这里貌似可以有优化的空间
: 比如让所有active nodes跑id generator node注册一下
: 然后id generator node扫描监控所有node上的id pool
: 低于一定程度,就塞一批过去,这样不能保证绝对顺序
: 但是大概有那么点意思

z****e
发帖数: 54598
129
那就pool一批id
然后放在list里面
每一次request过来,先看当前id是否被锁
如果被锁,则跳到下一个去拿id,以此类推
然后拿id的时候,锁住当前的坑位
酱紫,不能保证绝对,但是一般而言,还是先到先得
检查lock的话,java代码可以看这个
http://stackoverflow.com/questions/1779795/how-do-determine-if-

【在 p*****2 的大作中提到】
:
: 我就是这个意思。如果单机的话就可以保证绝对顺序了。
: 我感觉id generator node不应该主动塞。应该是被动的。

p*****2
发帖数: 21240
130

redis数大了应该就变浮点了,
node里的integer应该也是bigint

【在 b*******s 的大作中提到】
: 他的方案是counting,这个其实还有个隐患是大数问题,不过用64 bits够了
: 刚才算了下可以按每秒1万,挺个几千万年

相关主题
现在脚本程序员在进入企业和webSpark已经out了,能跳船的赶快
拿C*当message queue用,不知道哪里面试能通过傻逼太监懂个屁C*
real time distributed frameworkakka能代替卡福卡么?
进入Programming版参与讨论
b*******s
发帖数: 5216
131
bigint就够了
浮点当id不是很常规

【在 p*****2 的大作中提到】
:
: redis数大了应该就变浮点了,
: node里的integer应该也是bigint

b***i
发帖数: 3043
132
你这里说请求来自全球,很后面又说服务器遍布全球。条件能不能确定一下?
如果请求每秒10000个,真的一个服务器就行了,就是能够保证round robin的机制。比
如AKKA。

【在 f**********3 的大作中提到】
: 设计一个系统,每次请求返回一个唯一的id,要求对大部分的请求做到后面请求的id要
: 比前面的大,要平均每秒能处理10000个请求,而且请求来自全球。还要求id尽量连续
: ,想过用时间做id,被毛子否了。

l*********s
发帖数: 5409
133
这个不好,等于优先级要受客户机器时钟影响了。

【在 b*******s 的大作中提到】
: 单机的问题是,递增性是按照请求到达的顺序来的,而不是请求发起的顺序,这样由于
: 网络路由不同,我们坐在一起,可能你先提交请求,但是拿到的id我比你小。
: 不过其实也很容易解决,在request里面加时间戳就是了,服务器端处理就用LUT,表对
: gps clocks的采样多一点,比如比需求高一个数量级,问题就不大了
:
: 了。

b*******s
发帖数: 5216
134
我在另一个帖子里补充过了

【在 l*********s 的大作中提到】
: 这个不好,等于优先级要受客户机器时钟影响了。
b***i
发帖数: 3043
135
产生几百万个incr有什么难度?

【在 p*****2 的大作中提到】
:
: redis数大了应该就变浮点了,
: node里的integer应该也是bigint

z****e
发帖数: 54598
136
时间消耗达不到要求
二爷力图在一秒内生成100k个ids

【在 b***i 的大作中提到】
: 产生几百万个incr有什么难度?
L*******r
发帖数: 119
137
这样行么:搞个message queue,后台有server不断产生新的id往里扔,前台所有server
从MQ里拿,MQ确保每个id只会被一台server acquire(应该很简单)。失败了就再申请
一次。要是怕一直申请不到,就搞个weight啥的,失败次数越多weight越高,下次拿到
的可能性越大。
这个就是比较简单了。MQ肯定是现成的,大约几十行code就能搞定。

【在 f**********3 的大作中提到】
: 设计一个系统,每次请求返回一个唯一的id,要求对大部分的请求做到后面请求的id要
: 比前面的大,要平均每秒能处理10000个请求,而且请求来自全球。还要求id尽量连续
: ,想过用时间做id,被毛子否了。

b***i
发帖数: 3043
138
不就是一个id吗?1秒50万个轻而易举啊?
但是要这样,分开id的产生和检查。id可以浪费,但是用一个唯一的不可重入的函数来
返回id。然后取得id的线程要查询以前这个ip/mac地址是否获得过id。不懂这个级别的
面试题怎么会成为问题。

【在 z****e 的大作中提到】
: 时间消耗达不到要求
: 二爷力图在一秒内生成100k个ids

w****w
发帖数: 521
139
假定最多用256个server,64位的id:
前48位放从2010年1月1日开始的毫秒数,再8位毫秒内的计数,最后8位server的id,不
可以么?

【在 f**********3 的大作中提到】
: 设计一个系统,每次请求返回一个唯一的id,要求对大部分的请求做到后面请求的id要
: 比前面的大,要平均每秒能处理10000个请求,而且请求来自全球。还要求id尽量连续
: ,想过用时间做id,被毛子否了。

z****e
发帖数: 54598
140
没怎么倒腾过redis,不知道二爷那个数据是怎么做的
就假设二爷那个测试是正确的吧,不过这种单机的node
瓶颈是很明显的
不过很有趣的是,有些人看我说的马上反应过来这个有瓶颈
老魏说了半天居然在附和,生成一个id处理比搞火车票
那是要简单一万倍都不只了,如果这个有瓶颈
那火车票的瓶颈岂不是更明显?

【在 b***i 的大作中提到】
: 不就是一个id吗?1秒50万个轻而易举啊?
: 但是要这样,分开id的产生和检查。id可以浪费,但是用一个唯一的不可重入的函数来
: 返回id。然后取得id的线程要查询以前这个ip/mac地址是否获得过id。不懂这个级别的
: 面试题怎么会成为问题。

相关主题
akka能代替卡福卡么?vert.x也支持redis
请问mongodb + nodejs 如何保证原子操作掏钱买support的的确都是脑子进水的
感觉vert.x的设计很一般呀Redis和Memcached有什么区别?
进入Programming版参与讨论
b***i
发帖数: 3043
141
我也没用redis,就是系统依靠一个单机实现id的生成。然后把id, ip, mac发送给多个
服务器,这些服务器根据ip,mac等来分库。我估摸着查找一个ip/mac是否用过这个存储
的信息量非常大,所以得用数据库了,分库是可以轻松提高并行度的。
不过我的目标是每秒百万的查询。当然web也是多个服务器,只不过这个id的生成是一
个单机上的“瓶颈”,这样才能保证唯一。

【在 z****e 的大作中提到】
: 没怎么倒腾过redis,不知道二爷那个数据是怎么做的
: 就假设二爷那个测试是正确的吧,不过这种单机的node
: 瓶颈是很明显的
: 不过很有趣的是,有些人看我说的马上反应过来这个有瓶颈
: 老魏说了半天居然在附和,生成一个id处理比搞火车票
: 那是要简单一万倍都不只了,如果这个有瓶颈
: 那火车票的瓶颈岂不是更明显?

1 (共1页)
进入Programming版参与讨论
相关主题
Node做大系统better than Java, .NET请问mongodb + nodejs 如何保证原子操作
异步的话,所有语言都有自己的环境感觉vert.x的设计很一般呀
现在脚本程序员在进入企业和webvert.x也支持redis
拿C*当message queue用,不知道哪里面试能通过掏钱买support的的确都是脑子进水的
real time distributed frameworkRedis和Memcached有什么区别?
Spark已经out了,能跳船的赶快准备上Spray了
傻逼太监懂个屁C*vert.x 3预计月底发布beta1版本
akka能代替卡福卡么?抛砖引玉,来谈谈functional programming
相关话题的讨论汇总
话题: ip话题: uuid话题: node话题: 数据库话题: 请求