【发布时间】:2016-07-01 19:45:30
【问题描述】:
我无法在 ZeroMQ 多播套接字上通过 ZMQ_RATE(默认为非常低的 100 kbits/sec)设置最大速率 - 对 zmq_setsocketopt() 的调用失败(使用 @ 987654324@ 语言)。
我需要更高的速率,因为我的应用程序涉及流式视频。
任何人都可以对此有所了解 - 这是复制问题的精简代码
void* _context;
void* _responder;
_context = zmq_ctx_new ();
_responder = zmq_socket ( _context, ZMQ_SUB );
int64_t val = 100000;
int rc;
rc = zmq_setsockopt( _responder, ZMQ_RATE, &val, sizeof(int64_t) );
int ze2 = zmq_errno ();
int major, minor, patch;
zmq_version( &major, &minor, &patch );
printf( "DIAG[zmq_setsockopt() API:%d.%d.%d] RC: (%d) ~ Errno: (%d) ~ Error:(%s)\n",
major,
minor,
patch
rc,
ze2,
zmq_strerror( ze2 )
);
上面的输出是:
DIAG[zmq_setsockopt() API:4.0.4] RC: (-1) ~ Errno: (22) ~ Error: (Invalid argument)
如果我将套接字类型更改为 ZMQ_PUB,我也会收到错误消息。
我已经测试了从 1 到 100000 不同数量级的许多速率,都以相同的方式失败。
版本为 4.0.4,在 Windows 7 上运行
【问题讨论】:
-
API 版本很重要。它决定是否所有流量都流向每个 SUB 端,如果仍在使用版本,则在每个 SUB 接收节点上处理 ZMQ_SUBSCRIBE 主题过滤器(即使没有 SUB 订阅任何 PUB 主题,也要保持传输和处理开销)。您可以通过仔细调整 Context 属性和 ioThread 关联映射来以某种方式对此进行调整,但如果其他设计约束允许,则值得更新。您对流式应用程序的研究似乎是处理密集型的,因此任何分布式处理的 IO 调整都需要非常小心。
-
谢谢我根据以下回复进行了编辑 - 版本是 4.0.4。我会将 ZeroMQ 升级到最新版本,看看这是否仍然存在,尽管在生产中一切都在运行 4.0.4,所以我不愿意这样做,以防出现其他值得一试的问题
-
好吧,在某些项目中,由于缺少某些分布式系统节点上的较新语言绑定,我不得不保持与 2.1.11 版本一样旧的 API 兼容性。 4.0.4 应该不是问题。 (+ 参考。更新如下)