run(options) {
        const {event, action, eventData} = options;

        clearTimeout(this.toNotify[action].timeout);
        this.toNotify[action].timeout = null;

        const subscribers = this.queue[event].subscribers;
        const notified = this.toNotify[action].notified;

        debug('run', action, event, subscribers.length, notified.length);

        if (subscribers.length && subscribers.length !== notified.length) {
            const fn = subscribers[notified.length];

            debug('run.execute', action, event, notified.length);

            /**
             * @NOTE: Currently no async operations happen in the subscribers functions.
             * We can trigger the functions sync.
             */
            try {
                fn(eventData);

                debug('run.executed', action, event, notified.length);
                this.toNotify[action].notified.push(fn);
                this.run(options);
            } catch (err) {
                debug('error', err.message);

                logging.error(new errors.InternalServerError({
                    message: 'Something bad happened.',
                    code: 'SERVICES_URL_QUEUE',
                    err: err
                }));

                // @NOTE: The url service stays in maintenance mode. There is nothing we can do if an url generator fails.
            }
        } else {
            // CASE 1: zero tolerance, kill run fn
            // CASE 2: okay, i was tolerant enough, kill me
            // CASE 3: wait for more subscribers, i am still tolerant
            if (this.queue[event].tolerance === 0) {
                delete this.toNotify[action];
                debug('run.ended (zero tolerance)', event, action);
                this.emit('ended', event);
            } else if (subscribers.length >= this.queue[event].requiredSubscriberCount &&
                this.toNotify[action].timeoutInMS > this.queue[event].tolerance) {
                delete this.toNotify[action];
                debug('run.ended (tolerance and subscribers)', event, action);
                this.emit('ended', event);
            } else {
                debug('run.retry', event, action, this.toNotify[action].timeoutInMS);

                this.toNotify[action].timeoutInMS = this.toNotify[action].timeoutInMS * 1.1;

                this.toNotify[action].timeout = setTimeout(() => {
                    this.run(options);
                }, this.toNotify[action].timeoutInMS);
            }
        }
    }
@description The queue runs & executes subscribers one by one (sequentially)
@param {Object} options
@param {string} options.event
@param {string} options.action
@param {Object} [options.eventData]