我正在尝试为更大的监控和数据收集系统评估 ZeroMQ。在较小的规模上,一切都很好,但增加负载和规模似乎有点棘手。
现在我正在使用 C# 包装器(clrzmq,3.0.0-rc1)来创建发布者和订阅者应用程序。我将发布者套接字(1 个套接字,1 个上下文)绑定(bind)到 1000 个端点(本地主机 + 一系列端口),并让订阅者应用程序套接字(同样是 1 个套接字,1 个上下文)绑定(bind)到发布者端点。
这有时有效,有时无效(我猜这与进程以某种方式处理的最大套接字数有关)。这似乎取决于我启动应用程序的顺序,但我不能确定。我唯一看到的是讨厌的 SEHExceptions,根本不包含任何细节。如果我创建简单的控制台应用程序,我有时会看到低级 C++ 断言,例如:
对我帮助不大。在 C# 包装器中,上下文创建失败。它甚至没有机会开始连接甚至创建套接字。我希望通过抛出异常来处理低级别的 ZeroMQ 错误,也许我只是还没有理解如何处理错误。
我现在的问题是:
由于 ZeroMQ 看起来非常稳定和成熟,我很难相信 1000 个发布者应该是一个需要处理的问题。但是,为了在 C# 上使用 ZeroMQ,我需要比当前可用的更好的错误支持(除非我在这里完全错过了一些东西)。
更新:
在深入研究源代码后,我最终得到了一个
zmq_assert(...)
通向 RaiseException (0x40000015, EXCEPTION_NONCONTINUABLE, 1, extra_info);
。这将在将原始断言语句转储到控制台后突然终止应用程序。这似乎有点苛刻,但考虑到它确实无法恢复,这可能是最好的选择。但是,稍微好一点的错误消息不会造成伤害。不是每个人都知道 fds.size () <= FD_SETSIZE
是什么意思。源代码中的注释提供了一些线索,在错误消息中包含该注释会很好。无论如何,鉴于我的应用程序不是控制台应用程序,这只会给我留下一个未处理的 SEHException,它似乎甚至不包含断言语句或行/文件信息。我想知道我将创建多少其他错误会导致其他类似的神秘错误。 最佳答案
默认的 FD_SETSIZE 为 1024(在 MSVC libzmq 项目中定义),因此您将在测试用例进行到一半时遇到此问题。另一个断言由此而来。
在您的 libzmq 项目中将其增加到 4K 或 8K,效果应该会更好。
至于 assert() 调用,它肯定在 Windows 上太残酷了。在 Linux 上,这提供了一个不错的堆栈转储和足够的信息来跟踪问题。随意改进断言宏,以便它做一些更聪明的事情,例如启动调试器。在任何情况下,如果您打断言,您就无法合理地继续。
断言当 FD 集已满时,可以更好地处理。如果您对 C/C++ 有所了解,请随时查看代码。我们确实依赖于人们的补丁。
另外,如果您觉得 1024 太小,请随时在项目中提出此问题并将补丁发送给我们。
关于c# - ZeroMQ 订阅者无法使用 1000 多个发布者进行初始化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13684164/