2

我使用相干性 12.1.2.0.0

我系统的拓扑结构是:三个节点,带有应用程序(缓存客户端)和具有大量内存的独立缓存服务器。

我的目标是创建不完全依赖缓存服务器的缓存系统,同时在应用程序服务器上消耗严格的内存。所以我想将所有曾经缓存在缓存服务器上的值存储起来。但是,如果缓存服务器不工作,应用程序仍然可以使用它们的小型本地缓存进行操作。

我认为 Near 缓存是我需要的。它由本地方案作为前端方案和分布式缓存作为后端方案组成。但是,当我在客户端的分布式部分中将本地存储设置设置为 false 时,即使使用前端本地缓存,我也无法操作,因为每次放置操作都会出现“不存在启用本地存储的节点”错误。如果我将 local-storage 设置为 true 并将本地存储内存限制为例如 1 个单元缓存服务器不会从客户端接收放置的值。更准确地说,它接收其中的一些但不是全部。例如,如果我执行“put 1 1”并多次获得它,然后尝试“put 2 2”和“put 4 4”,我永远不会在缓存服务器上同时获得“2 2”和“4 4”。在这种情况下,缓存服务器包含“1 1”并且可能是值“2 2”或“4 4”之一

我尝试了带有直接本地方案的支持映射方案和内部部分带有本地方案的读写支持映射方案。结果是一样的。这是我的大概测试配置:

    <near-scheme>
        <scheme-name>near</scheme-name>
        <front-scheme>
            <local-scheme>
                <scheme-ref>local</scheme-ref>
            </local-scheme>
        </front-scheme>
        <back-scheme>
            <distributed-scheme>
                <scheme-ref>distributed</scheme-ref>
            </distributed-scheme>
        </back-scheme>
        <invalidation-strategy>all</invalidation-strategy>
    </near-scheme>

    <distributed-scheme>
        <scheme-name>distributed</scheme-name>
        <service-name>DistributedCache</service-name>
        <local-storage>false</local-storage>
        <backing-map-scheme>
          <local-scheme>
            <scheme-ref>local-binary</scheme-ref>
          </local-scheme>
        </backing-map-scheme>
        <autostart>true</autostart>
    </distributed-scheme>

    <local-scheme>
        <scheme-name>local</scheme-name>
        <eviction-policy>HYBRID</eviction-policy>
        <high-units>1</high-units>
        <unit-calculator>FIXED</unit-calculator>
        <expiry-delay>{expiry 1h}</expiry-delay>
    </local-scheme>

    <local-scheme>
        <scheme-name>local-binary</scheme-name>
        <eviction-policy>HYBRID</eviction-policy>
        <high-units>300</high-units>
        <unit-calculator>BINARY</unit-calculator>
        <expiry-delay>{expiry 1h}</expiry-delay>
    </local-scheme>

我需要什么样的方案?

4

2 回答 2

2

您尝试使用的功能不存在。Oracle Coherence 允许您在应用程序端定义近缓存,但它必须得到远缓存服务器的支持。没有它,您将无法保存任何东西。靠近缓存的客户端要求服务器端作为一个大数据库进行交互,以加载和更新从应用程序接收到的数据。您仅尝试设置 1 单元的技巧也是错误的。每个客户端都在尝试自己更新值。这里的问题是,当客户端“A”发送更新而“B”也发送时,其中一个是之前收到的(你不知道是哪个),另一个被标记为无效。然后,如果你在缓存 1 1 中,'A' 发送 2 2 和 'B' 3 3,其中之一(即 3 3) 将保留,并且 2 2 将被标记为无效,因为 1 1 在假设的边“C”中。您正在滥用近缓存的功能 - 它不是为此而指定的。Coherence 是一种可靠的缓存,如果服务器端不工作,你的应用程序也不会工作。如果您有时需要使用远程服务器更新附近的缓存(听起来像这样),请考虑使用另一种解决方案。希望我对你有所帮助。

于 2014-02-24T08:40:26.660 回答
0

丢失了您的实际问题。但是,如果您想为同一集群中的不同节点分配/限制不同的内存大小,则可以将单元计算器设置为二进制,然后在启动集群节点时通过 JVM 参数提供自定义的最大内存大小。检查如何计算缓存中对象的大小。

实现存储节点

于 2014-03-10T17:20:07.493 回答