代码之家  ›  专栏  ›  技术社区  ›  DKhanaf

我应该使用Hazelcast来检测对REST服务的重复请求吗

  •  0
  • DKhanaf  · 技术社区  · 7 年前

    因此,防止重复“事务”的唯一方法是在某个集中的地方编写请求数据的唯一哈希。每个REST端点首先检查新请求的哈希是否已经存在,并且仅当不存在此类哈希时才继续。

    一种解决方案是在数据库中创建一个表,在该表中存储请求哈希,并始终在继续处理请求之前写入该表。然而,我想要比这更轻的东西。

    另一种解决方案是使用Redis之类的工具,在继续请求之前,向Redis写入我的唯一哈希。然而,我不想启动Redis集群并维护它等等。。

    我在考虑将Hazelcast嵌入到我的每个应用程序实例中,并在那里编写我独特的哈希。理论上,所有实例都将在内存网格中看到哈希,并能够检测重复请求。这解决了我的问题,即拥有比数据库更轻的解决方案,以及不必维护Redis集群的其他需求。

    提前感谢,欢迎提出所有想法。

    2 回复  |  直到 7 年前
        1
  •  1
  •   noctarius    7 年前

    Map<String, Boolean> Map::containsKey 而不是检索元素并检查 null 。在放置元素时,还应该放置TTL,这样就不会耗尽内存。然而,与Redis一样,我们建议将Hazelcast与独立集群一起用于“更大”的数据集,因为缓存元素的生命周期通常会干扰应用程序的其余部分,并使GC优化复杂化。运行Hazelcast embedded是一种选择,只有在认真考虑并在运行时测试应用程序后才能选择。

        2
  •  1
  •   Swapnil Gangrade    7 年前

    从我在测试中阅读和看到的情况来看,它实际上并没有复制。它使用数据网格将主数据均匀地分布在所有节点上,而不是每个节点保留所有内容的完整副本并进行复制以同步数据。这方面的好处是没有数据延迟,这是任何复制策略所固有的。

    请参阅下面的代码,该代码创建了两个hazelcast集群实例,并获得了分布式映射。一个hazelcast实例将数据放入分布式IMap,另一个实例正在从IMap获取数据。

    import com.hazelcast.config.Config;
    import com.hazelcast.core.Hazelcast;
    import com.hazelcast.core.HazelcastInstance;
    import com.hazelcast.core.IMap;
    
    public class TestHazelcastDataReplication {
    
        //Create 1st Instance
        public static final HazelcastInstance instanceOne = Hazelcast
                .newHazelcastInstance(new Config("distributedFisrtInstance"));
        //Create 2nd Instance
        public static final HazelcastInstance instanceTwo = Hazelcast
                .newHazelcastInstance(new Config("distributedSecondInstance"));
        //Insert in distributedMap using instance one 
        static IMap<Long, Long> distributedInsertMap = instanceOne.getMap("distributedMap");
        //Read from distributedMap using instance two
        static IMap<Long, Long> distributedGetMap = instanceTwo.getMap("distributedMap");
    
        public static void main(String[] args) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    for (long i = 0; i < 100000; i++) {
                        //Inserting data in distributedMap using 1st instance
                        distributedInsertMap.put(i, System.currentTimeMillis());
                        //Reading data from distributedMap using 2nd instance
                        System.out.println(i + " : " + distributedGetMap.get(i));
                    }
                }
            }).start();
        }
    
    }