Mosquitto (MQTT) - объем памяти издателя постоянно растет

Я тренируюсь с mosquitto Мы с mqtt хотели бы проверить объем памяти, занимаемой издателем и подписчиком. Я строю свой источник с libmosquitto,

Я изменил пример исходного кода в mosquitto/source/examples/temperature_conversion и создали publisher и подписчик. Я выделил 30 издателей, каждый из которых публикует 1000 уникальных тем (всего 30 000 тем). Вот мой фрагмент кода

std::unordered_map<unsigned int, std::string> Topics;    
const unsigned int Total_Topics = 1000;

  struct Quote {
      std::string ticker;    
      std::string exchange;    
      std::string full_name;    
      double value;    
      std::string data;    
      time_t timestamp;  

      friend std::ostream& operator<< (std::ostream& out, Quote& object) 
      {
          out << object.ticker << " " << object.exchange << " " << object.full_name << " " << object.value << " " << object.data << " " << object.timestamp;
          return out;
      }

      friend std::istream& operator>> (std::istream& in, Quote& object) 
      {
          in >> object.ticker;
          in >> object.exchange;
          in >> object.full_name;
          in >> object.value;
          in >> object.data;
          in >> object.timestamp;
          return in;
      }
    };

    mqtt_tempconv::mqtt_tempconv(const char *id, const char *host, int port, std::string tappend) : mosquittopp(id), postmessage()
    {
        int keepalive = 60; 
        connect(host, port, keepalive);
        for(unsigned int idx = 0; idx < Total_Topics; ++idx)
        {
           Topics.emplace(std::make_pair(idx, std::string("temperature/celsius" + tappend + std::to_string(idx))));
        } 
    }

    mqtt_tempconv::~mqtt_tempconv()
    {    
    }

   void mqtt_tempconv::on_connect(int rc)
    {
        printf("Connected with code %d.\n", rc);
        if(rc == 0)
        {                  
            postmessage = std::thread(&mqtt_tempconv::SendMessage, this);
        }
    }

   void mqtt_tempconv::SendMessage()
    {
        Quote quote = {};
        quote.ticker = "BHELL";
        quote.exchange = "BSE";
        quote.full_name = "BombayStockExchange";
        quote.value = 0.0;
        quote.data = "sample";
        quote.timestamp = time(0);
        std::stringstream ss;

        for(unsigned int NoOfTimes = 0; NoOfTimes < 20000; ++NoOfTimes)
        {
            for(unsigned int count = 0; count < Topics.size(); ++count)
            {
              quote.value *= 0.1;
              quote.data = std::to_string(NoOfTimes) + std::to_string(count);
              quote.timestamp = time(0);
              ss << quote;
              auto ret = publish(NULL, Topics[count].c_str(), ss.str().length(), ss.str().c_str(), 1, false);

          if (ret != MOSQ_ERR_SUCCESS)
          {
               std::cout << "Publish Failed with " << ret << std::endl;
          }

          ss.str("");   
          quote.data.clear();    
        }
        std::this_thread::sleep_for (std::chrono::seconds(8));   
    }    
}

Но происходит то, что объем памяти подписчика был ограничен каким-то X, но объем памяти издателя продолжает расти. Я не уверен, почему это происходит. Нужно ли выполнять какую-либо домашнюю уборку после публикации темы, предложите, пожалуйста.

Обновление: я понял, почему это происходит. я использовал QoS 1 поэтому я думаю, что мы должны очистить публикуемые данные, как только мы получим ACK, но не уверены, как это сделать. Это не видно с QoS 0,

0 ответов

Другие вопросы по тегам