Java 自动读取、修改和更新AWS S3

Java 自动读取、修改和更新AWS S3,java,amazon-s3,microservices,distributed-system,Java,Amazon S3,Microservices,Distributed System,我有一个用例,需要修改S3对象。 我是如何做到这一点的,具体如下: Person person = getObject(key); person.setAge(46); saveObject(key, person); ConcurrentHashMap<String, Object> lockMap = new ConcurrentHashMap<>(); public void saveObject(String key, Person person) { O

我有一个用例,需要修改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.
}
上述代码的问题是,当另一个线程试图同时修改同一个人的城市时,这可能会导致不一致

我也尝试过使用以下方法获取对象钥匙上的锁,如下所示:

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.
}
ConcurrentHashMap lockMap=new ConcurrentHashMap();
public void saveObject(字符串键,Person){
对象锁=空;
已同步(lock=lockMap.getOrDefault(键,新对象()){
锁图。放置(钥匙、物体);
Person=getObject(key);
人.胎位(46);
保存对象(键、人);
}
lockMap.remove(key);//不希望贴图变大。
}
通过这种方式,我可以实现原子性,但在分布式上下文(具有多个微服务节点)中,这将失败,因为原子性无法在所有节点上维护


是否有任何解决方法可以实现相同的目标,或者AWS S3提供了为此目的而构建的功能?

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

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

我们现在可以通过只在S3中设置锁来实现这一点吗。我知道我们必须获得锁,然后在使用后从S3中删除锁。现在可以降低性能了。@Ruman您是否已经在应用程序中使用了任何存储,如RDBMS或Redis?如果你这样做了,你可以在那里实现你的锁。应用程序中没有使用Dbms或Redis。把锁存储在S3本身怎么样@cvlCan我们现在只需要在S3中设置锁就可以了。我知道我们必须获得锁,然后在使用后从S3中删除锁。现在可以降低性能了。@Ruman您是否已经在应用程序中使用了任何存储,如RDBMS或Redis?如果你这样做了,你可以在那里实现你的锁。应用程序中没有使用Dbms或Redis。把锁存储在S3本身怎么样@svetha.cvl