后浪笔记一零二四

NATS Gateway的设计目的是解决跨地域集群连接中的两个核心问题:减少跨集群连接数量和优化跨地域数据传输。

与集群内部使用的-route参数(通常使用4222端口)不同,跨集群连接使用专门的-gateway参数。

各集群保持内部状态一致性,Gateway只负责同步subject和订阅信息,不参与集群内部协议。

每个集群必须至少有一个节点配置gateway,才能建立多集群同步网络。

NATS提供了三种网络拓扑机制,适用于不同场景:

组件 用途 连接对象 状态共享 典型场景
Cluster 同一集群内节点连接 集群内节点 完全共享 单数据中心扩展
LeafNode 边缘设备连接到中心集群 边缘节点到中心集群 不共享 IoT、边缘计算
Gateway 不同集群之间的连接 跨集群节点 选择性同步 多数据中心、全球部署

vpc互联:

  • 腾讯云:云联网
  • 阿里云:对等网络
  • 云服务器一般有内网ip和外网ip,vpc互联的作用就是让两个跨地域机房,比如上海和北京,可以直接通过内网ip通信。

nats启用gateway模式时,advertised地址和gateway地址需要保持一致,否则会出问题。

gateway {
    name: "A"
    listen: "localhost:7222"
    authorization {
        user: gwu
        password: gwp
    }

    gateways: [
        {name: "A", url: "nats://gwu:gwp@localhost:7222"},
        {name: "B", url: "nats://gwu:gwp@localhost:7333"},
        {name: "C", url: "nats://gwu:gwp@localhost:7444"},
    ]
}

nats客户端多集群管理

使用了类似kubectl config context的概念。

列出所有的context: nats context ls

添加context: nats context save shanghai –server ip和端口 –creds 认证文件路径

切换集群:nats context select shanghai

地理感知队列订阅(Geo Aware Queue Subscribes)

仅限queue队列订阅模式

同一消息队列,如果我客户端往北京的集群发的时候,系统如果在北京的集群有订阅这个队列的客户端,那么他的所有消息都会发送到北京这个客户端。

我上海的客户端推的消息,如果在我上海的集群里有订阅的客户端的话,那我所有消息也会推到上海这个消费端来消费。

但是如果出现异常,比如说我北京的这个订阅的这个客户端失效了,那么他就会把这个消息路由到上海的这个客户端来进行消费。

这个就是所谓的这个地理位置感知的能力。

集群原理

在单个集群内,nats的消息,节点和节点之间,它是怎么处理的。

  • 我们把nats集群部署好之后,我们看到nats各个节点,每个节点和节点之间,它都建立了一个router的这个连接
  • 就是相当于如果我有4个节点,那么他会建立6个连接,保证节点和节点之间,都是能够直接互通的。
  • 我的客户端连接到任何一个节点上,之后如果我推消息,那消息到了这个节点之后,会通过router路由到和他相邻的所有节点。
  • 那如果在对应节点上,有订阅的客户端的话,他会推到客户端去。如果没有订阅客户端,他就直接丢弃了。

使用命令行建立三节点集群,注意这里B和C节点,只配了一个route连接,生产环境建议将除了自己之外的其他节点都配上:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# A节点
$ nats-server -p 4222 -cluster nats://localhost:4248 --cluster_name test-cluster -D

# B节点
$ nats-server -p 5222 -cluster nats://localhost:5248 -routes nats://localhost:4248 --cluster_name test-cluster -D

# C节点
$ nats-server -p 6222 -cluster nats://localhost:6248 -routes nats://localhost:4248 --cluster_name test-cluster -D

# 订阅节点C
$ nats sub hello -s nats://localhost:6222

# 往节点A推消息
$ nats pub hello world -s nats://localhost:4222

# 使用tcpdump抓取节点A的route端口4248的数据包
# 从抓包信息,可以发现节点A有将消息路由到其他节点的信息。
$ tcpdump -i lo -A -s 0 'tcp port 4248 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

跨地域集群,它是怎么处理的:

  • 集群之间,要保证每个节点都有到其他集群的一个gateway的连接,有一个就可以。这样就可以保证集群间消息的互通。
  • 如果是3个集群,每个集群都会有6个inbound和6个outbound;如果是2个集群,每个集群都会有3个inbound和3个outbound。
  • 假设一条消息在A集群里,被客户端推到A1节点,他是怎么样把消息投递到在这个c集群里订阅的客户端的。
  • 跨集群,它是通过和A1节点相连的gateway,将消息推送到B和C这两个集群里。
  • 之后到了B集群和C集群,普通消息又在集群内分发到其他节点。

本文发表于 0001-01-01,最后修改于 0001-01-01。

本站永久域名「 jiavvc.top 」,也可搜索「 后浪笔记一零二四 」找到我。


上一篇 « 下一篇 »

赞赏支持

请我吃鸡腿 =^_^=

i ysf

云闪付

i wechat

微信

推荐阅读

Big Image