【问题标题】:Detect duplicate POSTs检测重复的 POST
【发布时间】:2014-08-20 17:36:01
【问题描述】:

我正在开发一个基于 play framework 2 的原型,其中一个要求是过滤来自客户的重复发布请求。它是一个原型,并试图快速而肮脏地破解一个。我有以下数据结构和代码来跟踪重复项。

public class DuplicityService {

    private static ConcurrentHashMap<String,List<String>> keyIps = new ConcurrentHashMap<String,List<String>>();

    public static boolean isDuplicate(String key,String ip){
        List<String> value = keyIps.get(key);
        return value != null && value.contains(ip);
    }

    public static void remove(String key){
        keyIps.remove(key);
    }

    public static void add(String key,String ip){
        List<String> value = keyIps.get(key);
        if(value == null){
            value = new ArrayList<String>();

        }
        value.add(ip);
        keyIps.put(key, value);
    }
}

我在我的控制器中使用它

def submitResponse(qkey:String) = CorsAction(parse.json){
               req =>
      val json = req.body
      val key = json.\("Key").as[String]
       ....
        if(DuplicityService.isDuplicate(key,req.remoteAddress)){
          ...
          BadRequest("Duplicate Response  " + key)
        }
        else{
             ...
              DuplicityService.add(key,req.remoteAddress)

              Ok(json)
             ...
          }  
  }

并在单独的控制器方法中从并发哈希图中删除键

def publish(key: String) = Authenticated{

    ...
    DuplicityService.remove(key)
    ...
  }

现在的问题是,虽然在我的本地机器上手动测试它工作正常。我能够正确识别来自同一 IP 地址的重复发布请求。

但是,在 heroku 上,这不起作用。我能够从同一客户发出重复的发布请求。

我有一个 Heroku play 2 服务器的基本实例。

任何指点或帮助将不胜感激。

PS:不使用数据库,有没有更好的方法来做我正在尝试的事情。

谢谢

【问题讨论】:

    标签: scala heroku concurrency concurrenthashmap playframework-2.3


    【解决方案1】:

    我怀疑 Heroku 可能会创建超过 1 个 JVM 实例,要么刷新或复制你的静态单例。

    使用 Memcached 或等效的(但可能不是完全成熟的数据库,因为您基本上只是在缓存)将是我的偏好。

    或者,根据您的应用程序的可扩展性需求,为避免缓存成为瓶颈,您可能希望以一种更懒惰和分散的方式处理重复请求的方式来设计您的应用程序;符合http://en.m.wikipedia.org/wiki/Eventual_consistency 的精神。

    【讨论】:

    • 谢谢。跟进愚蠢的问题:为了最终的一致性,你必须使用像 MongoDB 这样的东西,对吗?
    • 我不这么认为,但我不能给出一个详尽的答案;随意创建另一个问题。
    猜你喜欢
    • 2016-09-09
    • 2020-12-31
    • 2016-06-18
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    相关资源
    最近更新 更多