消息队列
What
消息队列
- 是消息的队列;
- 是消息的临时缓冲;
- 是发布/订阅模式的兄弟;
在多个进程/线程间实现异步通讯模式
。
Why
消息队列在多个进程/线程中实现了异步通讯模式。
这里我们先介绍下同步消息处理。对于同步消息处理,消息的消费者接受消息,处理消息,再接受下一个消息,这会延迟消息的接收直到上一个消息被处理完成,如果消息的处理速度很慢,消息的生产者必须在上一个消息的处理期间等待,直到其完成才能推送下一个消息,这会大大降低消息生产者的效率。
消息队列实现异步消息处理
。对于异步消息处理,消息的产生和消息的处理是异步的。消息的生产者将消息暂时放入队列中,然后就可以继续处理其他任务了,而不是阻塞在原地等待消息被处理;消息的消费者会在合适的时间 (比如空闲的时候) 从队列中取出消息进行处理。
消息队列为消息提供缓存
,确保消息会被消费者接收。
消息队列还能提供流控制
,平衡生产和消费的速度。当消息队列到达高水位 (HWM) 时,不再接收消息进队,并报告给调用方,使其降低消息入队的速率。让消息的消费者能处理队列中的消息,不至于堆积。
When
Where
消息队列常用于进程间通讯或同一进程的线程间通讯。
Who
How
消息队列可能存在隐式或显式的对消息大小的限制
以及队列中存在的消息的数量的限制
。
有些消息队列在多个操作系统和多个应用间传递消息,这样的消息队列一般提供恢复的机制
以避免因为程序或系统崩溃导致的消息丢失。
消息传递的准确语义通常有很多选项,包括:
持久性
– 消息可能存储在内存中,写到磁盘中,或者甚至上传到 DBMS 中,如果对可靠性的需求表明需要更多的资源密集型解决方案的话。安全策略
– 哪个应用应该访问这些消息?消息清除策略
– 队列或消息可能有“生命周期”。消息过滤
– 一些系统支持过滤数据,所以订阅者可能仅能看到符合预先指定的感兴趣的标准的消息。递交策略
– 是否需要保证消息被递交至少一次还是不超过一次。路由策略
– 在一个有很多队列服务器的系统中,哪个服务器应该接收消息或队列的消息?批处理策略
– 消息应当被立刻递交嘛?或者系统应该等待一会以尝试一次递交多条消息?排队标准
– 何时消息被认为是 “已排队的”?当一个队列持有它的时候?或者当它至少被转发到一个远程队列中?或者被转发到所有队列中?接收通知
– 发布者可能需要知道何时一些或所有的订阅者已经接收到该消息。