使用Libuv,我实现了一个调用另一个TCP服务器B的TCP服务器A.
当服务器A不断收到请求时,我使用从A到B建立的单个TCP连接向服务器B发送请求。
鉴于Libuv是异步和面向回调的,我如何区分我得到服务器B的响应?即如何将正确的结果发送回服务器A的客户端?
文档说,uv_read_cb
回调将被多次调用。我如何知道要求uv_read_cb
的原始请求?
答案 0 :(得分:2)
TCP是基于流的,而不是基于消息的 - 您不会发送单个消息,而是发送未经过分类的数据流。简而言之,您尝试做的事情总是很棘手,处理完全取决于您。
您需要在TCP之上创建自己的协议。根据您的要求,这可以像分配唯一ID并将其与响应一起发送一样简单。当然,您还必须处理消息转换本身 - 与任何基于TCP的消息协议一样。我强烈建议只使用一个线程将任何数据写入TCP流 - 您可以使用线程安全队列发布消息,这样它们就不会被通常的异步写入破坏。 / p>
读取回调将拾取碎片化和合并的消息,毫无疑问。它是标准的TCP场景,您需要为此做好准备。这就是为什么我还推荐一个读取器,它将从流中读取,并将每个已解析的消息发布到另一个队列。您可以根据需要使用随请求发送的唯一ID进行配对。