消息队列溢出避免



我正在使用c++中的消息队列模板来排队我的消息,这恰好排队SIP消息。我的队列大小是固定的,当我增加消息的速率和数量时,我能够检测到消息队列中的溢出流。

我想避免消息队列溢出。因此,如果有人能指导我在消息队列中实际的避免溢出技术,那将会很有帮助。

关于流行的POSIX消息队列溢出避免的建议也很受欢迎,因为我可以从中获得一些想法。

您可以检测溢出情况,这很棒。接下来,您只需要定义溢出时的行为。通常有两种选择:阻塞或失败。

溢出时失败是很明显的,阻塞队列需要一个互斥锁和条件变量:

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()

消息传递队列通常不会溢出——因为溢出太迟了。你有高水位。(低水位也值得一提,因为当你一直处于低水位时,这意味着你可能有太长的队列或太多的处理程序)。

一旦达到高水位,就向用户发出信号。您还可以根据消息的语义实现多种策略。例如,你可能开始跳过每隔一秒的消息。您可能会使用'overflow buffer' -非常轻量级的处理程序,它将简单地从队列中读取所有消息并将它们存储在某种类型的缓冲区中,可能像文件一样简单,以便稍后处理。你可以做很多事情,但是,你在高水位上做,而不是在队列已经满了的时候。

最新更新