Node.js微服务+流水线服务框架的设想
要点:
- 每个微服务从代码实现来看,就是一个JS函数,输入是一个JSON对象,输出也是一个JSON对象
- 框架负责将其转换为基于URL输入和输出的Web服务;
- 统计每个微服务的每秒请求数、每秒IO量,以单独的options url公开,以便全局的性能统计模块进行后端服务集群的性能统计
- 微服务支持动态的注册和重启:
- 动态注册:提供服务的名称和JS函数实现代码,框架的运行时负责将其转换为一个URL
- 上游可以调用下游,下游也可以调用上游,当发现某个服务不可用时,首先尝试缓冲数据,过一段时间重试;否则向中介者发请求,启动此依赖服务
- 所有这些过程都由微服务框架自动完成,负责微服务具体业务开发的人不需要关心这些东西
- 流水线的要点就是:每个步骤的处理速度尽可能快,以避免挤压/堆积
- 如果全局的性能监控模块发现某个流水线步骤是瓶颈,则自动水平扩展,分配新的服务运行实例
- 批量IO:微服务之间通过URL相互调用,假如协议是基于HTTP的,则一个请求输入/结果输出一个HTTP连接可能性能太差,框架应提供批量IO的wrapper功能
- 异步请求:
- 微服务一般可以认为是同步的,但如果某个请求的处理延迟太大的话,则最好做成异步的,对应到实施策略上,那就是:
- JS函数写成加一个异步callback参数的写法,而不是return一个结果
- 而框架负责将其转换为“异步Web服务”的模式:即服务的请求者在发送请求数据时,附带一个本地监听URL,之后服务的接受者将通过这个URL异步返回结果
- 如果无法打开“本地监听URL”,比如一个内网浏览器客户端,则可以通过“反向Comet长连接/WebSocket”技术来处理
- 微服务一般可以认为是同步的,但如果某个请求的处理延迟太大的话,则最好做成异步的,对应到实施策略上,那就是:
对一个实时的流数据处理+推荐系统来说,可能根本不需要使用数据库,第一步当然可以从MySQL切换到内存数据库Redis,第2步可以直接把数据库存储只作为一个“系统观察者+状态持久化”来考虑。