milvus各组件的结构体分析2
分析各组件的服务端API。
rootcoord
// Server grpc wrapper
type Server struct {//自身提供的api功能接口rootCoord types.RootCoordComponentgrpcServer *grpc.ServergrpcErrChan chan errorwg sync.WaitGroupctx context.Contextcancel context.CancelFuncserverID atomic.Int64etcdCli *clientv3.ClienttikvCli *txnkv.ClientdataCoord types.DataCoordClientqueryCoord types.QueryCoordClientnewDataCoordClient func(string, *clientv3.Client) types.DataCoordClientnewQueryCoordClient func(string, *clientv3.Client) types.QueryCoordClient
}
types.RootCoordComponent是一个接口。
包含了dataCoord和queryCoord客户端。
dataCoord由newDataCoordClient赋值。
queryCoord由newQueryCoordClient赋值。
从结构体可以看出:
1.Server结构体包裹了一个rootCoord接口,用来实现rootCoord的一些API功能。
type RootCoordComponent interface {RootCoordSetAddress(address string)SetEtcdClient(etcdClient *clientv3.Client)SetTiKVClient(client *txnkv.Client)UpdateStateCode(commonpb.StateCode)SetDataCoordClient(dataCoord DataCoordClient) errorSetQueryCoordClient(queryCoord QueryCoordClient) errorSetProxyCreator(func(ctx context.Context, addr string, nodeID int64) (ProxyClient, error))GetMetrics(ctx context.Context, req *milvuspb.GetMetricsRequest) (*milvuspb.GetMetricsResponse, error)
}
RootCoord也是一个接口,里面包含接口Component,这个接口有方法
Init()、Start()、Stop()、Regiter()。
2.Server结构体包含了客户端etcdCli和tikvCli,根据配置文件选择使用etcd还是tikv作为元数据存储。
3.包含一个grpcServer结构体
4.Server结构体包含了dataCoord客户端,说明rootcoord会和datacoord通信。
types.DataCoordClient是一个接口。
type DataCoordClient interface {io.Closerdatapb.DataCoordClient
}
datapb.DataCoordClient也是一个接口,是datacoord service的客户端接口。
5.Server结构体包含了queryCoord客户端,说明rootcoord会和queryCoord通信。
types.QueryCoordClient是一个接口。
type QueryCoordClient interface {io.Closerquerypb.QueryCoordClient
}
querypb.QueryCoordClient也是一个接口,是querycoord service的客户端接口。
datacoord
没有indexcoord,和datacoord合并。
// Server is the grpc server of datacoord
type Server struct {ctx context.Contextcancel context.CancelFuncserverID atomic.Int64wg sync.WaitGroupdataCoord types.DataCoordComponentetcdCli *clientv3.ClienttikvCli *txnkv.ClientgrpcErrChan chan errorgrpcServer *grpc.Server
}
从结构体可以看出:
1.Server结构体包裹了一个dataCoord接口,用来实现dataCoord的一些API功能。
type DataCoordComponent interface {DataCoordSetAddress(address string)SetEtcdClient(etcdClient *clientv3.Client)SetTiKVClient(client *txnkv.Client)SetRootCoordClient(rootCoord RootCoordClient)SetDataNodeCreator(func(context.Context, string, int64) (DataNodeClient, error))SetIndexNodeCreator(func(context.Context, string, int64) (IndexNodeClient, error))
}
2.Server结构体包含了客户端etcdCli和tikvCli,根据配置文件选择使用etcd还是tikv作为元数据存储。
3.包含一个grpcServer结构体。
datacoord并不像rootcoord包含有其它组件的客户端。
querycoord
// Server is the grpc server of QueryCoord.
type Server struct {wg sync.WaitGrouploopCtx context.ContextloopCancel context.CancelFuncgrpcServer *grpc.ServerserverID atomic.Int64grpcErrChan chan errorqueryCoord types.QueryCoordComponentfactory dependency.FactoryetcdCli *clientv3.ClienttikvCli *txnkv.ClientdataCoord types.DataCoordClientrootCoord types.RootCoordClient
}
从结构体可以看出:
1.Server结构体包裹了一个querycoord接口,用来实现querycoord的一些API功能。
type QueryCoordComponent interface {QueryCoordSetAddress(address string)SetEtcdClient(etcdClient *clientv3.Client)SetTiKVClient(client *txnkv.Client)UpdateStateCode(stateCode commonpb.StateCode)SetDataCoordClient(dataCoord DataCoordClient) errorSetRootCoordClient(rootCoord RootCoordClient) errorSetQueryNodeCreator(func(ctx context.Context, addr string, nodeID int64) (QueryNodeClient, error))
}
2.Server结构体包含了客户端etcdCli和tikvCli,根据配置文件选择使用etcd还是tikv作为元数据存储。
3.包含一个grpcServer结构体。
4.Server结构体包含了dataCoord客户端,说明querycoord会和datacoord通信。
5.Server结构体包含了rootCoord客户端,说明querycoord会和rootCoord通信。
indexcoord
没有indexcoord,和datacoord合并。
datanode
type Server struct {datanode types.DataNodeComponentwg sync.WaitGroupgrpcErrChan chan errorgrpcServer *grpc.Serverctx context.Contextcancel context.CancelFuncetcdCli *clientv3.Clientfactory dependency.FactoryserverID atomic.Int64rootCoord types.RootCoorddataCoord types.DataCoordnewRootCoordClient func(string, *clientv3.Client) (types.RootCoordClient, error)newDataCoordClient func(string, *clientv3.Client) (types.DataCoordClient, error)
}
从结构体可以看出:
1.Server结构体包裹了一个datanode接口,用来实现datanode的一些API功能。
type DataNodeComponent interface {DataNodeUpdateStateCode(stateCode commonpb.StateCode)GetStateCode() commonpb.StateCodeSetAddress(address string)GetAddress() stringSetEtcdClient(etcdClient *clientv3.Client)SetRootCoordClient(rootCoord RootCoordClient) errorSetDataCoordClient(dataCoord DataCoordClient) error
}
2.Server结构体包含了客户端etcdCli。为什么这里没有tikvCli??
3.包含一个grpcServer结构体。
4.包含了rootCoord和dataCoord接口。
indexnode
// Server is the grpc wrapper of IndexNode.
type Server struct {indexnode types.IndexNodeComponentgrpcServer *grpc.ServergrpcErrChan chan errorserverID atomic.Int64loopCtx context.ContextloopCancel func()loopWg sync.WaitGroupetcdCli *clientv3.Client
}
从结构体可以看出:
1.Server结构体包裹了一个indexnode接口,用来实现indexnode的一些API功能。
type IndexNodeComponent interface {IndexNodeSetAddress(address string)GetAddress() stringSetEtcdClient(etcdClient *clientv3.Client)UpdateStateCode(stateCode commonpb.StateCode)
}
2.Server结构体包含了客户端etcdCli。为什么这里没有tikvCli??
3.包含一个grpcServer结构体。
不包含其它组件。
querynode
// Server is the grpc server of QueryNode.
type Server struct {querynode types.QueryNodeComponentwg sync.WaitGroupctx context.Contextcancel context.CancelFuncgrpcErrChan chan errorserverID atomic.Int64grpcServer *grpc.ServeretcdCli *clientv3.Client
}
从结构体可以看出:
1.Server结构体包裹了一个querynode接口,用来实现querynode的一些API功能。
type QueryNodeComponent interface {QueryNodeUpdateStateCode(stateCode commonpb.StateCode)SetAddress(address string)GetAddress() stringSetEtcdClient(etcdClient *clientv3.Client)
}
2.Server结构体包含了客户端etcdCli。为什么这里没有tikvCli??
3.包含一个grpcServer结构体。
不包含其它组件。
proxy
// Server is the Proxy Server
type Server struct {ctx context.Contextwg sync.WaitGroupproxy types.ProxyComponenthttpListener net.ListenergrpcListener net.ListenertcpServer cmux.CMuxhttpServer *http.ServergrpcInternalServer *grpc.ServergrpcExternalServer *grpc.ServerserverID atomic.Int64etcdCli *clientv3.ClientrootCoordClient types.RootCoordClientdataCoordClient types.DataCoordClientqueryCoordClient types.QueryCoordClient
}
从结构体可以看出:
1.Server结构体包裹了一个proxy接口,用来实现proxy的一些API功能。
type ProxyComponent interface {ProxySetAddress(address string)GetAddress() stringSetEtcdClient(etcdClient *clientv3.Client)SetRootCoordClient(rootCoord RootCoordClient)SetDataCoordClient(dataCoord DataCoordClient)SetQueryCoordClient(queryCoord QueryCoordClient)SetQueryNodeCreator(func(ctx context.Context, addr string, nodeID int64) (QueryNodeClient, error))GetRateLimiter() (Limiter, error)UpdateStateCode(stateCode commonpb.StateCode)
}
2.Server结构体包含了客户端etcdCli。为什么这里没有tikvCli??
3.包含客户端rootCoordClient、dataCoordClient、queryCoordClient。