ZeroMQ请求和多个异步回复此请求

时间:2017-03-03 14:59:27

标签: asynchronous design-patterns zeromq

我有类似远程计算机执行繁重计算的东西,以及向其发送任务的客户端计算机。输出结果非常大,从兆字节到千兆字节,并且在很长一段时间内都是大块的。所以它看起来像这样: 客户端发送任务然后需要接收这个块,因为它们已经有用(一个请求 - 多个响应)。如何在ZeroMQ中实现这种模式。

2 个答案:

答案 0 :(得分:1)

您可以使用异步模式(DEALER-ROUTER)。

请看这个主题The Asynchronous Client/Server Pattern

JavaC#

中的示例中

但请记住,如果达到HWM,ROUTER套接字可以放弃你的消息。

答案 1 :(得分:1)

也许我读错了上面的定义问题,但就目前而言,在我看来,主要关注的是实现一种方式来容纳一对主机之间的消息流(不是经纪人)扇出1+使用经典DEALER/ROUTER可扩展形式通信模式的工人),
其中
关键问题
是,如何处理客户端机器(发送一个大型计算任务请求并“等待”部分结果流)
HPC-machine (接收一个TaskJOB,处理它并将非同步,无约束的时间和大小的消息传送回客户机)。

对于这样的1:1案例,使用1-Job:many-partialJobResponses,设置可能会受益于联合消息传递和信令基础设施以及几个实际的插座,如下图所示:

信令:

clientPUSH   |-> hpcPULL    // new TaskJOB|-> |
clientPULL <-|   hpcPUSH    //              <-|ACK_BEGIN
clientPULL <-|   hpcPUSH    //              <-|KEEPALIVE_WATCHDOG + PROGRESS_%
clientPULL <-|   hpcPUSH    //              <-|KEEPALIVE_WATCHDOG + PROGRESS_%
...                         //                |...
clientPULL <-|   hpcPUSH    //              <-|KEEPALIVE_WATCHDOG + PROGRESS_%
clientPULL <-|   hpcPUSH    //              <-|KEEPALIVE_WATCHDOG + PROGRESS_%
clientPULL <-|   hpcPUSH    //              <-|ACK_FINISH         + LAST_PAYLOAD#
clientPUSH   |-> hpcPULL    // new TaskJOB|-> |
clientPULL <-|   hpcPUSH    //              <-|ACK_BEGIN
...                         //                |...
clientPULL <-|   hpcPUSH    //              <-|ACK_FINISH         + LAST_PAYLOAD#

信息:

clientRECV <-|   hpcXMIT    //              <-|FRACTION_OF_A_FAT_RESULT_PAYLOAD#i
clientACK    |-> hpcACK     // #i POSACK'd|-> |
clientRECV <-|   hpcXMIT    //              <-|FRACTION_OF_A_FAT_RESULT_PAYLOAD#j
clientRECV <-|   hpcXMIT    //              <-|FRACTION_OF_A_FAT_RESULT_PAYLOAD#k
clientACK    |-> hpcACK     // #k POSACK'd|-> |
clientACK    |-> hpcACK     // #j   NACK'd|-> |
clientRECV <-|   hpcXMIT    //              <-|FRACTION_OF_A_FAT_RESULT_PAYLOAD#j
clientACK    |-> hpcACK     // #j POSACK'd|-> |
clientACK    |-> hpcACK     // #u   NACK'd|-> |               // after ACK_FINISH
clientACK    |-> hpcACK     // #v   NACK'd|-> |               // after ACK_FINISH
clientACK    |-> hpcACK     // #w   NACK'd|-> |               // after ACK_FINISH
clientACK    |-> hpcACK     // #x   NACK'd|-> |               // after ACK_FINISH
clientRECV <-|   hpcXMIT    //              <-|FRACTION_OF_A_FAT_RESULT_PAYLOAD#x
clientACK    |-> hpcACK     // #x POSACK'd|-> |
clientRECV <-|   hpcXMIT    //              <-|FRACTION_OF_A_FAT_RESULT_PAYLOAD#u
clientACK    |-> hpcACK     // #u POSACK'd|-> |
...                         //                | ...      
clientRECV <-|   hpcXMIT    //              <-|FRACTION_OF_A_FAT_RESULT_PAYLOAD#w
clientACK    |-> hpcACK     // #w POSACK'd|-> |

再次,使用一对PUSH/PULL套接字用于(内部)无状态消息传递自动机,但允许创建一个自己的,更高级别的有限状态自动机,用于自我修复消息流,处理 FAT_RESULT 控制碎片变成更容易吞下的有效载荷(记住ZeroMQ格言之一,使用零担保而不是构建不可扩展的乳蝠(它的进化性质)野生生态系统无论如何都会被杀死)并且还会根据需要提供一定程度的无功重传。

一些更智能的多代理设置距离草图不远,以提高处理吞吐量( FAT_RESULT DataFlow 策展人代理,与<分开strong> HPC_MAIN ,卸载HPC平台的资源,立即启动下一个 TaskJOB 等等

相关问题