如何在Geode地区存储相关条目

问题描述

我们对草图进行操作(大小可能从1GB到15GB不等),当前将它们分解为包裹(每个包裹约50mb)并将其存储在Geode分区中,我们从S3中读取这些数据并将所有他们在该地区。成功完成后,我们将在该区域中插入一个条目(标记键)。该标记键在我们的业务逻辑中非常重要。

下面是区域配置

<region name="region_abc">
    <region-attributes data-policy="partition" statistics-enabled="true">
        <key-constraint>java.lang.String</key-constraint>
        <entry-time-to-live>
            <expiration-attributes action="destroy" timeout="86400"/>
        </entry-time-to-live>
        <partition-attributes redundant-copies="0">
            <partition-resolver name="SingleBucketPartitioner">
                <class-name>com.companyname.geode.sketch.partition.SingleBucketPartitioner</class-name>
            </partition-resolver>
        </partition-attributes>
        <cache-loader>
            <class-name>com.companyname.geode.abc.cache.BitmapSketchParcelCacheLoader</class-name>
            <parameter name="s3-region-name">
                <string>us-east-1</string>
            </parameter>
            <parameter name="s3-bucket-name">
                <string>xyz</string>
            </parameter>
            <parameter name="s3-folder-name">
                <string>abc</string>
            </parameter>
            <parameter name="s3-read-timeout">
                <string>600</string>
            </parameter>
            <parameter name="read-through-pool-size">
                <string>70</string>
            </parameter>
            <parameter name="measurement-group">
                <string>abcd</string>
            </parameter>
        </cache-loader>
        <cache-listener>
            <class-name>com.companyname.geode.abc.cache.ClearMarkerKeyAfterAnyEntryDestroyCacheListener</class-name>
        </cache-listener>
        <eviction-attributes>
            <lru-heap-percentage action="local-destroy"/>
        </eviction-attributes>
    </region-attributes>
</region>

如果该区域中存在标记键,则假定我们具有草图的所有条目。

我们目前已将缓存逐出设置为在堆使用率的70%时触发,这会使用LRU算法逐出缓存条目。由于缓存的逐出,我们一直在看到数据不一致的地方。我们发现了一些场景,其中缓存驱逐驱逐了一些或许多条目,但没有标记键,这给该对象带来了不一致性,因为应用程序认为我们拥有所有条目,但实际上却没有。

要解决此问题,我们还为销毁实现了一个侦听器,但是以某种方式也无法解决问题。

'''

@Override
public void afterDestroy(EntryEvent<String,BitmapSketch> event) {

    String regionKey = event.getKey();
    Region<String,BitmapSketch> region = event.getRegion();

    // take action only when non-marker key is evicted and marker key is still present
    if (regionKey != null && !regionKey.startsWith("[")) {

        //asynchronus call
        reloadExecutor.submit(
                () -> {

                    String markerKey = "[".concat(regionKey.substring(0,regionKey.indexOf("_")).trim().concat("]"));

                    //check for marker key presence before removing the marker key
                    if (region.containsKey(markerKey)) {

                        logger.info("FixGeodeCacheInconsistency : Marker key exist !!! Deleting the marker key associated with the entry key. Region: `{}`;  Entry Key: `{}`;  Marker Key: `{}`",region.getName(),regionKey,markerKey);

                        //remove the marker key from the region to bring consistency for the sketch
                        region.remove(markerKey);

                        logger.info("FixGeodeCacheInconsistency : Marker key destroyed. Region: `{}`;  Entry Key: `{}`;  Marker Key: `{}`",markerKey);

                    }
                });
    }
}

'''

我们现在正在寻找其他更可靠的解决方案,并试图更深入地研究问题。

笔记组合

  1. 我们正在打破一个大对象,并将零件作为条目存储在该区域中。
  2. 我们向该区域添加一个标记键,以确定对象是否存在
  3. 我们从该区域读取了该对象的所有部分,以创建大对象
  4. Geode地区不知道这些部分之间的联系

一个这样的对象的简单示例。 例如,对象是E12345

  • 标记键:-[E12345]
  • 零件/条目:-E12345_00,E12345_01,E12345_02,E12345_03,E12345_04,E12345_05等...。

Geode Cache驱逐有时会驱逐某些部分,但不会驱逐标记键,这会导致所有问题。

我们正在尝试提出实现以下任何一项的方法。

  1. 是否可以将相关条目分组在一起,以便Geode知道这些是一个更广泛对象的相关条目
  2. 如何确保Geode缓存逐出不会引起不一致。当前,它正在删除一些条目并保留其中的一些条目,这导致最终结果不一致
  3. 这是区域锁定语义的好用例吗?

我很乐意根据需要提供更多背景信息和详细信息。

对任何详细信息/指导/建议表示赞赏。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...