ZeroMQ的bind和connect

需求描述:

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的创建和连接需要在子进程中进行,而不能在父进程中完成然后在子进程中复制句柄。这一想象中或许可以工作的做法其实并不可行。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容