У меня проблема с моим приложением, которое хранит сообщения MQTT в MongoDB.Я использую spring-boot-starter-data-mongodb
, и он открывает много соединений с MongoDB, он выдает исключение, чтобы сообщить мне, что я превысил ограничение в 500 соединений.И загрузка процессора постоянно превышает 95%.
Вот метод, который сохраняет в MongoDB:
@Async
public void insertIntoDb(String topic, String vhost, MqttMessage mqttMessage) {
try {
String[] split = topic.split("/", 2);
String deviceName = split[0];
String topicName = (split.length > 1) ? split[1] : split[0];
Date now = new Date();
Object value = getValue(mqttMessage);
String upsertId = topicRepository.upsertTopic(new Topic(topicName, deviceName, vhost, now.getTime(), value));
boolean updateLastActivity = (topicName.equals("STS") || topicName.equals("LASTACTIVITY")) ? false : true;
deviceRepository.upsertDevice(new Device(deviceName, vhost, now.getTime()), upsertId, updateLastActivity);
if (typeDetectionService.isOctetStream(mqttMessage.getPayload())) {
dataRepository.save(new Data(deviceName, topicName, vhost, new Date(), mqttMessage.getPayload()));
} else {
dataRepository.save(new Data(deviceName, topicName, vhost, new Date(), value));
}
} catch (Exception e) {
logger.error("Error", e);
}
}
Он использует метод insert
из интерфейса MongoRepository
, я знаюэто не лучший способ вставить огромный объем данных в MongoDB, и мне нужно использовать групповую вставку.
Проблема, с которой я столкнулся, заключается в том, что мне нужно как можно быстрее вставить данные в базу данных, потому что этодолжно быть близко к реальному времени (я работаю с устройством IOT).Я думал о списке, который будет заполнен, и когда он достигнет 1000 данных (предел объема, если я правильно прочитал ...), он будет массово вставлен в базу данных.Или, если список не заполняется достаточно быстро, тайм-аут сообщит, когда писать все данные.
Я думал об интеграции Spring, но я не знаю, есть ли MessageChannel
, который подходитмоя потребность.
Если у вас есть какие-либо предложения, я открыт, чтобы выслушать это:)