Message Queue
2016-01-29 14:57
375 查看
消息队列(Message Queue,简称MQ)
从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已。其主要用途:不同进程Process/线程Thread之间通信。为什么会产生消息队列?这个问题问的好,我大概查了一下,没有查到最初产生消息队列的背景,但我猜测可能几个原因:不同进程(process)之间传递消息时,两个进程之间耦合程度过高,改动一个进程,引发必须修改另一个进程,为了隔离这两个进程,在两进程间抽离出一层(一个模块),所有两进程之间传递的消息,都必须通过消息队列来传递,单独修改某一个进程,不会影响另一个;
不同进程(process)之间传递消息时,为了实现标准化,将消息的格式规范化了,并且,某一个进程接受的消息太多,一下子无法处理完,并且也有先后顺序,必须对收到的消息进行排队,因此诞生了事实上的消息队列;
不管到底是什么原因催生了消息队列,总之,上面两个猜测是其实际应用的典型场景。
切合前一部分猜测的消息队列产生背景,其主要解决两个问题:
系统解耦:项目开始时,无法确定最终需求,不同进程间,添加一层,实现解耦,方便今后的扩展。
消息缓存:系统中,不同进程处理消息速度不同,MQ,可以实现不同Process之间的缓冲,即,写入MQ的速度可以尽可能地快,而处理消息的速度可以适当调整(或快、或慢)。
消息队列有如下几个好处,这大都是由其系统解耦和消息缓存两点扩展而来的:
提升系统可靠性:
冗余:Process_B崩溃之后,数据并不会丢失,因为MQ多采用put-get-delete模式,即,仅当确认message被完成处理之后,才从MQ中移除message;
可恢复:MQ实现解耦,部分进程崩溃,不会拖累整个系统瘫痪,例,Process_B崩溃之后,Process_A仍可向MQ中添加message,并等待Process_B恢复;
可伸缩:有较强的峰值处理能力,通常应用会有突发的访问流量上升情况,使用足够的硬件资源时刻待命,空闲时刻较长,资源浪费,而消息队列却能够平滑峰值流量,缓解系统组件的峰值压力;
提升系统可扩展性:
调整模块:由于实现解耦,可以很容易调整,消息入队速率、消息处理速率、增加新的Process;
其他:
单次送达:保证MQ中一个message被处理一次,并且只被处理一次。本质:get获取一个message后,这一message即被预定,同一进程不会再次获取这一message;当且仅当进程处理完这一message后,MQ中会delete这个message。否则,过一段时间后,这一message自动解除被预订状态,进程能够重新预定这个message;
排序保证:即,满足队列的FIFO,先入先出策略;
异步通信:很多场景下,不会立即处理消息,这是,可以在MQ中存储message,并在某一时刻再进行处理;
数据流的阶段性能定位:获取用户某一操作的各个阶段(通过message来标识),捕获不同阶段的耗时,可用于定位系统瓶颈。
消息队列的优点:
异步:现在排队吧,以后再运行它。去耦:将应用程序的逻辑。
韧性:如果它的一部分失败不会记下你的整个应用程序。
冗余:如果他们失败可以重试作业。
担保:可确保作业将被处理。
可扩展性:许多工人可以在队列中处理个别工作。
剖析:可帮助确定性能问题。
消息队列的缺点:
异步:你必须等待,直到作业完成。负载:每个队列中的作业必须等待轮到它,然后才能进行处理。 如果一个作业超支,它影响每个后续的工作。
架构:应用程序需要进行设计时考虑到队列中。
相关文章推荐
- mongo实现消息队列
- C#实现子窗体与父窗体通信方法实例总结
- C#线程间不能调用剪切板的解决方法
- C#线程同步的三类情景分析
- C#获取进程或线程相关信息的方法
- C#停止线程的方法
- C#子线程更新UI控件的方法实例总结
- C#线程队列用法实例分析
- java和c#使用hessian通信的方法
- C++使用CriticalSection实现线程同步实例
- 基于C++实现的线程休眠代码
- win32下进程间通信(共享内存)实例分析
- 进程间通信之深入消息队列的详解
- VB读取线程、句柄及写入内存的API代码实例
- C#网络编程基础之进程和线程详解
- C#通过Semaphore类控制线程队列的方法
- WinForm实现跨进程通信的方法
- C#多线程处理多个队列数据的方法
- C#中使用UDP通信实例
- ASP.NET UserControl 通信的具体实现