-
-
Notifications
You must be signed in to change notification settings - Fork 10.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
通过openapi接口增加新配置,存在插入多条情况 #1317
Comments
这个目前确实是可能发生的,尤其是在open api的情况下。由于使用了软删机制,所以没法创建一个唯一索引,不知是否有啥好的建议? |
我们的本意是在保证数据安全的情况下,最大程度上的提高系统的并发,所以才有了这个namespace用户维度的可重入锁,但是我们未来提高并发,但却未能保证数据安全的初衷。 |
用户级别的可重入倒不是为了防止插入多条的,主要还是为了实现某些环境(如生产环境)的配置,每次只能一个人修改,另一个人发布这样的规范。 目前会插入多条的问题主要还是由于item表中没有唯一键索引,虽然程序中每次插入前都会检查是否已经存在,不过在open api的情况下,很有可能出现同一时刻有两个一样的item插入,在这时每个工作线程都会发现数据库中并没有这个key,然后就插入了。 或许可以考虑在portal层加一个分布式锁的扩展点,对有这样场景或需求的公司,可以自己实现一个分布式锁的接入? |
了解了,感谢耐心解答,周末愉快。 |
最终这个有解决方案吗 |
我这边验证测试了下,通过增加唯一索引,可以解决这个问题。语句为:ALTER TABLE |
#3866 增加了数据表的唯一键索引,不过 Item 表由于要支持文本模式的 comment(key 为空),所以这张表的唯一键索引后来又去除了,需要单独看下是否有合适的方案。 |
Item表重复确实这个bug,看能否跑下单元测试复现下 |
必现的,客户端使用多线程并发访问即可重现。 |
String portalUrl = "http://127.0.0.1:8070/";
|
最近发现这2个表【AppNamespace、Namespace】也存在并发插入问题,导致select时会发生错误。请教下,这2个表是否可以增加唯一索引来解决呢 |
你好,你们公司最终使用了哪种方案来解决此问题,可以分享下吗 |
我看表都是通过新建一个删除时间字段作为唯一索引,感觉略显麻烦,是否可以使用本身的创建时间字段作为索引字段呢,例如App表中的UNIQUE KEY |
这个只能解决在同一秒(DataChange_CreatedTime 目前配置的精度是到秒)插入两个 appid 数据的问题,不同时间插入同样 appid 还是无法解决的 |
那item的重复问题,目前是不是还没有比较好的解决方案呢 |
我用的是apollo2.0.1版本的,正好注册中心是zookeeper,最近也发现了这个问题,打算用zk分布式锁来解决 |
具体怎么解决啊,自己修改portal的代码? |
背景描述:
1、数据库Item表无关于该环境的key唯一索引。
2、apollo-portal项目的openapi接口使用RetryableRestTemplate待重试的工具类请求apollo-adminservice相应ItemController接口。
3、apollo-adminservice相应ItemController接口,使用@PreAcquireNamespaceLock注解通过数据库获取相应锁。
4、NamespaceAcquireLockAspect 切面中关于锁逻辑
//check lock owner is current user
checkLock(namespace, namespaceLock, currentUser);
如果前后一个user,则获取锁成功
造成结果:不含唯一索引的数据库约束,在非幂等的重试策略下,多台服务器并发请求,由已由自己获取相应锁的情况下,造成插入多条配置。
The text was updated successfully, but these errors were encountered: