Sentinel sentinel-dashboard并发下流控规则丢失问题

ibrsph3r  于 2021-11-29  发布在  Java
关注(0)|答案(11)|浏览(343)

多人同时操作流控规则查询和添加时有概率出现规则丢失的情况。配置中心Apollo
1.apiQueryMachineRules查询操作分为几步
a.从配置中心Apollo获取规则
b.清空内存中appRules等信息
c.循环保存规则信息至内存appRules
d.返回规则列表
2.apiAddFlowRule添加操作分为几步
e.保存app规则至内存appRules,若该app无配置,则新建
f.推送内存appRules等信息到配置中心Apollo

多人并发操作情况下,假如某app已存在规则_X_、Y,添加_Z_规则时,有人访问控制台查询规则列表,并至b处,
这时添加操作开始执行至 e 处读取无配置并新建往里面塞入_Z_。然后推送只有Z的列表到Apollo保存。
此时两个操作执行结束后,X、_Y_丢失。

hvvq6cgz

hvvq6cgz1#

这个问题我也发现了,感觉之前这部分设计怪怪的。

rryofs0p

rryofs0p2#

我是通过把这部分逻辑注解掉来解决的
这样会将Apollo拉取的规则和内存里的合并 但不会丢失 这样我能接受

slmsl1lt

slmsl1lt3#

这里最简单的方法应该在InMemoryRuleRepositoryAdapter每个方法加个synchronizd同步就行了吧

5uzkadbs

5uzkadbs4#

+1,对规则的设置同时并发的概率一般比较小吧,特别是对同一个资源设置规则,因为除开压测,线上的限流需谨慎操作。

因为每次保存还是很快的,如果只是几个人同时操作,看看synchronizd同步查询和保存方法是否可以满足。

h43kikqp

h43kikqp5#

这样做还存在个问题,多个应用间隔操作会导致一个应用的clear all会清空另一个 应用的缓存。

iecba09b

iecba09b7#

Hi, Liang

Do you mean you want to solve it submitting a PR?

0pizxfdo

0pizxfdo9#

Done.
Look forward to your contribution.

btqmn9zl

btqmn9zl10#

给InMemoryRuleRepositoryAdapter方法加synchronized似乎并不能解决此问题,当线程A阻塞在apiQueryMachineRules的repository.saveAll(rules)时,此时A获取到的rules是旧的(假设为旧的_X_、Y)。线程B执行完apiAddFlowRule的repository.save(entity)之后,新加了_Z_规则,此时到线程A拿着旧的rules去saveAll,线程B新加的_Z_将被删除。

2jcobegt

2jcobegt11#

我觉得这些东西不应该有多个人去管理,即使有,肯定都是按服务分开的。当然这个问题能解决肯定更好。

相关问题