假如你读到本文,却从未听说过Redis(这种可能性极小),不妨先理解一下redis.io。稍后再回到此文。
Hydra利用Redis丰富的数据构造实现主要的微做事所须要的功能,比如存在、做事创造、负载均衡、传送和行列步队等功能。
Hydra也很轻巧。实际上,轻巧得足以在售价5美元的Raspberry Pi Zero上运行。

除了轻巧外,Hydra还是构建微做事的最大略方法之一。虽然本文不会先容Hydra,表面已有好多先容它的资源,但会深入先容Hydra如何利用Redis构建轻量级微做事。
先声明一下。首先,本文先容的方法可能不是很适宜你的项目。你可能须要较笨重的微做事。那没紧要。我先容的方法已在Flywheel Sports及其余浩瀚公司得到了证明。我之前写过一篇文章,详细阐述了为什么我们构建Hydra、它在构建全国性直播视频流做事中起到的浸染。
Hydra简介
Hydra是一个NodeJS模块,可以导入到JavaScript Node运用程序,从而为它们授予微做事功能。Hydra通过利用Redis做到这一点。
下面我们看到三个微做事,每个都有连接到Redis的Hydra模块。在此模型中,大多数做事不直接与Redis联系,而是底层的Hydra模块充当Redis的代理。
图1
该图的另一个要点是,Hydra只是另一个导入的模块,就像图中所示的绿色框。Hydra仅在底部以蓝色显示,表明其存在和与Redis的连接。
Hydra模块公开了一个JS类接口,共有36个成员函数。
图2
上图让人大致理解我们所用抽象机制的大略单纯性。findService比sendMessage等成员函数相称大略。
Hydra如何利用Redis?
这张幻灯片显示了许多主要的微做事问题。每个都是主要的微做事所必需的。我们会详细研究Hydra如何利用Redis实现这每项功能。
图3
请记住,此处的目的是表明如何可以实行这项任务,不是说每种方法都要你搞清楚如何在自己的做事中实现该功能。一个范例例子是,虽然可以将微做事配置数据存储在Redis中或利用Redis作为日志记录器,但这并不虞味着你该当这么做。除非你确切知道自己在做什么、由此带来的缺陷,否则别这么做。
其余请记住,你不须要Hydra。Redis使这每一项功能成为可能,你当然可以在自己的运用程序中这么做。
我要表明的另一个要点是,个中一些功能只有结合起来,才有可能实现。比如说,要乞降路由依赖状态、运行状况、做事创造和负载均衡。
如你所知,可以利用各种根本举动步伐工具来知足这每一项功能。然而,Hydra的一大目标是简化微做事的构建,同时只管即便减少对外部根本举动步伐的需求。你在构建生产就绪做事时,要决定须要哪些Hydra功能、可以从其他工具得到哪些功能。这不是非此即彼的选择,而是兼顾你想要实现什么功能、多快可以入手。
话虽如此,看看如何仅利用Redis和你青睐的编程措辞实现所有这些功能还是饶有意见意义。
键空间组织
想理解Hydra如何利用Redis,第一步是剖析它如何组织管理Redis钥空间的利用。
Hydra利用的键由2到4个由冒号字符分隔的段标签组成。段标署名为:Prefix(前缀)、Service name(做事名)、Instance ID(实例ID)和Type(类型)。
图4
Prefix段许可过滤Hydra键与非Hydra键。以是如果你频繁利用Redis,能够过滤特定的键很主要。
Service Name段帮助过滤特定做事类型的键。比如授权、用户或图像处理等做事类型。
Instance ID段许可过滤独特做事实例的键。运行微做事时,你常日须要某个做事类型的多个实例在运行。为每个做事实例分配独特的ID,能够差异它们很有用。
末了还有Type段,用于对键的用场进行分类。并非每个键都有全部的段。比如说,一些键不须要Service Name和Instance ID。
下面这个例子显示了用户做事的键。我们看到前缀是hydra:service,后面随着做事名(这里是“user-svcs”)。接下来,我们看到独特的实例ID。末了,我们看到这个键的类型是存在。以是,我们说存在信息存储在这个键地址中。
图5
前面一个令人困惑的地方是,键由名称组成,2到4个段标签由冒号字符分隔。然而,这里我们看到hydra:service也被冒号字符分隔。其想法是,可能还有其余的hydra:other类型,service只是个中之一。还有另一个涉及传送的不一致,稍后会谈论。我们打算在Hydra 2.0中办理这些问题,那将是打破性的变革,但内部更整洁。
我们可以输入redis-cli并输入Redis命令来查看各种键。我们将会在该演示文稿的别的部分先容这方面的示例。
图6
简要说一下我们将利用的redis-cli示例:你会看到键命令的利用,Hydra内部利用Redis scan命令。
以是回顾一下,Hydra利用键是按段组织的,这使得查询来得更随意马虎。此外,同等的组织使它们更随意马虎扩展和掩护。我们会不才面看到键在组织每个微做事功能中起到的浸染。不妨先从存在提及。
存在
在微做事天下,能够创造做事,并理解做事是否康健、可以路由至关主要。那些功能取决于知道特定做事实例确实存在并可供给用。做事创造、路由和负载均衡等功能也须要这种功能。
每隔一秒,Hydra更新做事键的生存韶光(TTL)。如果在3秒钟内没有更新将导致键到期失落效、主机运用程序被视为不可用。
图7
我们在这里可以看到所用的Redis命令是“get”和“setex”,用于设置键和失落效日期。
我们可以利用带模式匹配的“keys”命令来查询存在键。请把稳有三个键。这见告我们“asset-svcs”的三个实例在运行。
如果我们考试测验检索个中一个键的内容,可以看到它包含实例ID。
而针对该键利用TTL命令可显示,它还有2秒就到期失落效。
图8
以是回顾一下,可以利用自动到期失落效的键来管理微做事存在。Hydra代表主机做事自动更新键。这意味着这不是开拓职员做的事情。未能在3秒内更新键导致做事被视为不可用。这可能意味着做事不康健。
这引出了下一个话题......
康健
能够监控微做事的康健状况是另一项主要功能。Hydra每隔5秒就网络并写入康健信息快照。
你可以查看快照,浏览一下各个做事实例的康健状况。其余,HydraRouter仪表板之类的监控工具可以利用快照。
以是这是康健的键的样子。把稳,唯一的新内容是“type”段,它识别键处于康健状况。
图9
我们查看键的内容时,看到它含有字符串化的JSON工具。在这种情形下,它代表“project-svcs”。
图10
对JSON进行非字符串化可以更随意马虎查看存储的内容。它含有许多有用的信息。
图11
以是,可以存储每个做事实例的康健信息。它利用包含字符串化的JSON文本的字符串键来加以管理。监控运用程序可以利用该信息。
做事创造
接下来不妨考虑做事创造,这是任何微做事架构的另一项必备功能。
能够按名称创造某做事的IP和PORT位置,这大大简化了通信。其他优点包括没必要管理DNS条款或创建固定的路由规则。
做事创造信息存储在类型是“nodes”的Redis Hash中。利用Hash可以实现快速查询。我们利用Redis“hget”、“hset”和“hgetall”等命令来处理节点哈希。
图12
下列Redis操作可用于实现做事创造功能。第一个操作是查询特定的做事类型。第二个操作是查询可用实例。第三个操作让Hydra得以检索关于特定做事实例的信息。
我们可以看到有用的信息,比如做事版本、Instance ID、IP地址和端口,末了还有主机名。在这个示例中,主机名也恰好是Docker Container ID。
图13
我们可以利用Redis“hgetall”命令检索关于所有可用实例的信息。这是Hydra Router检索做事列表以便在仪表板上显示的办法。
图14
回顾一下。Hydra利用servicename键段进行查询,以便创造关于做事的各种信息。做事细节可利用Redis Hash来加以管理,Redis Hash供应了极快的做事创造。
接下来谈论路由。
路由
路由HTTP和(比如Web Socket或PubSub)须要路由得到验证。微做事可以向Redis发布路由。比如说,HydraRouter利用已发布的路由来实现可感知做事的动态路由。
每个做事都在类型“service:routes”的键中发布路由。这里我们看到“asset-svcs”路由的键。
图15
做事路由存储在Set构造中。这很适宜,由于你不须要重复的路由条款。利用SADD命令和SMEMBERS命令。
顺便说一句,Redis丰富的数据构造凑集是我与诸位得以分享的缘故原由之一。
回到路由。我们可以利用键模式来获取路由列表。这里我们看到许多做事的路由。
图16
我们可以利用“smembers”命令来查看特定路由集的内容。顺便说一下,括号内的[get]、[post]和[put]部分代表HTTP REST端点。如果是其他传送技能,可忽略利用括号方法。
回顾一下。每个做事向Redis Set发布其路由。访问单个路由可显示该做事的路由条款凑集。
利用Set数据构造将路由存储在Redis中,这避免了重复路由。已发布的路由可用于实现可感知做事的动态路由。接下来谈论负载均衡。
负载均衡
随着运用程序日益弘大,你须要在可用的做事实例之间对要求进行负载均衡。这通过Redis、利用上述的做事存在和路由功能来实现。在运用程序层面,利用Hydra,这跟利用“makeAPIRequest”或“sendMessage”调用一样大略。负载均衡在那些调用里面进行,由于Hydra利用路由和状态信息来选择可用的目标实例。
一个好处是,在路由期间,如果要求在特定实例上失落效,Hydra能够在终极涌现HTTP 503做事器不可用缺点之前重试其他可用实例。
如你所见,负载均衡依赖其他功能,比如状态、做事创造和路由。
图17
回顾一下,对做事之间的要求进行负载均衡可利用我们见过的存在、做事创造和路由等功能来完成。Redis Strings、Hashes和Sets使这成为可能。整体大于各部分之和。
传送
分布式做事被迫通过底层网络相互联系。HTTP Rest调用可能最常见,但套接字传送可能高效得多。Hydra中的传送利用Redis Pub/Sub频道来完成,Redis通过套接字连接实现Pub/Sub。
这是一个示例键。Hydra利用Redis“subscribe”、“unsubscribe”和“publish”等命令。
图18
其余,Hydra路由工具能够通过HTTP和WebSockets接管,并将它们转换成pub/sub。
想理解这是如何事情的,不妨考虑两个做事:“asset-svcs”和“project-svcs”。每个做事都创建两个键,一个键利用做事名,另一个键利用做事名和实例ID。每个做事都监听两个频道。
图19
在大多数情形下,你不关心做事的哪个实例处理要求。这种情形下,利用的是没有特定实例ID的那个频道。
现在,你须要向特定实例发送时,可以利用有实例ID的那个频道。值得把稳的是,进行负载均衡时,hydra将针对做事名的要求转换成带特定实例ID的要求。这确保只有一个实例处理特定的或要求。
我们可以利用Redis pub / sub channels命令查看频道键列表。把稳,我们这里有四个键。第一个键是“asset-svcs”的名称,由资产做事的所有实例共享。接下来,我们看到其余三个有独特实例ID的键。三个做事实例各一个。
图20
连续关注传送。为了确保微做事之间互操作,统一共同的通信格式至关主要。通用格式是一种基于JSON的文档格式,它包括支持传送、路由和行列步队。这些以JSON字符串化文本的形式存储在Redis中。
这是UMF示例。
图21
“to”、“frm”和“bdy”等字段是必需的,做事可以在“bdy”工具中随意包含各自的自定义字段。
看看这实际上如何利用。
在左边,“client-svcs”向“project-svcs”发送。把稳,这只须要UMF创建调用和发送调用,此处以黄色显示。
在右边,“project-svcs”监听,必要的话处理。这利用事宜监听器来完成。
图22
把稳,Hydra将做事创造、负载均衡、路由和pub/sub细节抽取出来。收发只涉及三个成员函数。这里有必要停息一下。花点韶光考虑利用你最喜好的架构,这个示例将会是什么样子。
更仔细地剖析一下。发送的机理是,解析中的“to”字段,以确定目标做事名。有了做事名,下一步是检讨可用实例。有了目标实例,随后字符串化,并通过Redis“publish”命令发送出去。
图23
我们再次列出Redis中的所有Pub/Sub频道。可以通过这些频道发送,并由监听器检索。以是编写一点代码,我们就可以利用Redis,借助一堆有条不紊的频道来路由。
图24
总之,值得把稳的是,传送终极必不可少,由于做事是物理分布的。Redis利用其pub/sub功能来实现传送。
标准化通信让做事之间能够互操作。我们还看到了将底层的做事创造、负载均衡、路由和pub/sub等细节抽取出来后,运用程序层面的通信是多么随意马虎。
下面谈论行列步队。
行列步队
作业和行列步队是许多主要运用程序的另一个主要部分。Hydra利用Redis为每种做事类型掩护动态行列步队。
然后,做事实例可以读取其行列步队和进程项。
行列步队的内容是UMF,它遵照用于传送的同一种格式。互操作性同样最主要!
Hydra按照做事类型自动创建三个行列步队。
“收到”的行列步队
“处理中”的行列步队
“未完成”的行列步队
由于这些是列表,我们利用Redis“lpush”、“rpush”、“rpoplpush”和“lrem”命令。
该图显示了行列步队之间的流。各项在行列步队之间的移动是Redis中的原子操作。因此,无论你有多少微做事,它都很安全。
图25
在左边的下一个示例中,对进行排队就像创建UMF并调用“queueMessage”来发送一样大略。右下方的代码显示图像处理做事通过调用“getQueuedMessage”使出列,然后处理完毕后调用“markQueueMessage”。这有多随意马虎?
图26
回顾一下,有时,期待立即相应是不现实的。在这种情形下,我们只须要将往后处理的事情排入行列步队。Redis List数据构造可用作行列步队。像“lpush”和“rpoplpush”这些原子操作的命令让这成为可行。这里我们再次看到利用较高等的抽象实现基本的行列步队操作有多随意马虎。
日志
分布式日志是任何微做事架构的另一项主要特性。然而,如果你理解Redis,可能会惊异于将它用作分布式日志记录器的想法。你可能很担心,这很正常。然而,你可以将它用作翱翔记录器。你只存储最严重的缺点,并利用“lpush”和“ltrim”限定条款数量。此后,至少你可以快速检讨微做事出了什么问题。
这是键的样子。把稳键类型是health:log。
图27
这里我们看到health:log键类型实际上是“List”数据构造。因此,我们可以利用Redis“lrange”命令查看“imageproc-svcs”的翱翔记录器日志。
图28
回顾一下:对付微做事而言,数十个乃至数百台机器上有日志是不可行的。分布式日志记录绝对是出路。利用Redis,你可以构建一个轻量级日志记录器,用作翱翔记录器。利用Redis List数据构造以及方便的“lpush”和“ltrim”命令使这成为可能。
末了说说配置管理。
配置管理
管理分布衰落做事的配置文件具有寻衅性。然而,你乃至可以利用Redis来存储做事的配置文件。我们便是这么做的,当时看来彷佛是个好主张。然而,我们开始抛弃这种做法。由于紧张的缺陷是在Redis中存储配置使Redis有状态(stateful),而这不太空想。不过这是可行的,以是我想见告诸位。
不妨看看它如何事情。有一个configs键类型是个哈希值。该哈希值有一个键由做事版本以及针对该版本的配置数据所设的值组成。
图29
这是示例配置。以本文为例,我们利用一个名为“hydra-cli”的命令行工具,它让我们得以将配置文件推送到特定的做事版本。这统统是为了用键创建一个哈希值条款,而这个键由做事名和版本以及作为字符串化值的文件内容组成。记住,你还可以利用shell脚本来驱动redis cli。
我们可以利用“hget”命令和配置版本来提取特定版本。
图30
大略回顾一下,我们看到了Redis如何用于存储运用程序配置文件。Redis Hash数据构造让我们得以为每种做事类型存储配置。每个配置条款都由做事版本标签来索引,内容只是指向字符串化的JSON配置。
总结
不知不觉篇幅写了这么多。但总的来说,我在这里分享的是一种利用JavaScript和NodeJS高度依赖Redis的方法。然而,没有什么能阻挡大家利用其他措辞做同样的事情。