亚马逊AWS官方博客

隆重推出 Valkey GLIDE,一款适用于 Valkey 和 Redis 开源的开源客户端库

我们非常高兴地宣布推出 Valkey General Language Independent Driver for the Enterprise(GLIDE),这是一款遵循宽松许可条款(Apache 2.0 许可证)的开源 Valkey 客户端库。Valkey 是 Berkeley Software Distribution(BSD)旗下的一款遵循宽松许可条款的开源软件,可提供高性能的键值数据存储,支持缓存、会话存储、排行榜和消息队列等多种工作负载。Valkey GLIDE 是 Valkey 的官方客户端库之一,支持所有 Valkey 命令,而 GitHub 存储库属于 valkey.io 项目。GLIDE 支持 Valkey 7.2 和 Redis 开源 6.2、7.0 和 7.2,并将继续支持 Valkey 的未来版本。应用程序程序员可以使用 GLIDE 安全、可靠地将他们的应用程序连接到兼容 Valkey 和 Redis OSS 的服务。Valkey GLIDE 由 Amazon Web Services 设计和配置,整合了通过十多年来运营数十万个客户使用的 Redis OSS 兼容服务而获得的最佳实践。GLIDE 使用特定于语言的封装器作为一个通用核心而实现,在不同的应用程序编程语言之间提供了一致的功能和服务质量。

在这篇文章中,我们将讨论 Valkey GLIDE 的好处。

端到端卓越运营挑战

当在云端和本地环境中运行数据库和缓存工作负载时,客户需要企业级可靠性和无缝的卓越运营,包括专注于客户端库与服务之间的最佳连接和通信。Amazon Web Services 的内存数据库团队拥有 13 年以上的丰富运营经验,为数十万个客户提供了服务,他们发现,很多导致客户中断的运营问题都起源于客户端故障。例如不正确的错误处理、使用错误的重试逻辑管理连接以及不正确的默认配置,这些情况都会引发运营问题或者导致运营问题加剧。此外,一些客户端库没有经过性能优化或者不完全兼容。例如,有些客户端库不支持从副本读取,这可能会严重影响客户端的读取延迟。最后,当使用各种编程语言运行微服务或应用程序时,客户面临着另一个挑战:他们必须使用具有不同行为的其他客户端库。他们需要分别为每个客户端库开发和维护自定义代码和配置。

推出 Valkey GLIDE

借助 Valkey GLIDE,开发人员可以构建基于 Valkey 和 Redis OSS 并具有弹性的应用程序,并提供一致的客户体验,从而降低有影响力的运营事件的发生频率以及简化事件发生时的补救措施。Valkey GLIDE 由 Amazon Web Services 提供赞助和支持。GLIDE 支持 Valkey 和 Redis OSS 的所有命令,专为提高可靠性而设计,并根据最佳运营实践进行了预配置。例如,它可以利用经过优化的 DNS 配置和连接处理逻辑,轻松处理节点故障、集群拓扑变化和连接重建。

为了帮助实现开发和运营的一致性,Valkey GLIDE 由一个以 Rust 语言编写的核心驱动程序框架来实现,并为支持的编程语言提供了扩展。这一设计缩短了多种语言的新功能的上市时间。在此版本中,GLIDE 适用于 Java 和 Python,将来还会支持更多的编程语言。有关支持的语言版本和先决条件的详细信息,请访问 GitHub 存储库

Valkey GLIDE 客户端库设计

Valkey GLIDE 使用由 Rust 语言编码的核心引擎而构建,并以特定于语言的绑定(称为封装器)和连接所有这些绑定的通信层作为补充。GLIDE 的 Rust 核心基于领先的 Rust Redis OSS 客户端库 redis-rs。我们之所以选择 Rust,是因为它具有内置的内存安全功能和高性能功能。下图显示了概要设计。

Rust 核心负责与 Valkey 或 Redis OSS 通信,涵盖了连接处理、拓扑调整、错误管理、RESP 协议解析和消息封装等方面。语言封装器采用轻量化设计,可用作内核的特定于语言的接口。通信层以无缝方式在核心与封装器之间传输请求和响应。这一设计为各种编程语言提供了统一的接口和一致的客户端行为。如果您将以多种语言编写的应用程序连接到 Valkey 或 Redis OSS,这种设计会非常重要,而且开发人员可以获得相同的客户端体验。

功能亮点

Valkey GLIDE 兼容并支持 Valkey 和 Redis OSS 的所有命令。GLIDE 支持按照最佳实践和行业标准实现的高级功能。下面是一些示例:

  • 利用集群拓扑变化发现功能提高可用性 – Valkey 集群拓扑可能会随着时间的推移而变化。可以添加或移除新的节点,拥有特定插槽的主节点可能会发生变化。每当 Valkey 表明插槽所有权发生变化时,Valkey GLIDE 都会使用最佳实践自动重新发现集群拓扑。GLIDE 使用“多数裁定原则”算法,通过查询多个节点来确定新的集群拓扑、避免 CLUSTER 命令风暴(可能会导致延迟增大)、缩短潜在的停机时间,并避免“裂脑”网络错误。此外,GLIDE 还会执行定期检查,以主动识别拓扑变化。这些功能可确保 GLIDE 与集群拓扑保持同步。
  • 从副本读取以减小延迟 – 通过从数据库中的副本进行读取,可以提高读取性能、可扩展性和可用性,并减轻从主实例进行读取的工作负载。默认情况下,Valkey GLIDE 将读取命令定向到拥有特定插槽的主节点,以避免读取可能过时的数据,对于大多数客户端库,这种做法是一致的。对于优先读取吞吐量并能够容忍最终一致性的应用程序,GLIDE 提供了用来将读取路由到副本节点的选项。GLIDE 支持以下从副本进行读取的设置,因此您可以选择适合您特定使用案例的设置:
    • PRIMARY(默认)– 始终从主节点读取,以获得最新的数据。
    • PREFER_REPLICA – 以循环方式在所有副本之间传播请求。如果没有任何可用的副本,会将请求路由到主节点。
  • 通过有状态的连接自动重新订阅发布/订阅 – Valkey GLIDE 中的发布/订阅频道是有状态的。当断开连接或者发生拓扑更新(例如纵向缩减或横向扩展)时,GLIDE 会自动重新订阅指向新节点的连接。这种做法的优点是,应用程序代码得到简化,而且在重新连接期间不必重新订阅新节点。

除了这些功能外,GLIDE 还支持 Lua 脚本、异步 API、事务支持和连接处理最佳实践,例如超时和指数回退。Valkey GLIDE 支持所有 OSS 命令。

开始使用

Valkey GLIDE 适用于 Java 和 Python,并可以通过标准程序包管理程序进行下载。

对于 Python,请使用如下代码和 pip 来安装 GLIDE:

$ pip install valkey-glide

为了帮助您开始使用,如下代码演示了如何将 GLIDE 集成到您的 Python 应用程序中:

import asyncio
from glide import GlideClusterClient, GlideClusterClientConfiguration, NodeAddress
async def main():
    addresses = [NodeAddress("127.0.0.1", 6379)]
    config = GlideClusterClientConfiguration(addresses=addresses)
    client = await GlideClusterClient.create(config)
    await client.set("test_key", "Hello, Valkey GLIDE!")
    value = await client.get("test_key")
    print(value) # Output: "Hello, Valkey GLIDE!"
asyncio.run(main())

对于 Java,要使用 maven 安装 Valkey GLIDE,请按照 GitHub 存储库中介绍的步骤进行操作。

以下是 Java 中的相同代码示例:

/** Copyright Valkey GLIDE Project Contributors - SPDX Identifier: Apache-2.0 */
package glide.examples;

import glide.api.GlideClusterClient;
import glide.api.models.configuration.GlideClusterClientConfiguration;
import glide.api.models.configuration.NodeAddress;
import java.util.concurrent.ExecutionException;

public class ExamplesApp {
    // 主应用程序入口点
    public static void main(String[] args) {
        String host = "127.0.0.1";
        Integer port = 6379;
        GlideClusterClientConfiguration config =
                GlideClusterClientConfiguration.builder()
                        .address(NodeAddress.builder().host(host).port(port).build()).build();
        try {
            GlideClusterClient client = GlideClusterClient.createClient(config).get();
            client.set("test_key", "Hello, Valkey GLIDE!").get();
            var value = client.get("test_key").get();
            System.out.println(value);
        } catch (ExecutionException | InterruptedException e) {
            System.out.println("GLIDE example failed with an exception: ");
            e.printStackTrace();
        }
    }
}

结论

当在云端和本地环境中运行数据库和缓存工作负载时,客户需要企业级可靠性和卓越运营。Valkey GLIDE 可以提供客户体验,以实现这些目标。它由 Amazon Web Services 提供支持,并根据最佳实践进行了预配置。在此版本中,GLIDE 适用于 Java 和 Python,还支持目前仍在开发中的其他语言。Valkey GLIDE 是开源的,并遵循宽松许可条款(Apache 2.0 许可证),可以与任何支持 6.2、7.0 和 7.2 版本的 Valkey 或 Redis OSS 兼容发行版结合使用,包括 Amazon ElastiCacheAmazon MemoryDB。您可以从主要的开源程序包管理程序下载 Valkey GLIDE,以开始使用。了解有关它的更多信息,并在 Valkey GLIDE GitHub 存储库中投稿。

本篇作者

Asaf Porat Stoler

亚马逊云科技内存数据库团队软件开发经理。Asaf 在存储系统、数据缩减和内存数据库方面积累了 20 多年的丰富经验。目前,他专注于 Amazon ElastiCache 性能和 Valkey GLIDE。工作之余,他喜欢运动、徒步旅行、陪伴家人。

Mickey Hoter

亚马逊云科技内存数据库团队的首席产品经理。Mickey 在构建软件产品方面拥有 20 多年的丰富经验,曾经担任开发人员、团队负责人、小组管理员和产品经理。在加入 Amazon Web Services 之前,Mickey 曾经就职于 SAP 和 Informatica 等大型公司以及 Zend 和 ClickTale 等初创企业。工作之余,他的大部分时间都是在大自然中度过的,他的很多爱好也都与大自然有关。