需求描述:
API服务器,采用异步IO实现并发,故每个API的执行需要非阻塞,否则会造成整个服务会不可用。有若干API是CPU-intensive的,需要较长执行时间,故希望将其执行任务从服务主服务进程detach。
架构设计:
考虑采用ZeroMQ来detach任务执行和API服务主进程。
使用ZeroMQ的PUSH/PULL模型。API主进程为producer(PUSH),worker进程为consumer(PULL)。
有趣的地方是,producer和consumer可以前者bind后者connect,也可以前者connect后者bind。在这个应用场景中,producer要使用connect,而consumer要bind。而不是相反。否则,一旦worker进程没有启动,那么API主进程的send就会阻塞。
坑:
1、producer bind而consumer connect,导致当worker进程未启动时,API主进程在send时会阻塞,从而阻塞所有服务。
2、worker使用了fork来服务多个PUSH/PULL通道。ZeroMQ socket的创建和连接需要在子进程中进行,而不能在父进程中完成然后在子进程中复制句柄。这一想象中或许可以工作的做法其实并不可行。