大约一年前,我开始从事一个开源项目,以在 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 将主动删除过期的密钥。
- 命令扩展:允许通过共享对象文件和嵌入式 API 来运行时扩展命令。
由于我们处于开发的早期阶段,功能列表仍在不断扩展。我们为未来准备了一些更酷的功能,包括:
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嵌入式分布式集群的Leader选举,确保只有一个应用程序实例被指定为Leader。
优点:可靠的领导者选举和改进的协调,而无需在应用程序级别自行实现。
结论
EchoVault 是一个雄心勃勃的项目。在这些早期阶段,我们预计必须解决许多问题并添加许多功能。不过,我们欢迎这一挑战,并希望 Go 社区参与到该项目中。
如果这篇文章激发了您的好奇心,或者您有兴趣为这样的项目做出贡献,请查看我们的 GitHub 并给我们一颗星!我们始终欢迎更多反馈和贡献!
以上是EchoVault:Go 中的嵌入式 Redis 替代方案的详细内容。更多信息请关注PHP中文网其他相关文章!