Queue(队列),这个词在《数据结构》的课程中出现过,即先进先出的一中数据结构,形象例子就是简单的铁路隧道和排队机;和Queue对应的就是stack(栈),Stack是一种先进后出的数据结构;如果看中文书,还有一个名词用于混,就是heap(堆),这个也很形象,进出是没有顺序的,就像煤堆。
在计算机科学中,Message Queue(MQ),就是按顺序传递消息的一种技术。
MQ一般都做为企业级IT应用的中间件存在,有很多企业是作为标准IT基础结构存在的。在市面上常见的MQ中间件有IBM websphere message queue service,Oracle Advanced Queuing,Microsoft Message Queue(MSMQ),Apache ActiveMQ等,其中apache ActiveMQ是基于apache协议的,和tomcat一样,你可以在项目中免费使用,MSMQ是Windows的组件,默认是不被安装的,可以在“添加/删除组件”中安装MSMQ(不同版本的Windows对应的MSMQ版本是不同的,XP/2003是3.0,Vista是4.0)。
MQ一般都具有这几个属性,
1.异步处理;即接收和发送方可以在不同的线程、进程或机器上,发送成功的同时,也不需要接收方立即接收;
2. 按消息发送的顺序处理消息(这基本就是废话,因为本身就是Queue)
3.事物性的处理发送和接收消息;多个消息的发送和接收可以做在一个事物中,保证同时成功或同时失败;你也可以将MQ操作和数据库操作做在一个事物中,来处理一些特定的场景;
4.保证消息的传递;当消息发送成功时,你就可以确定接收方一定能接收到;MQ会使用某种技术(文件系统、数据库)将消息保存起来;
5.消息的路由;可以按某种规则,将队列中的消息自动的发送到不同的其他队列中;
6.安全;使用多种手段进行权限认证,即程序是否有权限将消息插入到特定的队列中;
7.接收方离线,在使用MQ的集成项目中,允许消息的接收系统离线,MQ会保存接收系统离线时发送系统发送的消息,当接收系统上线时,再发送消息给接收系统进行处理。这样可以使多个系统互相隔离,避免了一个系统崩溃,就造成整个流程都崩溃的情况。当然,我们必须保证MQ服务是在线的,我们可以使用高可靠性应用和负载均衡等技术,缩短MQ服务的离线时间。
8.异常处理的隔离,由于是异步处理,如果接收方发现发送方发送的消息是有错误的,就可以返回一个消息,交发送方处理,此时,发送方可以使用另一个服务来专门处理异常。
9.消息可以是多种形式的;比如二进制,字符串,XML等等,发送时,我们需要将数据变成合适的形式;
此外,基本中每种MQ都有其独特的功能,在使用时可以参考对应的用户手册。
MQ使用的主要场景就是异步处理。下面举几个常见的例子。
长耗时的报表,这个在程序中经常遇见,处理海量数据时,可能生成一个报表需要5分中或是更长的时间,客户不能在线实时等待,报表处理比较耗费资源,不能同时处理很多请求,甚至同时只允许处理一个,这时就可以使用MQ。客户端将报表请求和一些必要的报表条件放到Queue中,报表由另一个服务一个一个的处理,处理好后再给用户发一个消息(MSN消息,或mail等)用户再在浏览器或其他报表浏览器中查看报表。
在线商店,在客户下订单的过程后,系统只需做减库存、记录收货人信息和必要的日志,其他的必须配送处理、交易统计等其他处理可以不同时完成,这时就可以将后续处理消息放入Queue中,让另一台(组)服务器去处理,这样可以加快下订单的过程,提高客户的体验;
应用集成,其实和在线商店的情形差不多,系统A处理完毕后,就发送消息给系统B,此时,系统A并不需要等到系统B的处理结果。比如一个货物可能由多个物流服务提供商合作送到客户那里(工厂到码头用一个物流提供商,海上运输用另一个,到另一个码头后由本地物流商送到客户手中),第一个物流商A发送信息给第二个物流商B,物流商A的系统只要确认物流商B的系统已经接收到消息就可以了,并不需要等待处理结果。
系统间的消息通知,系统A处理完成后,将处理后的数据放到某的地方(网络文件服务器、数据库或其他地方),然后发送一个消息通知系统B,系统B收到消息后开始后续的处理;此时系统B并不需要轮询文件系统或数据,可以提高系统的性能
在Java中处理Message Queue。在java中,主要使用JMS(Java Message Service)来处理MQ。JMS是J2EE的重要组成部分。可以参考http://java.sun.com/products/jms/overview.html 。 在J2EE中定义有Message Driven Bean(消息驱动Bean)来进行接收消息后的处理。
在.NET应用中,可以使用System.Messaging空间来处理MSMQ,对于其他的MQ的使用,需要使用对应中间件的.NET API。apache ActiveMQ的子项目NMS提供了ActiveMQ和MSMQ的统一操作方式。
使用MQ还可以得到一个易测试的好处。原来两个系统互相调用时,调试系统A就需要启动系统B,否则A是无法运行的,如果A和B之间使用了MQ连接,测试A时就不需要启动B了,我们只验证A发送给B的消息是正确的就可以了。
(以上转自:http://www.cnblogs.com/yuanyi_wang/archive/2009/12/30/1636178.html)
另外最近自己在寻找适合的队列,
发现还有淘宝的开源框架metamorphosis 不过这个不可以自定义消息顺序的队列。
分享到:
相关推荐
MessageQueue,又称消息队列,是C#中处理异步通信和解耦组件的重要技术。它允许应用程序之间通过消息传递数据,而无需彼此直接交互。下面将详细介绍C#中的MessageQueue以及如何使用它来发送和接收消息。 1. **...
在Android开发中,Message Queue是一种重要的机制,用于在不同线程间进行异步通信和任务调度。理解并熟练运用Message Queue、Looper和Handler是构建高效、响应性良好的Android应用的关键。 1. **Message Queue...
### Message,MessageQueue,Looper,Handler详解 #### 一、几个关键概念 ##### 1、MessageQueue:消息队列 MessageQueue是一种数据结构,顾名思义,它充当了一个消息队列的角色,用来存放各种消息对象。每一个线程...
在Android系统中,Handler、Looper和MessageQueue是实现线程间通信的核心组件,它们共同构建了一个消息处理机制。本文将深入解析这三者的源码,帮助你理解它们的工作原理,并教你如何手写一套自己的Handler系统。 ...
4. **Looper**:充当MessageQueue和Handler之间的桥梁角色,负责循环取出MessageQueue中的消息,并交给对应的Handler处理。 #### 四、消息处理流程 1. **创建Handler**:每个需要处理消息的线程都需要一个Handler...
【Android 线程间通信:Handler、Looper 和 MessageQueue 深度解析】 在 Android 应用开发中,为了保证界面的流畅性,我们通常需要将耗时操作放在非 UI 线程中执行,然后通过某种机制将结果传递回 UI 线程进行界面...
进程间通信之消息队列 ( message queue ) 消息队列是消息的链表,具有特定的格式,并由消息队列标识符标识. 七种进程间通信方式: 一.无名管道( pipe ) 二.有名管道( fifo ) 三.共享内存 ( shared memory ) 四....
在Android系统中,MessageQueue和Looper是两个非常关键的组件,它们构成了消息处理机制的核心,尤其是在UI线程中。理解并有效地使用它们对于编写高效、响应迅速的Android应用至关重要。 `Looper`是Android中的一个...
MessageQueue queue = new MessageQueue(queuePath); Message msg = new Message(message); queue.Send(msg); } ``` 这里的`queuePath`是队列的路径,例如`".\private$\myQueue"`。`msg`是包含要发送数据的消息...
在Android系统中,线程(Thread)、Looper、Handler、Message以及MessageQueue和MessagePool是实现异步消息处理机制的关键组件,它们共同构建了一个高效的事件驱动模型。这些组件的关系紧密,协同工作,使得Android...
### Message Queue(消息队列)介绍与应用 #### 消息处理中的主要概念 消息队列作为一种关键的技术组件,在分布式系统中发挥着重要的作用。它主要用于处理和传递数据单元(即消息),这些消息可以在简单的文本字符串...
MessageQueue消息服务器** - **核心组件**:处理消息的接收、存储和分发。 **2. 代理** - **作用**:作为客户端与消息服务器之间的中介。 - **功能**:负载均衡、路由、安全认证等。 **3. 连接服务** - **定义**...
在Android系统中,MessageQueue是消息机制的核心组件之一,它与Handler、Looper紧密协作,用于实现线程间的通信。理解MessageQueue的工作原理对于优化应用程序性能和处理异步操作至关重要。 MessageQueue是一个内部...
MessageQueue实战MessageQueue实战MessageQueue实战MessageQueue实战MessageQueue实战MessageQueue实战MessageQueue实战MessageQueue实战MessageQueue实战MessageQueue实战
消息队列(Message Queue)是WMQ中用于存放消息的虚拟存储空间,应用程序可以向队列发送消息(Put)并从队列中接收消息(Get)。在消息队列中,消息按照先进先出(FIFO)的原则进行处理。WebSphere MQ还提供事务处理...
在Windows操作系统中,Message Queue(消息队列,简称MSMQ)是一种可靠的消息传递服务,用于在应用程序之间异步传输数据。这个系统的核心概念是消息,它包含数据和元数据,可以安全地在发送方和接收方之间传递,即使...
在Android操作系统中,MessageQueue是实现线程间通信和异步处理的核心组件。它与Handler、Looper紧密协作,构成了Android消息传递机制的基础。本压缩包文件"android_os_MessageQueue.rar_android"显然关注的是这一...
《JMS与Message Queue技术详解》 在Java世界中,JMS(Java Message Service)是一种标准,用于在分布式环境中提供消息传递服务。它允许应用程序创建、发送、接收和读取消息,有效地支持异步通信模式。JMS的核心概念...