发布于 2026-01-06 1 阅读
0

EchoVault:用 Go 语言编写的可嵌入式 Redis 替代方案。

EchoVault:用 Go 语言编写的可嵌入式 Redis 替代方案。

大约一年前,我开始着手一个开源项目,旨在用 Go 语言构建一个可嵌入的 Redis 替代方案。那时我便开始开发 EchoVault 项目。自那时起,该项目引起了一些关注,甚至还有一些贡献者。

本文介绍了EchoVault,包括其功能、用例以及开发背后的动机。

EchoVault是什么?

EchoVault 是一个可嵌入的内存数据存储,专为 Go 应用程序量身定制。它提供了一个基于 TCP 的 RESP 兼容接口,同时又具有直接嵌入应用程序的灵活性。

通过这种方式,EchoVault 旨在某些用例中取代传统的内存数据存储(如 Redis),提供类似的功能,并增强与 Go 的集成。

EchoVault 的创建缘由

我最初创建 EchoVault 的动机是:

  • 嵌入式灵活性:传统的内存数据存储(例如 Redis)是外部服务,需要单独管理和部署。EchoVault 允许开发人员将数据存储直接嵌入到应用程序中,从而简化部署流程,消除了这种额外开销。
  • Go 生态系统集成:EchoVault 主要面向 Go 语言设计,确保与 Go 应用无缝集成并实现最佳性能。同时,它也通过 TCP 协议保持 RESP 兼容性,因此也兼容现有的 Redis 客户端,例如 redis-cli 和 Jedis。
  • Redis 许可变更:EchoVault 是开源软件(采用 Apache 2.0 许可)。我们致力于保持这种完全开源的模式,而不是开放核心模式。

EchoVault提供的功能

EchoVault 拥有众多功能,使其成为内存数据存储的强大选择:

  • 支持 TLS 和 mTLS:支持多个服务器和客户端根证书颁发机构 (RootCA),实现安全通信。支持复制集群:采用 RAFT 算法进行复制和集群。
  • 访问控制层:提供用户身份验证和授权,以保护数据访问安全。
  • 分布式发布/订阅功能:支持对实时数据处理的频道和模式进行发布/订阅。
  • 数据结构:我们支持多种数据结构,包括集合、有序集合、哈希表、列表等等。我们将持续添加更多的数据结构及其相关命令。
  • 持久层:该层通过快照和仅追加文件持久化来确保数据持久性。AOF 文件与 RESP 兼容,但尚未完全兼容 Redis。
  • 密钥淘汰策略:EchoVault 实施多种密钥淘汰策略以管理内存使用情况。EchoVault 提供被动和主动两种密钥淘汰机制。被动淘汰机制下,过期密钥不会被淘汰,直到下次访问时才会被淘汰。主动淘汰机制下,EchoVault 会主动删除过期密钥。
  • 命令扩展:允许通过共享对象文件和嵌入式 API 在运行时扩展命令。

由于我们仍处于开发初期,功能列表仍在不断扩展。我们计划在未来推出更多令人兴奋的功能,包括:

  • 流。
  • 使用 Lua 模块的扩展。
  • 分片。

EchoVault 的架构

EchoVault 支持独立部署和集群部署。

独立模式

在独立模式下,EchoVault 运行一个独立的实例。这是运行 EchoVault 最简单的方式。您可以从嵌入式库运行独立实例,也可以将其作为接受 TCP 连接的独立进程启动。
嵌入式实例也可以接受 TCP 连接,从而允许您通过 TCP 客户端与 Go 进程通信。

RAFT 复制集群模式

对于需要强一致性和容错性的应用,EchoVault 支持基于 RAFT 的复制集群模式。

RAFT 是一种共识算法,可确保分布式系统中的数据一致性。在此模式下,多个 EchoVault 实例可以组成一个集群,提供数据复制功能,并确保即使节点发生故障,数据也能保持一致。

RAFT集群模式的主要特点:

  • 容错性:即使集群中的某些节点发生故障,也能确保数据可用性。
  • 一致性:保证集群中所有节点的数据相同。
  • 可扩展性:允许通过向集群添加更多节点进行水平扩展。

即使在嵌入式模式下,您也可以运行 EchoVault 集群。这意味着您的应用程序实例可以通过 EchoVault 层相互通信,而无需部署第三方服务。这对于跨应用程序实例集群进行会话管理等用例非常理想。

EchoVault 的使用案例

EchoVault 的多功能性使其适用于各种应用场景。以下是一些潜在的应用案例:

  • 内存缓存场景:某电商网站需要缓存产品详情和用户会话信息以提升性能。解决方案:使用 EchoVault 缓存频繁访问的数据,加快响应速度。优势:页面加载速度更快、用户体验更佳、数据库负载更低。
  • 服务发现场景:微服务架构需要动态服务发现机制来实现服务间的通信。解决方案:将服务端点存储在 EchoVault 中,使服务能够高效地相互发现和通信。优势:简化服务发现,提升通信效率。
  • 会话管理场景:分布式 Web 应用程序需要跨多个实例管理用户会话。解决方案:使用 EchoVault 嵌入式集群存储会话数据,确保所有应用程序实例的一致性和可访问性。优势:无需部署 Redis 等辅助服务,即可在应用程序集群中实现一致的会话管理。
  • 实时分析场景:金融交易平台需要对交易数据进行实时分析和监控。解决方案:利用 EchoVault 的有序数据集和发布/订阅功能,将实时交易数据存储和处理,从而实现跟踪和分析。优势:实时数据处理和更快的分析速度。
  • 分布式任务队列场景:后端系统需要管理任务并将其分发到多个工作节点。解决方案:使用 EchoVault 的列表数据结构实现任务队列,任务被推送到列表中,工作节点从列表中弹出任务进行处理。优势:高效的任务分发和良好的可扩展性。
  • 功能标志和配置管理场景:SaaS 应用需要动态启用或禁用功能并管理配置设置,而无需重新部署应用。解决方案:将功能标志和配置设置存储在 EchoVault 中。优势:动态配置管理,减少停机时间。
  • 速率限制和限流场景:API 网关需要强制执行速率限制和请求限流,以防止滥用并确保公平使用。解决方案:利用 EchoVault 的内存功能实现速率限制,实时跟踪请求计数并强制执行限制。优势:有效的速率限制和更高的 API 可靠性。
  • 领导者选举场景:一组分布式服务需要选举一个领导者来协调任务。解决方案:利用 EchoVault 内置的分布式集群领导者选举机制,确保只有一个应用程序实例被指定为领导者。优势:无需在应用程序层自行实现,即可实现可靠的领导者选举并提升协调效率。

结论

EchoVault 是一个雄心勃勃的项目。在早期阶段,我们预计会有许多问题需要解决,许多功能需要添加。然而,我们乐于接受这些挑战,并非常希望 Go 社区能够参与到这个项目中来。

如果这篇文章引起了您的好奇心,或者您有兴趣参与类似的项目,请访问我们的 GitHub 仓库并给我们点个赞!我们始终欢迎您的反馈和贡献!

文章来源:https://dev.to/kelvinvmwinuka/echoVault-embeddable-redis-alternative-in-go-16a6