节点间通信有较大的代价,具体如下:
- 节点间消息传递速度慢
- 安全性得不到保障
根据skynet的特性,如果CPU运算能力不足,选用多核机器比增加物理机性价比高(多节点通信性能损耗大)。
Skynet服务重入问题:Skynet服务在收到消息时,会创建一个协程,在协程中会运行消息处理方法(即用``skynet.dispatch`设置的回调方法)。这意味着,如果在消息处理方法中调用阻塞API,服务不会被卡住(仅仅是处理消息的协程被卡住),执行效率得以提高,但程序的执行时序将得不到保证。
如何解决Skynet服务重入问题?
使用skynet提供的工具skynet.queue来将API重入调用转为顺序调用;
Skynet使用全局队列保存了要调度的服务,调度算法是先来先服务。如果某个服务有新消息,就把这个服务驾到调度队列中,然后等待调度线程调度。而skynet服务的调度切换依赖于协程的挂起,如果当前调度的服务没有主动挂起或退出,就会一直执行,不调度其他服务,从而导致其他服务饿死。
如何解决其它服务饿死问题?
不推荐在skynet服务中使用使用死循环,如果一定要使用,要给循环加退出条件;最好给每个循环加一个skynet.sleep,让循环稍等片刻;
skynet服务创建协程来处理请求,当请求数量过大时,创建过多的协程会耗费非常大的内存;
如何解决这个问题?
手动调用skynet的GC函数
对于一些频繁调用的功能服务,尽量避免做成单点服务;如果有这项需求,可以前置一个代理服务,通过代理服务将消息转发到功能服务集群;