前端服务如何在节奏中知道历史服务的变化?

问题描述

就节奏而言,历史服务是一个响铃,因此如果将新的历史服务添加到历史服务中,每个历史服务都会知道要加入的新历史服务。但是前端服务需要将请求路由到历史服务。前端服务如何知道还有一个历史服务要加入?

解决方法

这一切都是通过 ringpop 完成的。 Cadence 将 ringpop 库用于所有服务,包括历史记录和前端。

https://github.com/uber/ringpop-go

Ringpop 为分片、请求路由和主机发现提供一致的哈希环。

在 Cadence 集群中,所有服务都将使用相同的 ringpop bootstrap 配置,如

https://github.com/banzaicloud/banzai-charts/blob/031c49f4f1f542f60a88bb9f5fc56c22a518d773/cadence/templates/server-configmap.yaml#L72

这样,所有服务都使用相同的一致性哈希环,并且它们可以访问任何服务的任何主机。

如果使用 admin cluster describe 命令可以看到 类似于以下内容:


cadence --address `hostname`:7933 adm cl d
{
  "supportedClientVersions": {
    "goSdk": "1.5.0","javaSdk": "1.5.0"
  },"membershipInfo": {
    "currentHost": {
      "Identity": "10.42.13.242:7933"
    },"reachableMembers": [
      "10.42.13.254:7935","10.42.26.5:7939","10.42.18.213:7934","10.42.13.242:7933","10.42.27.210:7939","10.42.18.48:7933","10.42.18.153:7935"
    ],"rings": [
      {
        "role": "cadence-frontend","memberCount": 2,"members": [
          {
            "Identity": "10.42.18.48:7933"
          },{
            "Identity": "10.42.13.242:7933"
          }
        ]
      },{
        "role": "cadence-history","memberCount": 1,"members": [
          {
            "Identity": "10.42.18.213:7934"
          }
        ]
      },{
        "role": "cadence-matching","members": [
          {
            "Identity": "10.42.13.254:7935"
          },{
            "Identity": "10.42.18.153:7935"
          }
        ]
      },{
        "role": "cadence-worker","members": [
          {
            "Identity": "10.42.27.210:7939"
          },{
            "Identity": "10.42.26.5:7939"
          }
        ]
      }
    ]
  }
}

每个主机可能为不同的服务工作,但他们都互相认识。

如果有兴趣,实现代码路径在这里https://github.com/uber/cadence/blob/deb0caf06577be007046e5f96ef40bdf3c0bc728/client/history/client.go#L1178