我有一个用例需要对s3对象进行变异。我是如何做到这一点的:
Person person = getObject(key);
person.setAge(46);
saveObject(key, person);
上述代码的问题是,当另一个线程试图同时修改同一个人的城市时,这可能会导致不一致。
我也尝试过使用以下方法,通过获取对象键上的锁,如下所示:
ConcurrentHashMap<String, Object> lockMap = new ConcurrentHashMap<>();
public void saveObject(String key, Person person) {
Object lock = null;
synchronized(lock = lockMap.getOrDefault(key, new Object())) {
lockMap.put(key, object);
Person person = getObject(key);
person.setAge(46);
saveObject(key, person);
}
lockMap.remove(key); // don't want map to grow in size.
}
这样我可以实现原子性,但在分布式上下文(有多个微服务节点)中,这将失败,因为原子性不能跨所有节点维护。
是否有任何解决方法来实现相同的目标,或者awss3提供了一些已经为此目的构建的东西?
1条答案
按热度按时间r8xiu3jd1#
s3没有提供处理这个问题的机制。您必须使用另一个服务(如dynamodb)构建分布式锁定机制。我建议评估这些对象是否应该存储在s3中,因为这看起来确实是dynamodb或其他nosql数据库的一个很好的用例。