如果要用 ZeroMQ 实现一个典型的 TCP 服务器,一个服务器同时服务多个请求,好像一般是需要使用 Router 模式吧。
Router 模式会在收到每个消息后,在消息前面添加一个 Connection Identity (长度是 5 字节的一个帧)。然后如果要把应答传回给客户端,也需要在消息前面加上这个 Connection Identiry ,否则就无法把应答正确送达发送者。
如果每个请求的处理都是同步的,写起来很简单:就先用一个变量存一下 Identity ,然后发应答的时候发回去就行了。
但是如果采用异步方式(调用其它非阻塞 API )处理请求,那么就稍微有些麻烦了。这种情况下服务器必须自己来维护一个从 Identity 到 Async Request ID 的映射。当非阻塞 API 返回的时候,需要把 Async Request ID 重新映射到 Identity ,把 Identity 加到消息头部再发送才行。
请问这种方式是实现这样的一个服务器的标准方法吗?有没有更简洁的方法?(暂时不考虑简单暴力的开多线程 / 进程,多个 Rep 同时处理 Req 的方法)
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.