1
pifuant 2019-03-12 18:38:31 +08:00
单机分布式锁?
|
2
holyghost 2019-03-12 18:39:39 +08:00
单机分布式锁?
|
3
sujin190 OP |
4
liprais 2019-03-12 18:42:42 +08:00
楼主是不是不知道啥是分布式锁........
|
8
whatsmyip 2019-03-12 18:50:57 +08:00
emmmm
|
9
yangbin9317 2019-03-12 18:52:49 +08:00 via iPhone
tql ……
|
10
zealot0630 2019-03-12 18:54:25 +08:00 via Android
楼主放弃了 CAP 中的 C,然后搞了个毫无实用价值的东西
|
11
sujin190 OP @holyghost #7 那可能你是没理解,我这需要的是同步,不是一致性,Paxos 之类的协议都解决的是一致性问题,并不是解决同步问题
一致性有很多协议可以解决,但是同步无论什么协议,最终都需要一个中心来确认吧 而且在需要同步的场景中,那么应该是很快速资源消耗很低的方式实现才是 在简单场景中,很多时候完全可以依赖同步很简单解决一致性问题,但是同步并不是完全用了解决一致性问题的 |
12
zealot0630 2019-03-12 18:55:02 +08:00 via Android
搞错了 放弃了 A
|
13
sujin190 OP @zealot0630 #10 这解决的是同步问题,并不是数据库场景中的一致性问题
|
14
wusatosi 2019-03-12 19:08:01 +08:00
那要是中心突然下线了怎么办(。)
|
16
sujin190 OP @wusatosi #14 同步问题中不是特别怕中心挂的情况吧
一般来说同步场景都是某一刻同步,比如 a 和 b 在前一刻用 1 中心同步,那么 c 和 d 为啥不能在下一刻用 2 备用中心同步呢,其中产生的一致性问题应该仍然还是由数据库事物或者其他一致性协议来保证 总的来说,分布式锁其中一个场景应该是想要解决的问题应该是我们在很多时候使用一致性结果来同步的极大资源消耗问题,比如很明显的秒杀场景中,是否还有库存这个状态 其他的比如扫码登陆时,是否已经扫码不也是一个同步问题么 |
17
sujin190 OP @pifuant #15 本来就是小工具啊,解决小微场景中某些用锁可以很方便解决的同步问题,并没有说在大型场景中可以很成熟使用
|
18
wweir 2019-03-12 19:59:02 +08:00 via Android
讲个笑话,paxos、raft 没解决同步的问题 😹
|
19
sujin190 OP @pifuant #15 不过最近也在考虑也行可以加入 binlog 和集群模式看看,也只是探讨,在很多小微场景确实高可用不是特别突出,简单快速解决问题也挺好不是
|
21
lhx2008 2019-03-12 20:03:41 +08:00 via Android
如果不用高可用,和 redis 单机锁性能相比何如?应该也没啥优势吧。
|
22
aleung 2019-03-12 20:03:57 +08:00 via Android
你说这是高性能锁服务就好了,那么大家还能讨论一下。
|
26
kkeiko 2019-03-12 20:10:20 +08:00
楼主的代码实践的还不错,但一般来说,秒杀场景首先要求高可用,可以参考淘宝的秒杀系统设计的一些文章。
|
28
sujin190 OP @wweir #23 我知道啊,这难道不是用一致性来解决同步问题么,所以核心还是一致性啊
这里不是主要讲数据同步,更多是即时状态同步 |
30
aleung 2019-03-12 20:28:46 +08:00 via Android
@sujin190 你做的是“给分布式系统使用的锁服务”,而从你的描述中,大家理解的是“锁服务,这个服务本身是分布式的”。你始终还没有理解到这个区别。
|
31
reus 2019-03-12 20:32:39 +08:00 1
一行测试都没有
变量名不符合惯例 目录结构不符合惯例,主程序没法 go get 下载 不知道标准库的 binary 包,协议处理过于罗嗦 go vet 发现一处大错,复制了 sync.Mutex 总而言之,正确性都未能保证,就不要奢谈性能了 |
32
jay1002008 2019-03-12 20:44:58 +08:00
这个单点问题有点严重
|
33
sujin190 OP |
35
wusatosi 2019-03-12 22:15:39 +08:00
@sujin190
那假设 a,b,c,d 都在抢一个锁,a 在写入前中心下线,b,c,d 请求锁,这时候换到 node 2,写在了 a 前面怎么办?(。) "分布式"标签都在了,没有办法冗余不妥吧... |
36
reus 2019-03-12 22:43:47 +08:00 2
@sujin190 没有测试,就说明你没有尽最大努力去保证正确。连复制 sync.Mutex 这种错误都出现了,基本可以说是垃圾代码。嫌麻烦不写测试,却不嫌麻烦不用 binary 包,不知所谓。
|
37
JohnSmith 2019-03-13 00:39:34 +08:00 via iPhone
@zealot0630 不应该是 P 吗?分区可用性
|
38
reus 2019-03-13 08:47:45 +08:00
./slock.go:118:33: assignment copies lock value to free_result_command_lock: sync.Mutex
go vet 报的这个错,表示你以为上了锁的地方,实际没有上锁,因为你复制了 sync.Mutex 而不是用同一个。 我不知道你哪里来的自信,没有测试也敢说“正确运行” |
39
index90 2019-03-13 11:25:51 +08:00
不明白没有一致性的分布式锁有什么应用场景
|
40
sujin190 OP @wusatosi #35
@index90 #39 首先我们认为能够使用外部锁同步的,应该是极其短时且大量相关性不高事件,所以冲突概率不高,其次就算冲突,底层应该还有事物或是 raft 这样的一致性协议保证最终一致性,所以不会造成太大问题,我想已经有很多论文证明过通过一个外部锁解决一致性问题是不可能的,更别说通过外部锁解决外部系统一致性问题更不可能,所以这里同样无法解决 但是即使如此,外部锁仍有其意义 在大型系统中,raft 这样的协议解决冲突非常复杂消耗资源,更别说微服务场景中,一致性的产生更加复杂,如果外部锁某些时候确实可以消减一部分的冲突,对系统性能改善或许是有意义的,更别说在平滑系统负载,抗冲击都是有一定的意义 而在大量的中小型系统中,几乎都是短时任务的场景下,本身系统负载就低,遇到奔溃的几率本身就微乎其微,在复杂度开发周期成本考量下,我想这只是一个工程抉择问题,而且大量单机 redis 场景下,过于考虑高可用其实意义不大吧 从其他来说,操作系统提供的锁,除了 Lock 还有 Event 和 Semaphore 的吧,以往很多时候我们都用轮询、订阅或是队列来解决这两个问题了,但是在简单场景中,这确实有些复杂,能购用更简单的 Event 和 Semaphore 语义来解决这个问题又有什么不好呢 总的来说,这其实是一个工程问题,不是学术,更不是一个可以通用的解决方案,在工程中,我们有更多考量,过往积累,实现周期复杂度,成本,维护性等等,所以是否有用还是看整体系统方案,比如云,难道没有单点问题,不会有崩溃不一致问题么,我想事实不可能,但是我们综合考量,确实是最好的 只是个方案,大家仁者见仁,智者见智就好了,这不是一个通用解决方案,也不是一个学士问题 |
41
sujin190 OP @reus #38 好吧,我对 go vet 不太熟,这地方也不是核心锁,所以没注意到了,现在学习到了,已经修改过来了,感谢
|
42
swulling 2019-03-14 23:12:36 +08:00
和分布式锁没有半点关系.
哦不对,有 1/4 的关系,都是锁。 |