【发布时间】:2014-12-03 03:06:47
【问题描述】:
在阅读 zeromq 指南时,我遇到了客户端代码,它在一个循环中发送 100k 请求,然后在第二个循环中接收回复。
#include "../include/mdp.h"
#include <time.h>
int main (int argc, char *argv [])
{
int verbose = (argc > 1 && streq (argv [1], "-v"));
mdp_client_t *session = mdp_client_new ("tcp://localhost:5555", verbose);
int count;
for (count = 0; count < 100000; count++) {
zmsg_t *request = zmsg_new ();
zmsg_pushstr (request, "Hello world");
mdp_client_send (session, "echo", &request);
}
printf("sent all\n");
for (count = 0; count < 100000; count++) {
zmsg_t *reply = mdp_client_recv (session,NULL,NULL);
if (reply)
zmsg_destroy (&reply);
else
break; // Interrupted by Ctrl-C
printf("reply received:%d\n", count);
}
printf ("%d replies received\n", count);
mdp_client_destroy (&session);
return 0;
}
我添加了一个计数器来计算工作人员 (test_worker.c) 发送给代理的回复数量,并在 mdp_broker.c 中添加另一个计数器来计算代理发送给客户端的回复数量。这两个都计数到 100k,但客户端只收到大约 37k 回复。
如果客户端请求的数量设置为 40k 左右,则它会接收所有回复。当客户端发送超过 40k 的异步请求时,谁能告诉我为什么丢包?
我尝试将代理套接字的 HWM 设置为 100k,但问题仍然存在:
static broker_t *
s_broker_new (int verbose)
{
broker_t *self = (broker_t *) zmalloc (sizeof (broker_t));
int64_t hwm = 100000;
// Initialize broker state
self->ctx = zctx_new ();
self->socket = zsocket_new (self->ctx, ZMQ_ROUTER);
zmq_setsockopt(self->socket, ZMQ_SNDHWM, &hwm, sizeof(hwm));
zmq_setsockopt(self->socket, ZMQ_RCVHWM, &hwm, sizeof(hwm));
self->verbose = verbose;
self->services = zhash_new ();
self->workers = zhash_new ();
self->waiting = zlist_new ();
self->heartbeat_at = zclock_time () + HEARTBEAT_INTERVAL;
return self;
}
【问题讨论】:
标签: zeromq distributed-computing