diff --git a/notes/分布式问题分析.md b/notes/分布式问题分析.md index ebe10ae4..d7433c3c 100644 --- a/notes/分布式问题分析.md +++ b/notes/分布式问题分析.md @@ -186,7 +186,9 @@ Java 提供了两种内置的锁的实现,一种是由 JVM 实现的 synchroni **(一)基于 MySQL 锁表** -该实现方式完全依靠数据库唯一索引来实现。当想要获得锁时,就向数据库中插入一条记录,释放锁时就删除这条记录。如果记录具有唯一索引,就不会同时插入同一条记录。这种方式存在以下几个问题: +该实现完全依靠数据库的唯一索引。当想要获得锁时,就向数据库中插入一条记录,释放锁时就删除这条记录。如果记录具有唯一索引,就不会同时插入同一条记录。 + +这种方式存在以下几个问题: 1. 锁没有失效时间,解锁失败会导致死锁,其他线程无法再获得锁。 2. 只能是非阻塞锁,插入失败直接就报错了,无法重试。 @@ -245,11 +247,11 @@ Zookeeper 提供了一种树形结构级的命名空间,/app1/p_1 节点表示 **(六)羊群效应** -在步骤二,一个节点未获得锁,需要监听监听自己的前一个子节点,这是因为如果监听所有的子节点,那么任意一个子节点状态改变,其它所有子节点都会收到通知,而我们只希望它的下一个子节点收到通知。 +在步骤二,一个节点未获得锁,需要监听监听自己的前一个子节点,这是因为如果监听所有的子节点,那么任意一个子节点状态改变,其它所有子节点都会收到通知(羊群效应),而我们只希望它的后一个子节点收到通知。 # 五、分布式 Session -在分布式场景下,一个用户的 Session 如果只存储在一个服务器上,那么当负载均衡器把用户的下一个请求转发到另一个服务器上,该服务器没有保存用户的 Session,就可能导致用户需要重新进行登录等操作。 +在分布式场景下,一个用户的 Session 如果只存储在一个服务器上,那么当负载均衡器把用户的下一个请求转发到另一个服务器上,该服务器没有用户的 Session,就可能导致用户需要重新进行登录等操作。