# Очереди задач

В системе управление очередями задач реализовано с помощью платформы, реализующая систему обмена сообщениями между компонентами программной системы RabbitMq.

Предполагается, что основная нагрузка в системе ложится на калькуляторы, которые вычисляют значения ячеек для документов. Реализация в файле calculator.js. Архитектурным решением было вынести калькулятор в отдельный модуль, который можно было бы запускать в кластерном режиме (использование вертикального масштабирования) на сервере (оптимальное количество калькуляторов должно быть не больше количества ядер процессора). Кроме запуска на сервере с основным приложением, калькулятор можно запускать и на других компьютерах (горизонтальное масштабирование). Все калькуляторы, принимающие участие в расчетах находятся в состоянии ожидания задачи на расчет которые поступают посредством RabbitMq от основного приложения системы. Дополнительно RabbitMq занимается балансировкой задач между расчетчиками.

Кроме расчетчика некоторые задачи, которые потребляют много ресурсов, так же вынесены в отдельные обработчики, для того, чтобы при возникновении проблем с производительностью подключать дополнительные компьютеры или ядра процессора на их выполнение. Реализация в файле rabbit-workers.js

На описании работы калькулятор мы остановимся подробнее позднее в документации

Сейчас рассмотрим дополнительные обработчики, вынесенные в rabbit-workers.js

1. Конвертер файлов в PDF. Все файлы которые прикрепляются к документам конвертируются с помощью Open Office в pdf, для того, чтобы у пользователя появилась возможность просматривать содержимое файлов прямо в браузере
2. Генератор PDF. При вызове функции печать документа, у пользователя появляется дополнительная возможность вместо печати сохранить сформированный отчет в формате PDF. Конверсия HTML в PDF происходит с помощью приложения wkhtmltopdf. При использовании этого приложения HTML не превращается в картинку, а сохраняются все тексты в виде текстов, что удобно для последующего копирования информации из PDF в виде текстов.
3. Генератор документации (HTML, PDF и EPUB). Используется запуск приложения GitBook
4. Отправка писем.

Рассмотрим на примере конвертера файлов в PDF

Код worker-а

```javascript
    var RabbitMQWorker = require(__base + "src/rabbitmq_wc.js").worker;

    var pdf_converter_worker = new RabbitMQWorker({
        queue_id: rabbitPrefix+"pdf_convert", 
        worker: function(msg, done) {
            var FileFrom = msg.file_id;
            var tmp = os.tmpdir();
            GFS.ToDisk(FileFrom,tmp,function(err,filepath){
                var command = "soffice  --nofirststartwizard --headless --invisible --nologo --convert-to pdf "+filepath+" --outdir "+tmp;
                exec(command, function(err, out, code) {
                    var resultFile = tmp+'/'+FileFrom+'.pdf';
                    GFS.SaveFile(resultFile,function(err,info){
                        if (err) {
                            return done(err);
                        }
                        return done(err,info.id);
                    })
                });
            })
        }
    })

    pdf_converter_worker.connect(function(err) {
        if(err) return console.error(err);    
        return console.log("pdf-converter is running")
    })
```

Вызов задачи из кода

```javascript
var RabbitMQClient = require(__base + "src/rabbitmq_wc.js").client;

var PDFClient = new RabbitMQClient({
    queue_id: rabbitPrefix+"pdf_convert"
})

PDFClient.connect(function(err) {
    if (err) console.log("pdf_convert connect error",err);
})

var FileManagerHelper = (new function(){
    var self = this;

    self.ConvertToPDF = function(HashCode,done){
        PDFClient.sendMessage({ file_id: HashCode },done);
    }
    ...
    return self;
})
```
