缓存管理构建ian逻辑

在关于春季缓存管理器的第三篇文章中(在很长一段时间内),我想对

在这个领域有许多工具--MSPowerApps、OutSystems、Appian、Mendix、Google最近收购的AppSheets、Nineox、WaveMaker等等。而且他们的方法和功能集可能略有不同,但关键是能够轻松地创建应用程序(基于web、基于移动、混合),以解决这些用户所面临的一些直接痛苦,而通过一个完整的IT项目和相关的开发成本是过头的。

这听起来很棒--你不需要依赖于你的非IT公司过于繁忙和不经常响应的IT部门,你只需要自己构建一些东西来优化你眼前的问题并数字化你的文件处理过程。它可以做到这一点。老实说,我喜欢这种工具存在的想法,因为很大一部分数字转换不是由庞大的集中式系统和多年的开发项目很好地处理的。在这样的环境中,对于数字转换的需求越来越大,而昂贵的、可用性有限的开发人员需要更多的灵活性。我们必须承认,专业开发人员不可能无处不在,解决信息技术可以解决的每一个问题。因此,这些工具实现了数字化变革的民主化,让非技术人员能够创建软件。

或者至少这是理论。实际上,这在许多方面具有挑战性:

https://www.douban.com/doulist/143319517/

    • 需要一些技术知识-能够绘制实体关系图是很酷的,但首先你需要知道数据模型是什么。能够导入Web服务并调用它是很好的,但是您必须知道Web服务是什么。集成用户目录意味着您知道LDAP/AD是什么。我不确定非技术人员是否能够真正利用这些能力。有些工具即使打开一个新对话框也需要简单的代码,而且您必须从某个地方复制粘贴这些代码。
    • 与前提系统的集成-建立有用的东西几乎总是需要与现有系统相结合。假设一切都在“云”中是可以的,但从第三方SaaS的角度来看,即使是云也可以看作是前提。通过提供IP、用户名和密码,我看到了许多与数据库集成的工具--这几乎从来不是这样,也是个坏主意。能够连接到该机构基础结构中的某些内容(即使该基础设施位于Azure上,并且您正在使用MSPowerApps)意味着权限、网络规则配置、帐户、批准。你必须知道要求什么才能得到它。
    • 供应商锁定-大多数代码较低的工具使用专有格式进行元描述(例如,有些工具甚至将其元数据的二进制表示形式存储在本地sqite数据库中)。有些提供商允许您通过安装服务器端应用程序在自己的云上运行应用程序,但有些则是纯粹的SaaS。一旦您用一个工具构建了一个应用程序,您就无法真正切换到另一个工具。好的例外是WaveMaker和Skyve,它们生成实际的Java代码,您可以随时下载这些代码。锁不好吗?好吧,是的--如果碰巧你需要一个还没有得到的特性,或者还没有集成,你就会陷入困境。
    • 影子IT-一个机构的所有信息技术都假定是由信息技术部门管理和观察的。在监控、安全、遵从性、数据保护、生命周期管理、技术支持等方面,这些应用程序在使用低代码的情况下可能存在,而IT部门甚至不知道这些应用程序,这会带来许多风险(我将在下面讨论)。
    • 可持续性-如果一家低代码公司倒闭,或者被某个决定淘汰一种产品或一套功能的人收购,该怎么办?当创建低代码应用程序的员工离开而没有人知道如何使用所选的工具进行“编程”以支持应用程序时,会发生什么情况呢?当低代码应用本身成为遗产时会发生什么呢?由于供应商的锁定和缺乏任何标准化,这在可持续性方面是一个很大的风险。当然,你会以某种方式解决眼前的问题,但是你可能会创造更多的问题。

过演示如何配置动态创建缓存的多个缓存管理器。

春有CompositeCacheManager理论上,这应该允许使用多个缓存管理器。它的工作方式是询问底层缓存管理器是否有带有请求名称的缓存。这方面的问题是,当您需要根据某些全局配置动态创建缓存时。这是常见的情况,当您不想手动定义缓存,而是只想添加@Cacheable并让Spring(和底层缓存管理器)用一些合理的默认值为您创建缓存。

在需要一个以上的缓存管理器之前,这是很棒的。例如,一个用于本地缓存,另一个许多情况下,需要一个分布式缓存;然而,并不是所有的方法调用都需要分发--有些方法调用可能是处理它的实例的本地调用,而且您不希望用可以在本地保存的东西来负担您的分布式缓存。是否可以将分布式缓存提供程序配置为将某些缓存指定为本地缓存,即使它是由分布式缓存提供程序处理的--也许是这样,但我并不保证这会很简单。

https://www.douban.com/note/810749868/

因此,面对这个问题,我不得不设计一些简单的机制,把一些缓存指定为“分发”,而将一些指定为“本地”。使用CompositeCacheManager仅靠自己是做不到的,所以我扩展了分布式缓存管理器(在本例中是Hazelcast,但可以通过任何提供者完成):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
 * Hazelcast cache manager that handles only cache names with a specified prefix for distributed caches
 */
public class OptionalHazelcastCacheManager extends HazelcastCacheManager {
 
    private static final String DISTRIBUTED_CACHE_PREFIX = "d:";
 
    public OptionalHazelcastCacheManager(HazelcastInstance hazelcast) {
        super(hazelcast);
    }
 
    @Override
    public Cache getCache(String name) {
        if (name == null || !name.startsWith(DISTRIBUTED_CACHE_PREFIX)) {
            return null;
        }
 
        return super.getCache(name);
    }
}

以及相应的复合缓存管理器配置:

https://www.meipian.cn/3r0iv41s

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<bean id="cacheManager" class="org.springframework.cache.support.CompositeCacheManager">
    <property name="cacheManagers">
        <list>
            <bean id="hazelcastCacheManager" class="com.yourcompany.util.cache.OptionalHazelcastCacheManager">
                <constructor-arg ref="hazelcast" />
            </bean>
 
            <bean id="caffeineCacheManager" class="com.yourcompany.util.cache.FlexibleCaffeineCacheManager">
                <property name="cacheSpecification" value="expireAfterWrite=10m"/>
                <property name="cacheSpecs">
                    <map>
                        <entry key="statistics" value="expireAfterWrite=1h"/>
                    </map>
                </property>
            </bean>
        </list>
    </property>
</bean>

这基本上意味着任何以名称开头的缓存d:(用于“分布式”)应该由分布式缓存管理器处理。否则,继续下一个缓存管理器(在本例中为咖啡因)。因此,当您想要定义一个具有可缓存结果的方法时,您必须决定它是否是@Cacheable("d:cachename")或者只是@Cacheable("cachename")

这可能是解决这个问题的许多方法之一,但我喜欢它的简单性。缓存很重要的是),虽然我们幸运地获得了Spring抽象的大部分内容,但有时我们不得不自己处理特殊情况。

 
posted @ 2021-08-21 15:01  javd9w  阅读(114)  评论(0)    收藏  举报