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
,