Как сохранить загруженные сообщения MQTT в MongoDB? - PullRequest
0 голосов
/ 03 декабря 2018

У меня проблема с моим приложением, которое хранит сообщения 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, который подходитмоя потребность.

Если у вас есть какие-либо предложения, я открыт, чтобы выслушать это:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...