原子地读取、修改和更新awss3

rqqzpn5f  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(374)

我有一个用例需要对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提供了一些已经为此目的构建的东西?

r8xiu3jd

r8xiu3jd1#

s3没有提供处理这个问题的机制。您必须使用另一个服务(如dynamodb)构建分布式锁定机制。我建议评估这些对象是否应该存储在s3中,因为这看起来确实是dynamodb或其他nosql数据库的一个很好的用例。

相关问题