1

我正在使用 autobahn-cpp 进行一些 pub&sub 测试。但是,我发现当您以比子端点可以消耗的速度更快的频率发布一些数据时,这将导致路由器(交叉开关)缓存一些数据并且内存使用量增加。最终,路由器将耗尽所有内存并被操作系统杀死。

例如

出版商:

while(1)
{
    session->publish("com.pub.test",std::make_tuple(std::string("hello, world")) );
    std::this_thread::sleep_for(std::chrono::seconds(1));  // sleep 1s
}   // pub a string every seconds

订户:

void topic1(const autobahn::wamp_event& event)
{
    try
    {
        auto s = event.argument<std::string>(0);
        std::cerr << s << std::endl;
        std::this_thread::sleep_for(std::chrono::seconds(2)); //need 2s to finish the job
    }
    catch (std::exception& e) 
    {
        std::cerr << e.what() << std::endl;
    }
}
main()
{
    ...
    session>subscribe("com.pub.test", &topic1);
    ...  
}   // pub runs faster than the sub can consume

经过几个houser:

2016-01-7 10:11:32+0000 [Controller  16142] Worker 16145: Process connection gone (A process has ended with a probable error condition: process ended by signal 9.)

dmsg:

Out of memory: Kill process 16145(Crossbar.io Wor) score 4 or sacrifice child

我的问题:

  • 这正常吗(耗尽所有内存并被操作系统杀死)?
  • 或者是否可以设置任何配置选项来限制内存使用?

我发现了一个类似的问题,请参阅链接https://github.com/crossbario/crossbar/issues/48

系统信息:ubuntu 14.04(32bit)、CPython 2.7.6、Crossbar.io 0.11.1、Autobahn 0.10.9

4

1 回答 1

0

客户端正在填满它尚未传递的消息。

这是基于消息的协议的“特性”。

而不是request -> responserequest => response + response + etc

您遇到了“背压”,发送的响应队列填满的速度快于客户端接收它们的速度。

您应该停止生成或删除响应。您需要所有回复,还是只需要最新回复?

这是来自uWebsockets的一些“背压”文档

有一个“可观察”模式(类似于 Promises)可以提供帮助, Rx.Js适用于 JavaScript,但我确信 C++ 也有类似的东西。它就像一个流式承诺库。

于 2021-12-02T01:19:19.123 回答