Quarkus Infinispan 嵌入式扩展

我们很高兴地宣布 Quarkus Infinispan 嵌入式扩展的首次发布!此扩展现已在 Quarkiverse Hub 上提供。对于希望在 Quarkus 中以嵌入模式使用 Infinispan 的开发者来说,这是一个重要的进步。

什么是 Infinispan 嵌入式模式?

Infinispan 是一个强大的、分布式的内存数据存储和缓存。在嵌入式模式下,Infinispan 作为库在您的应用程序内部运行,无需独立的服务器。这意味着您的应用程序可以直接在其自身进程中处理数据缓存和存储,从而提高速度并简化操作。

为什么要使用 Quarkus Infinispan 嵌入式扩展?

新扩展使得在 Quarkus 中轻松使用 Infinispan 成为可能,仅需最少的配置,并为您的 Quarkus 应用带来快速的内存性能。

在 Quarkus 中使用 Infinispan 嵌入式的用例

以下是一些在 Quarkus 中使用 Infinispan 嵌入式模式可能非常适合的场景

内存缓存:将 Infinispan 作为本地缓存使用,以加速数据检索并减少应用程序的数据库负载。

临时数据处理:直接在应用程序内部管理和处理临时或生命周期短的数据。

微服务的本地数据存储:将 Infinispan 用作轻量级的内存存储,适用于不需要集中式数据持久化的单个微服务。

离线应用程序:在使用离线或边缘应用程序,且外部服务器不可用时,Infinispan 嵌入式模式可确保数据在本地高效存储。

小型集群中的数据复制:使用 Infinispan 在少量节点之间处理数据复制,而无需额外的 Infinispan 服务器开销。

使用 Infinispan 嵌入式模式的权衡

虽然 Infinispan 嵌入式模式提供了简洁性和速度,但也有一些需要考虑的权衡。由于 Infinispan 在应用程序进程内运行,它会共享相同的内存和 CPU 资源。这会增加应用程序的资源使用量,尤其是在数据量增长时。此外,嵌入式模式最适合单节点或小规模部署;对于更大规模的分布式系统,使用远程模式配合专用 Infinispan 服务器可能提供更好的可伸缩性和关注点分离。

Infinispan 嵌入式与 Kubernetes 部署

在 Kubernetes 上运行应用程序时,使用 Infinispan 嵌入式模式可能会带来额外的挑战。例如,扩展嵌入式 Infinispan 的设置需要扩展整个应用程序 Pod,这可能不如独立扩展外部 Infinispan 集群那么高效。Kubernetes 处理分布式工作负载的能力与远程 Infinispan 设置更为契合,后者可以将存储和应用程序层分开扩展,以改进资源管理。

有关更多信息,请查阅官方 Infinispan 文档中的 性能和调优指南

如何开始

入门非常简单。只需将依赖添加到您的 Quarkus 应用程序即可

<dependency>
    <groupId>io.quarkiverse.infinispan</groupId>
    <artifactId>quarkus-infinispan-embedded</artifactId>
    <version>1.0.1</version>
</dependency>

然后,您可以注入 EmbeddedCacheManager 并与 Infinispan 进行交互。

@Inject
private EmbeddedCacheManager cacheManager;

要启用 Protobuf 序列化,您可以定义一个如下所示的 schema

@Proto
public record Greeting(String name, String message) {
    @ProtoSchema(includeClasses = { Greeting.class }, schemaPackageName = "io.quarkiverse.infinispan")
    public interface GreetingSchema extends GeneratedSchema {
    }
}

使用 EmbeddedCacheManager,您将能够动态创建缓存。

Configuration config = new ConfigurationBuilder()
                .encoding().mediaType(MediaType.APPLICATION_PROTOSTREAM)
                .clustering().cacheMode(CacheMode.DIST_ASYNC).build();

// Create a cache
Cache<String, Greeting> cache = cacheManager.administration()
.withFlags(CacheContainerAdmin.AdminFlag.VOLATILE)
.getOrCreateCache("mycache", config);

// Put a value in the cache
cache.put(id, greeting);

// Read a value from the cache
cache.get(id);

原生支持和未来功能

Quarkus Infinispan 嵌入式扩展支持原生模式,但某些高级功能可能受限。我们鼓励开发者进行测试、分享反馈并帮助我们增强其功能。

在哪里可以了解更多信息

有关详细文档和示例,请查看 Quarkiverse Hub 中的项目:Quarkiverse Infinispan 嵌入式扩展

加入我们

我们欢迎您的反馈和贡献,以改进此扩展。欢迎在项目的 GitHub 存储库中提交 issue、建议功能或贡献代码。感谢您成为 Quarkus 社区的一员。希望您喜欢新的 Infinispan 嵌入式扩展!如果您是 Quarkus 用户或只是感到好奇,请不要犹豫,加入我们友好的社区