分发层

总体概览

分发层 - 图1

分发层主要用来解决以下问题:

  • 有哪些节点?

  • 数据在哪?

  • 这些节点还在线吗?

  • 如何实现跨节点调度/运算?

分发层 - 图2

DistSender

分发层 - 图3

​ DistSender 处理网关节点与range所在节点之间的通信。它接收BatchRequests,查看批处理中的请求,找出每个命令需要到达的range,将请求路由到负责该range的节点/调度器然后收集并重新组合结果。

  1. 将提供的批处理发送到指定的范围的所有ranges并在可能的情况下串行或并行发送。

  2. 当前未完成的并发异步请求数量没有超限,异步发送部分批处理。返回是否发送了部分批 处理。

  3. 将提供的批处理发送到指定的range。 批处理请求会被截断,以便每个请求的键都限制在 range的键范围内。

  4. 收集并重新排列副本,并进行RPC调用。

  5. 将一个或多个RPC发送到所有副本调度器。

  6. 将一个或多个RPC发送到range分片所在的客户端。

Gossip

分发层 - 图4

Gossip是一种通信协议,用于广播消息

优势:

• 可扩展性:每个节点仅发送固定数量额消 息,如果确认消息未达到,则不采取任何恢 复操作。从而实现百万级的扩展。

• 容错:具有在不规则和未知连接性的网络中 运行的能力。信息可以通过多种途径从信息 源流向目的地

• 健壮:所有节点全对等,发生故障的节点不 会阻止其他节点继续发消息

• 收敛一致性:Gossip实现了消息指数级的快 速传播,消息发出后,会指数级快速收敛到 全局一致的状态

问题:

• 消息可以多次到达节点。Gossip协议速度很慢,并且其大量带宽被冗余信息占用

• 延迟 在事件传播中,事件实际上并不会触发交换,而是由Gossip定期进行广播。

• 随机性 Gossip协议固有的随机性使重现和调试运行时出现的意外问题变得困难。

• 消息限制 Gossip协议在大规模下无法很好地扩展,事件的稳定增长会耗尽Gossip 信息通道的承载能力。消息饱和取决于许多因素:事件进入系统的速率, 事件大小,Gossip扇出和消息大小 可以发送新消息的平均速率大约是驻留时间的倒数:1 / log(n)

原理:

​ 一个节点希望与网络中的其他节点共享一些信息。然后,它会 周期性地从子节点集中随机选择 N 个节点并交换信息。接收信息的节点执行完全相同的操作。

RPC

分发层 - 图5

Context:

​ go.context在Go程序中用于处理协程间的上下文,可以用来取消任务或者定义超时,也可以用来进行值的传递 Context是Grpc创建连接,接受调用的必要参数,定义了各节点间心跳、时钟检测、通 信压缩的相关逻辑

gRPC:

​ gRPC是一种由Google发布的rpc协议,rpc客户端可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法。

gRPC以高性能、设置简单、与语言无关的特性,受到众多开源项目与商业项目的青睐。在Go语言中,gRPC是基于HTTP/2实现的,其底层协议是TCP

http/2:

HTTP/2由HTTP/1.1演进而来,可以更快地传递消息并改善体验

• 采用二进制协议时带宽消耗占用更小

• 复用连接使得一个连接可以发起多个请求,解决了行头阻塞问题

• 压缩了头部降低了TCP慢启动的开销 • 增强了安全性