2015-09-17 1 views
2

Я использую шаблон очереди сообщений в C++ для отправки сообщений, которые происходят в очереди сообщений SIP. Мой размер очереди фиксирован, и когда я увеличиваю скорость и количество сообщений, я могу обнаружить превышение потока в очереди сообщений.Недостаток переполнения очереди сообщений

Я хотел бы избежать переполнения очереди сообщений. Поэтому, если кто-то может направить меня на практические методы предотвращения переполнения в очередях сообщений, это очень помогло бы.

Предложения, касающиеся популярного предотвращения переполнения очереди сообщений POSIX, также приветствуются, поскольку я получаю от него некоторые идеи.

ответ

3

Вы можете обнаружить ситуацию с переполнением, что отлично. Затем вам просто нужно определить поведение при переполнении. Обычно есть два варианта: блокировать или сбой.

Сбой при переполнении очевидно, блокирование очереди потребует мьютекс и состояние переменной:

std::unique_lock<std::mutex> lock(mutex); 
while (full()) { 
    cond.wait_for(lock, std::chrono::microseconds(milliseconds)); 
    // TODO: or define a max wait time and fail accordingly. 
}; 
add(message); 
return; 

И делать cond.notify_one(), когда очередь потребляется и больше нет переполнения.

+0

Если вы обнаружите переполнение, это уже произошло. ОП спрашивает, как ** избегать **, который слишком широк. – Olaf

+0

Я предполагаю, что, обнаружив переполнение OP, проверяет, заполнена ли очередь, чем-то вроде проверки счетчика очереди, и ничего не произошло. При блокировке или сбое, когда очередь заполнена, избегайте переполнения. –

+1

Полное и переполнение четко определены. Если не изменено, я возьму то, что написал OP. Обратите внимание, что условие «Полный», вероятно, уже слишком поздно, потому что не может быть времени, чтобы остановить следующее сообщение. – Olaf

1

То, что у вас обычно есть для очередей сообщений, не переполнение - потому что переполнение слишком поздно. У вас есть что-то вроде High Watermark. (Low Watermakr также стоит упомянуть, потому что, когда вы постоянно используете Low Watermark, это означает, что у вас, вероятно, слишком длинная очередь или слишком много обработчиков).

Как только вы нажмете High Watermark, вы сигнализируете пользователю. Вы также можете реализовать несколько стратегий, отбрасывая семантику сообщений. Например, вы можете начать пропускать каждое второе сообщение. Вы можете использовать «переполненный буфер» - чрезвычайно легкий обработчик, который будет просто читать все сообщения из очереди и хранить их в каком-то буфере, может быть таким же простым, как файл, для последующей обработки. Вы можете сделать много вещей, но опять же, вы делаете это на High Watermark, а не когда очередь уже заполнена.