【问题标题】:How to choose zmq maximum buffer size properly?如何正确选择 zmq 最大缓冲区大小?
【发布时间】:2017-06-25 00:11:30
【问题描述】:

根据 ZMQ 手册

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

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

#ifdef _WIN32
some_win_actions
#else
some_other_actions
#endif

问题的另一部分:例如,如果我的操作系统默认 SO_SNDBUF 为 10,而客户端的操作系统 SO_SNDBUF 为 5,会导致错误,或者 ZMQ 会在客户端以某种方式处理它?

【问题讨论】:

    标签: c++ c sockets zeromq


    【解决方案1】:

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

    除了您最初的两个问题之外,还有一个问题需要注意。由于 ZeroMQ 库的版本不同,缓冲区和 High-Watermark 机制可能会有所不同。

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

    此服务对客户端连接开放,其中没有版本控制可能负责保持版本更新。因此,生成的场景将必须处理最近的 ZeroMQ 连接(缓冲区和高水位标记的机制将在两边匹配)但也有大量用户,他们不这样做甚至不能(一些跨平台基于 DLL 的包装器等的问题),因此只需更新底层的 ZeroMQ 版本。他们的缓冲区将具有其他高水位标记行为,您的一方无法将其更改为您希望的任何方向。

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

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

    跨平台解决方案

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

    只需将目标倒置即可。设计软件,以便最大限度地接近零*命令(使用最小合理数量的资源),而不是依赖最大值(超出您的控制 - 代码和版本)。

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

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

    【讨论】:

      猜你喜欢
      • 2014-08-19
      • 2020-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多