6月22号项目报告---节点注册和监控

节点监控主要是通过Redis来完成的(如下图)。

工作节点会不断更新心跳信息在Redis上,利用HSET nodes <node_id> ,心跳信息 包含节点MAC地址,IP地址,当前时间戳。
主节点会周期性获取Redis上的工作节点心跳信息。如果有工作节点的时间戳在60秒之前,则考虑该节点为离线状态,会在Redis中删除该节点的信息,并在MongoDB中设置为"离线";如果时间戳在过去60秒之内,则保留该节点信息,在MongoDB中设置为"在线"。
该架构的优点
这样,就做到了一个监控节点是否在线的节点注册系统。这样架构的好处在于,节点之间根本不用像HTTP、RPC那样IP或端口,只需要知道Redis的地址就可以完成节点注册和监控。因此,也就减少了用户配置节点的操作,简化了使用流程。同时,由于隐藏了IP地址和端口,也更为安全

节点通信
如果仔细看上面的整体架构图的话,你可能会注意到CrawUnit中通信有两种。一种是同步信息(Sync via Msg),另一种是派发任务(Assign Tasks)。这两种通信分别叫即时通信和延迟通信。下面分别介绍。
即时通信
即时通信是指某节点A通过某种媒介向另一节点B发送信息,取决于是否为双向通信,节点B收到信息后可能会通过同一种媒介将信息回复给节点A。
CrawUnit的即时通信是通过Redis的PubSub来实现的(如下图)。

所谓PubSub,简单来说是一个发布订阅模式。订阅者(Subscriber)会在Redis上订阅(Subscribe)一个通道,其他任何一个节点都可以作为发布者(Publisher)在该通道上发布(Publish)消息。
在CrawUnit中,主节点会订阅nodes:master通道,其他节点如果需要向主节点发送消息,只需要向nodes:master发布消息就可以了。同理,各工作节点会各自订阅一个属于自己的通道nodes:<node_id>(node_id是MongoDB里的节点ID,是MongoDB ObjectId),如果需要给工作节点发送消息,只需要发布消息到该通道就可以了。
一个网络请求的简单过程如下:

客户端(前端应用)发送请求给主节点(API);
主节点通过Redis PubSub的<nodes:<node_id>通道发布消息给相应的工作节点;
工作节点收到消息之后,执行一些操作,并将相应的消息通过nodes:master通道发布给主节点;
主节点收到消息之后,将消息返回给客户端。

CrawUnit的获取日志、获取系统信息、取消任务、告知节点获取爬虫文件都是通过即时通信完成的。

猜你喜欢

转载自www.cnblogs.com/godlovesme/p/13179425.html
今日推荐