我正在尝试评估 ZeroMQ 以获得更大的监控和数据收集系统。在较小的规模上,一切都很好,但增加负载和规模似乎有点棘手。
现在我正在使用 C# 包装器(clrzmq,3.0.0-rc1)来创建发布者和订阅者应用程序。我将发布者套接字(1 个套接字,1 个上下文)绑定到 1000 个端点(本地主机 + 一系列端口),并让订阅者应用程序套接字(同样是 1 个套接字,1 个上下文)绑定到发布者端点。
这有时有效,有时无效(我想这与进程以某种方式处理的最大套接字数有关)。这似乎取决于我启动应用程序的顺序,但我无法确定。我唯一看到的是讨厌的 SEHExceptions,根本不包含任何细节。如果我创建简单的控制台应用程序,我有时会看到低级 C++ 断言,例如:
- 断言失败:fds.size () <= FD_SETSIZE (......\src\select.cpp:70)
- 断言失败:权限被拒绝 (......\src\signaler.cpp:281)
- 断言失败:对等方重置连接 (......\src\signaler.cpp:124)
对我不是很有帮助。在 C# 包装器中,上下文创建失败。它甚至没有机会开始连接甚至创建套接字。我希望通过抛出异常来处理低级别的 ZeroMQ 错误,也许我只是还不明白如何处理错误。
我现在的问题是:
- 如何创建(有点)真实的测试设置来模拟单台机器上的 1000 个单独的发布者(在现实世界中 1 个发布者 = 1 台机器)和另一台机器上的几个订阅者,所有这些都使用 C#。这甚至可能吗?
- 更重要的是,我如何在 C# 代码中捕获 ZeroMQ 错误以了解问题所在?
由于 ZeroMQ 看起来相当稳定和成熟,我很难相信 1000 个发布者应该是一个问题。但是,为了在 C# 上使用 ZeroMQ,我需要比目前可用的更好的错误支持(除非我在这里完全错过了一些东西)。
更新:
在深入研究源代码后,我最终得到zmq_assert(...)
了RaiseException (0x40000015, EXCEPTION_NONCONTINUABLE, 1, extra_info);
. 这将在将原始断言语句转储到控制台后突然终止应用程序。这似乎有点苛刻,但考虑到它确实无法恢复,这可能是最好的选择。但是,更好的错误消息不会受到伤害。不是每个人都知道是什么fds.size () <= FD_SETSIZE
意思。源代码中的评论提供了一些线索,如果在错误消息中包含该评论会很好。无论如何,鉴于我的应用程序不是控制台应用程序,这只会给我留下一个未处理的 SEHException,它似乎甚至不包含断言语句或行/文件信息。我想知道我将创建多少其他错误会导致其他类似的神秘错误。