MyCluster一个最重要的功能是抽象并简化跨进程跨节点的RPC调用,让开发人员:
- 不关心远端服务的部署(IP地址、端口号);
- 不关心远端服务的IP地址,端口号是否发生变化,不想因为他变化而修改我的代码;
- 不想知道远端服务是否是多实例,不想去解决负载均衡的问题,除非业务中指定了向某一固定远端服务的实例发送消息;
- 可以随意增加一个新的服务,因为部署极其简单,不想去考虑新增服务端口号是否冲突之类的部署问题;
- ……
设计原则:
- 对计算节点进行抽象,每个节点维护一个服务端口,监听其他节点发来的服务调用请求或本节点发出去的响应消息。
- 每个计算节点主要有4类可执行程序:msgbus、container、monitor和logger。
- msgbus负责跨节点的消息收发,msgbus与同节点的container通过共享内存直接交互。
- container为服务容器,开发人员按照一定的接口规范编写特定的业务动态库插件,由monitor负责自动加载。
- 同节点调用,不走网络,走共享内存。同一服务共享一个Input MsgQ,用于放请求消息,服务的每个container实例内部也有一个Input MsgQ,用于放响应消息(或指定路由的请求消息),这是因为:a)各Container根据自己的负载状态主动从共享的请求MsgQ中拉消息;b)请求消息可以任意分发到一个实例去处理,但响应消息必须原路返回,谁发出去的请求,必须回到谁那。c)如果要求指定发往哪个实例,自然不必多说。
- 跨节点调用走网络。
- 支持Java/C++/Python的Container,本文只介绍C++ Container,后面章节再详细介绍Java/Python版的Container。
服务调用流程: