一种使用 Redis 深度驱动的,为构建轻量级分布式应用程序(Microservices)的工程方案(一)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 一种使用 Redis 深度驱动的,为构建轻量级分布式应用程序(Microservices)的工程方案(一)

Hydra 是一个轻量级的 NodeJS 库,用于构建分布式计算应用程序,比如微服务。我们对轻量级的定义是:轻处理外部复杂性和基础设施依赖 —— 而不是有限的轻处理。 Hydra 声称对基础设施的依赖很轻,这是因为它唯一的外部依赖是 Redis

Hydra 利用 Redis 丰富的数据结构来实现重要的微服务所需的功能。如 presence(在线状态)、service discovery (服务发现)、load balancing (负载平衡)、messaging(消息传递)、queuing(队列)等。


Hydra 到底是什么?


Hydra 是一个 NodeJS 模块,可以将其导入到 JavaScript Node 应用程序中,以使其具有微服务功能。Hydra 通过利用 Redis 做到这一点。


在这里,我们看到三个微服务 - 每个微服务都带有一个连接到 Redis 的 Hydra 模块。在这种模式下,大多数服务不会直接与 Redis 通信。而是底层的 Hydra 模块代理 Redis。


微信图片_20220610212435.png

关于此图的另一点是,Hydra 只是另一个导入的模块 - 如绿色所示。Hydra 在底部仅以蓝色显示,以说明其存在和与 Redis 的关系。

Hydra 模块公开一个 JS 类接口,该接口共有36个成员函数。


微信图片_20220610212446.png

该快照提供了简化抽象的感觉。成员函数(例如 findServicesendMessage)非常简单。


Hydra 如何利用 Redis



这张幻灯片显示了许多重要的微服务问题。每个都是 non-trivial(非平凡的) 微服务所必需的。我们将详细研究 Hydra 如何使用 Redis 来实现所有这些功能。

微信图片_20220610212503.png


请记住,这里的目标是展示如何做到这一点 —— 而不是说每种方法都是您应该如何在自己的服务中实现该特性。一个恰当的例子是,虽然你可以在 Redis 中存储你的微服务配置数据,或者使用 Redis 作为一个 logger —— 但这并不意味着你应该这样做。至少,除非你确切地知道你在做什么,以及需要做哪些权衡。


另外,请记住,您也许不需要Hydra。这些功能都是由 Redis 实现的,您当然可以在自己的应用程序中做到这一点。(如:Golang 来一版)

我将向您展示的一个关键点是,其中一些特性只有在组合时才能实现。例如,请求(request)和消息路由(message routing)依赖于状态(presence)、运行状况(health)、服务发现(service discovery)和负载平衡(load balancing)。


如您所知,这些特性中的每一个都可以使用各种基础设施工具来解决。然而,Hydra 的一个关键目标是简化构建微服务,同时最小化外部基础设施需求。在构建可用于生产的服务时,您需要决定需要哪些 Hydra 特性,以及哪些特性将从其他工具获得。这不是一个非此即彼的命题,而是一个你想要达到的目标和你能多快开始的问题。


就是说,很有趣的是,仅使用 Redis 和您喜欢的编程语言就可以实现所有这些功能。


Key 空间组织



了解 Hydra 如何利用 Redis 的第一步是查看它如何组织对 Redis key 空间的使用。

Hydra 使用的键 —— 由 24 段标签组成,标签之间用冒号分隔。段标签被命名为:前缀(Prefix)、服务名称(Service name)、实例 ID(Instance ID)和类型(type)。


微信图片_20220610212526.png


前缀段允许过滤 Hydra key 和非 Hydra key。因此,如果你大量使用 Redis,那么能够过滤特定的 key 是至关重要的。


服务名称段帮助过滤特定服务类型的 key。例如授权(authorization)、用户(user)或图像处理(image processing)服务类型。

实例ID(Instance ID)段允许过滤唯一服务实例的 key。运行微服务时,通常需要运行一个服务类型的多个实例。每个服务实例都分配有唯一的 ID,并且能够区分它们是有用的。


最后,还有“类型(Type)”部分,用于对 key 的用途进行分类。并非每个 key 中都存在所有段。例如,某些 key 中不需要服务名称(Service name)和实例ID(instance ID)。


这是用户服务(user service) key 的示例。我们看到前缀 hydra:service 后跟服务名称,在本例中为 “user-svcs”。接下来,我们看到唯一的实例ID(unique instance ID)。最后,我们看到此 key 的类型为 presence(presence)。因此,我们说 presence 信息存储(presence information)在此 key 地址中。


微信图片_20220610212541.png

在前面的描述中,一个令人困惑的地方是,key 由名称组成,名称中有24个段标签,用冒号分隔。然而,在这里我们看到 hydra:service 也用冒号分隔。当时的想法是,可能还有另一种 hydra:other 类型,service 只是其中之一。关于消息传递还有另一个不一致的地方,稍后我们将对此进行讨论。

我们可以输入 redis-cli 和输入 Redis 命令来查看各种键。在接下来的演示中我们会看到一些例子。


微信图片_20220610212554.png

image.gif

一个关于我们将使用的 redis-cli 示例的快速说明:你将看到 keys 命令的使用 —— 这是为了方便 —— Hydra 内部使用 Redis scan 命令。


所以重述一下 —— Hydra 使用的 key 是按段组织的,这使它们更容易查询。此外,一致的组织使它们更容易扩展和维护。随着我们继续,我们将看到 key 在每个微服务特性的组织中所扮演的角色。让我们从检查 presence(examining presence)开始。


Presence(呈现 type)



在微服务领域中,发现服务、了解服务是否正常以及是否可以路由到该服务的能力至关重要。这些特性依赖于知道某个特定的服务实例确实存在并可供使用。对于服务发现(service discovery)、路由(routing)和负载平衡(load balancing)等特性,这也是必需的。


每隔一秒钟,Hydra 就会更新它的服务 key 的生存时间(TTL)。在三秒钟的时间内这样做失败将导致 key 过期,主机应用程序被视为不可用。


微信图片_20220610212624.png

image.gif

在这里我们可以看到使用的 Redis 命令是 “get”“setex”,它们设置了一个 key 和一个到期时间。


我们可以使用带有模式匹配项的 “keys” 命令来查询 presence key。注意,存在三个 key。这告诉我们存在 “ asset-svcs” 运行的三个实例。


如果我们尝试检索其中一个 key 的内容,我们会看到它包含实例ID(instance ID)。

并对键使用 TTL 命令可以向我们显示,它还有 2 秒钟的剩余时间。


微信图片_20220610212646.png

image.gif

所以回顾一下。可以使用自动过期的 key 来管理微服务的存在。Hydra 代表主机服务自动更新密钥。这意味着这不是开发人员做的事情。在3秒内更新 key 失败将导致服务被视为不可用。这可能意味着服务不健康。

这将我们带入下一个主题…


Health(健康 type)



能够监视微服务的运行状况是另一个重要功能。Hydra 每 5 秒钟收集并写入一个健康信息快照。


您可以检查快照以快速查看单个服务实例的运行状况。并且,快照可以由监控工具(例如 HydraRouter 仪表板)使用。


这就是健康 key 的样子。请注意,唯一的新位是标识 key 为关于 health“type” 段。


微信图片_20220610212704.png

image.gif

当我们查看密钥的内容时,我们看到它包含一个字符串化的 JSON 对象。在这种情况下,它用于 “project-svcs”


微信图片_20220610212717.png

image.gif

JSON 解串可以更容易地查看存储的内容。它包含了很多有用的信息。


微信图片_20220610212741.png

image.gif

因此,可以按服务实例存储运行状况(health)信息。使用包含字符串化的JSON文本的字符串 key 进行管理。而且这些信息可以通过监视应用程序来使用。

相关文章
|
2月前
|
存储 Kubernetes 微服务
Dapr:用于构建分布式应用程序的便携式事件驱动运行时
Dapr 是一个可移植、事件驱动的运行时,简化了分布式应用程序的开发。它支持多语言、多框架,适用于云和边缘计算环境,提供服务调用、状态管理、消息发布/订阅等构建模块。通过 sidecar 模式,Dapr 帮助开发者轻松应对微服务架构的复杂性,实现弹性、可扩展的应用部署。
227 9
Dapr:用于构建分布式应用程序的便携式事件驱动运行时
|
3月前
|
存储 负载均衡 NoSQL
【赵渝强老师】Redis Cluster分布式集群
Redis Cluster是Redis的分布式存储解决方案,通过哈希槽(slot)实现数据分片,支持水平扩展,具备高可用性和负载均衡能力,适用于大规模数据场景。
317 2
|
3月前
|
存储 缓存 NoSQL
【📕分布式锁通关指南 12】源码剖析redisson如何利用Redis数据结构实现Semaphore和CountDownLatch
本文解析 Redisson 如何通过 Redis 实现分布式信号量(RSemaphore)与倒数闩(RCountDownLatch),利用 Lua 脚本与原子操作保障分布式环境下的同步控制,帮助开发者更好地理解其原理与应用。
253 6
|
2月前
|
消息中间件 缓存 NoSQL
Redis各类数据结构详细介绍及其在Go语言Gin框架下实践应用
这只是利用Go语言和Gin框架与Redis交互最基础部分展示;根据具体业务需求可能需要更复杂查询、事务处理或订阅发布功能实现更多高级特性应用场景。
275 86
|
4月前
|
存储 缓存 NoSQL
Redis核心数据结构与分布式锁实现详解
Redis 是高性能键值数据库,支持多种数据结构,如字符串、列表、集合、哈希、有序集合等,广泛用于缓存、消息队列和实时数据处理。本文详解其核心数据结构及分布式锁实现,帮助开发者提升系统性能与并发控制能力。
|
2月前
|
存储 监控 NoSQL
Redis高可用架构全解析:从主从复制到集群方案
Redis高可用确保服务持续稳定,避免单点故障导致数据丢失或业务中断。通过主从复制实现数据冗余,哨兵模式支持自动故障转移,Cluster集群则提供分布式数据分片与水平扩展,三者层层递进,保障读写分离、容灾切换与大规模数据存储,构建高性能、高可靠的Redis架构体系。
|
2月前
|
NoSQL Java 调度
分布式锁与分布式锁使用 Redis 和 Spring Boot 进行调度锁(不带 ShedLock)
分布式锁是分布式系统中用于同步多节点访问共享资源的机制,防止并发操作带来的冲突。本文介绍了基于Spring Boot和Redis实现分布式锁的技术方案,涵盖锁的获取与释放、Redis配置、服务调度及多实例运行等内容,通过Docker Compose搭建环境,验证了锁的有效性与互斥特性。
206 0
分布式锁与分布式锁使用 Redis 和 Spring Boot 进行调度锁(不带 ShedLock)
|
2月前
|
缓存 NoSQL 关系型数据库
Redis缓存和分布式锁
Redis 是一种高性能的键值存储系统,广泛用于缓存、消息队列和内存数据库。其典型应用包括缓解关系型数据库压力,通过缓存热点数据提高查询效率,支持高并发访问。此外,Redis 还可用于实现分布式锁,解决分布式系统中的资源竞争问题。文章还探讨了缓存的更新策略、缓存穿透与雪崩的解决方案,以及 Redlock 算法等关键技术。
|
2月前
|
存储 缓存 监控
Redis分区的核心原理与应用实践
Redis分区通过将数据分散存储于多个节点,提升系统处理高并发与大规模数据的能力。本文详解分区原理、策略及应用实践,涵盖哈希、范围、一致性哈希等分片方式,分析其适用场景与性能优势,并探讨电商秒杀、物联网等典型用例,为构建高性能、可扩展的Redis集群提供参考。
163 0
|
3月前
|
监控 NoSQL 关系型数据库
保障Redis与MySQL数据一致性的强化方案
在设计时,需要充分考虑到业务场景和系统复杂度,避免为了追求一致性而过度牺牲系统性能。保持简洁但有效的策略往往比采取过于复杂的方案更加实际。同时,各种方案都需要在实际业务场景中经过慎重评估和充分测试才可以投入生产环境。
227 0

热门文章

最新文章

下一篇
oss云网关配置