避免消息队列溢出
Message Queue Overflow avoidance
我正在使用 C++ 中的消息队列模板对我的消息进行排队,这恰好在 SIP 队列中 messages.My 队列大小是固定的,当我增加消息的速率和数量时,我能够检测到溢出在消息队列中。
我想避免消息队列溢出。因此,如果有人可以指导我在消息队列中使用实用的溢出避免技术,那将会很有帮助。
也欢迎就流行的 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()
。
您通常拥有的消息队列不是溢出 - 因为溢出为时已晚。你有类似高水位线的东西。 (Low Watermakr 也值得一提,因为当你始终处于 Low Watermark 时,这意味着你可能有太长的队列或太多的处理程序)。
一旦达到高水位线,您就会向用户发出信号。您还可以实施多种策略,具体取决于消息的语义。例如,您可能开始每隔一秒跳过一条消息。您可能会使用 'overflow buffer' - 极其轻量级的处理程序,它将简单地从队列中读取所有消息并将它们存储在某种缓冲区中,可能与文件一样简单,以供以后处理。您可能会做很多事情,但同样,您是在高水位线时做的,而不是在队列已满时做的。
我正在使用 C++ 中的消息队列模板对我的消息进行排队,这恰好在 SIP 队列中 messages.My 队列大小是固定的,当我增加消息的速率和数量时,我能够检测到溢出在消息队列中。
我想避免消息队列溢出。因此,如果有人可以指导我在消息队列中使用实用的溢出避免技术,那将会很有帮助。
也欢迎就流行的 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()
。
您通常拥有的消息队列不是溢出 - 因为溢出为时已晚。你有类似高水位线的东西。 (Low Watermakr 也值得一提,因为当你始终处于 Low Watermark 时,这意味着你可能有太长的队列或太多的处理程序)。
一旦达到高水位线,您就会向用户发出信号。您还可以实施多种策略,具体取决于消息的语义。例如,您可能开始每隔一秒跳过一条消息。您可能会使用 'overflow buffer' - 极其轻量级的处理程序,它将简单地从队列中读取所有消息并将它们存储在某种缓冲区中,可能与文件一样简单,以供以后处理。您可能会做很多事情,但同样,您是在高水位线时做的,而不是在队列已满时做的。