如何正确选择zmq最大缓冲区大小?

时间:2015-06-20 11:48:34

标签: c++ c sockets zeromq

根据ZMQ手册

  

ZMQ_SNDBUF选项应检索底层内核传输   指定套接字的缓冲区大小。值为零意味着   操作系统默认有效。有关详细信息,请参阅您的操作系统   SO_SNDBUF套接字选项的文档。

如何以简单的跨平台方式获取? 或者是获得它的唯一方式:

#ifdef _WIN32
some_win_actions
#else
some_other_actions
#endif

问题的 另一部分 :例如,我的操作系统默认SO_SNDBUF为10,客户端操作系统SO_SNDBUF将是5,会导致错误,还是ZMQ会在客户端以某种方式处理它?<​​/ strong>

1 个答案:

答案 0 :(得分:0)

初始注释:ZeroMQ缓冲区和用于跨平台代码的高水印

除了你原来的两个问题之外,还有一个需要注意的问题。由于ZeroMQ库的版本不同,缓冲区和高水印机制可能会有所不同。

例如:基于Unix的网格计算服务在C ++和python-service组件中使用最新的ZeroMQ版本。

此服务对于客户端连接是开放的,其中没有版本控制可能负责保持版本更新。因此,最终的场景必须处理最近的ZeroMQ连接(其中Buffers和High-Watermarks的机制将在两侧匹配)但是也有大量用户,他们没有甚至不能(某些跨平台)基于DLL的包装器等问题,所以只需更新底层的ZeroMQ版本。他们的缓冲区将具有其他高水印行为,并且您的一方无法按照您希望的任何方向执行任何操作。

问:...... ZMQ会在客户端以某种方式处理吗?

绝对不是。 ZeroMQ是一个非常强大的工具,但是有一个严格的简约设计,如果你自己的代码没有创建一些方法来避免任何远程端干预。

跨平台解决方案

在这些理由上应该有一些其他逻辑 - 设置你的代码设计,这样它就不会破坏你的资源(Buffers / High-Watermarks)。

简单地将目标颠倒过来。设计软件以便最大限度地接近Zero-*命令(使用最少的合理数量的资源),而不是依赖于最大值(不受控制 - 代码和版本)。

这样,您的代码不会受到其实际值的影响。代码在您的控制之下,而不是操作系统提供的内部机制或缓冲区约束。

使用这种方法,您的代码将是跨平台的,并且还可以进行版本验证。