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

How to choose zmq maximum buffer size properly?

根据 ZMQ 手册

The ZMQ_SNDBUF option shall retrieve the underlying kernel transmit buffer size for the specified socket. A value of zero means that the OS default is in effect. For details refer to your operating system documentation for the SO_SNDBUF socket option.

如何以简单的跨平台方式获取它? 或者是像这样以某种方式获得它的唯一方法:

#ifdef _WIN32
some_win_actions
#else
some_other_actions
#endif

问题的另一部分:例如,如果我的OS默认SO_SNDBUF将是10 , 而客户端的 OS SO_SNDBUF 将是 5, 会导致错误,还是 ZMQ 会在客户端以某种方式处理它?

初始说明:跨平台代码的 ZeroMQ 缓冲区和高水位线

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

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

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

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

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

跨平台解决方案

基于这些理由应该有一些其他的逻辑——设置你的代码设计,这样它就不会破坏你的资源(缓冲区/高水位线)。

简单地把目标颠倒过来。设计软件以最大程度地接近零*命令(使用最少的合理数量的资源),而不是依赖最大值(这是您无法控制的 - 代码方面和版本方面)。

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

通过这种方法,您的代码将是跨平台的,并且是版本证明的。