多人同时操作流控规则查询和添加时有概率出现规则丢失的情况。配置中心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_丢失。
11条答案
按热度按时间hvvq6cgz1#
这个问题我也发现了,感觉之前这部分设计怪怪的。
rryofs0p2#
我是通过把这部分逻辑注解掉来解决的
这样会将Apollo拉取的规则和内存里的合并 但不会丢失 这样我能接受
slmsl1lt3#
这里最简单的方法应该在InMemoryRuleRepositoryAdapter每个方法加个synchronizd同步就行了吧
5uzkadbs4#
+1,对规则的设置同时并发的概率一般比较小吧,特别是对同一个资源设置规则,因为除开压测,线上的限流需谨慎操作。
因为每次保存还是很快的,如果只是几个人同时操作,看看
synchronizd
同步查询和保存方法是否可以满足。h43kikqp5#
这样做还存在个问题,多个应用间隔操作会导致一个应用的clear all会清空另一个 应用的缓存。
dkqlctbz6#
Please assign to me
iecba09b7#
Hi, Liang
Do you mean you want to solve it submitting a PR?
cnh2zyt38#
yes @jasonjoo2010
0pizxfdo9#
Done.
Look forward to your contribution.
btqmn9zl10#
给InMemoryRuleRepositoryAdapter方法加synchronized似乎并不能解决此问题,当线程A阻塞在apiQueryMachineRules的repository.saveAll(rules)时,此时A获取到的rules是旧的(假设为旧的_X_、Y)。线程B执行完apiAddFlowRule的repository.save(entity)之后,新加了_Z_规则,此时到线程A拿着旧的rules去saveAll,线程B新加的_Z_将被删除。
2jcobegt11#
我觉得这些东西不应该有多个人去管理,即使有,肯定都是按服务分开的。当然这个问题能解决肯定更好。