Message Queuing(收藏转帖http://www.rainsts.net/article.asp?id=418)

来源:互联网 发布:湖南软件评测中心学费 编辑:程序博客网 时间:2024/05/16 05:15
消息队列(MSMQ) 作为一种系统服务,为我们提供了非常好的分布操作机制。但不知道什么原因,我很少看到有使用该技术的项目。MSMQ 究竟有什么好处呢?
  • 脱机操作:发送或者接收方可以使用消息队列作为局部或全局缓存,在另一方脱机的情况下发送或接受数据。这个应用在分布体系中很重要,可以避免某应用服务器当机造成整个业务系统瘫痪,由于数据被存储在队列中,瘫痪的服务器重启依然可以继续业务处理,也避免数据丢失造成的业务空洞。举个例子,在电子商务系统中,我们将创建订单和处理订单用消息队列连接起来,一来可以避免处理订单时间过长造成的等待,二来也不会因为处理订单系统故障而造成客户无法下达订单。
  • 分解耦合:在项目的第一个版本开发中,我们往往会将多个逻辑或应用放到一起。随着业务的增长,我们不得不将这些逻辑分离成多个应用服务器(AppServer),来达到性能重构的目的。使用消息队列作为分解耦合的手段有个好处就是,被分解的应用无需关心其关联应用是被部署到本机还是其他服务器上。
  • 应用隔离:我们只所以使用 ORM/DAO 一个很重要的原因就是数据库无关性,便于在不同类型的存储服务器间迁移。使用消息队列隔离应用,每个应用都无需知道其他应用的位置和细节,彼此之间也不存在引用和依赖关系。在约定数据对象类型后,每个应用都可以独自变化和升级。
  • 多播应用:MSMQ 3.0 提供的这个功能,让我们开发可插入的分布应用时,可以不再使用单向的链式处理结构。将消息同时广播给不同的应用,很大程度上提高了处理性能,每个应用服务器都可以第一时间处理消息,无需等待任何其他应用完成。

这只是我个人对消息队列的一点浅显理解,有关其更详细信息,可以参考 MSDN。  

 

 

 

.net+msmq快速访问数据库

  发布时间:2003.02.14 10:09     来源:赛迪网    作者:张悦

msmq是微软消息队列的英文缩写。那么什么是消息队列?消息队列是 Windows 2000(nt也有msmq,win95/98/me/xp不含消息队列服务但是支持客户端的运行)操作系统中通讯的基础,也是用于创建分布式、松散连接通讯应用程序的开发工具。这些应用程序可以通过不同种类的网络进行通讯,也可以与脱机的计算机通讯。消息队列分为用户创建的队列和系统队列,用户队列分为:

· “公共队列”在整个可传递消息的“消息队列”网络中复制并传输,并且有可能由网络连接的所有站点访问。

· “专用队列”不在整个网络中发布。相反,它们仅在所驻留的本地计算机上可用。专用队列只能由知道队列的完整路径名或标签的应用程序访问。

· “管理队列”包含确认在给定“消息队列”网络中发送的消息回执的消息。指定希望 MessageQueue 组件使用的管理队列。

· “响应队列”包含目标应用程序接收到消息时返回给发送应用程序的响应消息。指定希望 MessageQueue 组件使用的响应队列。

系统队列分为:

· “日记队列”可选地存储发送消息的副本和从队列中移除的消息副本。

· “死信队列”存储无法传递或已过期的消息的副本。

· “专用系统队列”是一系列存储系统执行消息处理操作所需的管理和通知消息的专用队列。

现在大家对消息队列有了简单的了解后,就要使用msmq进行软件开发需要安装msmq。安装完后就该进入实际的开发阶段。先打开vs.net ide中的“服务起资源管理器”展开你想建立消息队列的计算机名,再展开“消息队列”,右击它,在弹出菜单中选择“新建”建立一个新的消息队列,并为它指定一个名字,这个名字可以随意。也可以通过编程来完成,代码如下:

system.Messaging.MessageQueue.Create("./Private$/MyPrivateQueue")'建立专用队列System.Messaging.MessageQueue.Create("myMachine/MyQueue")'建立公共队列

其实我认为使用哪种方法并不重要,重要的是搞清楚专用队列和公共队列的差别(其他队列不是必须的)。在本例中是通过“服务器资源管理器”分别在服务器上建立了专用队列和公共队列。

程序功能:本程序分为两部分,包括服务器程序(安装在sql server服务器上)和客户端程序。客户端的作用是用来编写t-sql语句并将t-sql语句放在消息中,并将消息发送到sql server服务器上的消息队列中去。服务器程序检查指定的消息队列当发现有新消息到达时,就开始执行消息中的内容,由于消息中的内容是t-sql语句所以服务器端实际上是执行对数据库的操作。

客户端程序:

public Sub client()        Dim tM As New System.Messaging.MessageQueue()        tM.Path = "./Private$/jk" '"FORMATNAME:PUBLIC=3d3dc813-c555-4fd3-8ce0-79d5b45e0d75"'与指定计算机中的消息队列建立连接,        Dim newMessage As New System.Messaging.Message(TextBox1.Text)'接受文本筐的t-sql语句        newMessage.Label = "This is the label"'消息名字,        tM.Send(newMessage)'发送消息    End Sub

服务端程序:

public Sub server()        Dim NewQueue As New System.Messaging.MessageQueue("./Private$/jk")'"FORMATNAME:PUBLIC=3d3dc813-c555-4fd3-8ce0-79d5b45e0d75"'与指定计算机中的消息队列建立连接,        Dim m As System.Messaging.Message'查看消息队列中的消息        m = NewQueue.Receive         m.Formatter = New System.Messaging.XmlMessageFormatter(New String() {"System.String,mscorlib"})        Dim st As String        st = m.Body'消息队列中消息的消息内容。既sql语句        Dim con As New OleDb.OleDbConnection("输入自己的数据库连接字符串")        con.Open()        Dim com As New OleDb.OleDbCommand(st, con)'执行消息中的sql语句        com.ExecuteNonQuery()        con.Close()End Sub

我为什么要使用消息队列来处理数据库的操作?这个问题我一直没回答,现在我就来回答这个问题。在本程序中你会发现在sub client()中我并没连接数据库和请求数据,而是通过发消息来操作数据库的,这个好处是节省了两部分时间:一是对数据库连解请求数据的时间,二是从数据库返回数据的时间。在很多情况下其实我们并不需要看见具体的数据就知道该怎么修改数据库中的数据。例如要删除张三的记录,就可以将一条简单的删除语句放入消息中,发给服务器让服务器程序去处理对数据的更改。

此外消息队列的另一个主要用途也是当前erp软件中必不可少的,就是在断开连接时保存信息,当连接恢复时发送消息。消息在如下两种情况中无法迅速地传递到它们的队列:当队列驻留的计算机无法工作时,或当路由消息所需的域控制器无法工作时。“消息队列”可让您应对这些情况,使得在从网络上断开连接或必要的计算机或控制器无法工作时,仍可以继续发送消息。在这些情形下,消息暂时存储在本地计算机或传递路由上的某个计算机的队列中,直到完成传递所需的资源重新联机。

例如,假设有一个记录所有在出差的销售人员发送的订单的中央队列。这些销售人员每天的大部分时间都以断开连接的方式工作,记录来自客户站点的订单信息,并且每天拨号连接一次,将所有这些信息传输到中央队列中。因为消息在发送方断开连接时仍可发送到队列,所以销售人员可以在记录客户信息时立即发送他们的消息,但系统会缓存这些消息直到晚间进行拨号连接为止。

在断开连接时要怎么保存消息呢?向断开连接的队列发送消息同向可用队列发送消息的过程几乎完全相同。当要向其发送的队列不可用时,不必进行任何特殊的配置以使组件将消息存储在临时队列中。在client代码的tM.Path = "./Private$/jk"后面有一条注释语句,其实这条语句就是实现向断开连接的队列发送消息的功能。只要将tM.Path = "./Private$/jk"这条语句换成tM.Path = "FORMATNAME:PUBLIC=3d3dc813-c555-4fd3-8ce0-79d5b45e0d75"其中PUBLIC后面的数字是要发送到计算机的guid数字。这个数字可以打开那台计算机的消息队列的属性看见。使用这种方法就可以在断开连接的情况下保证对服务器的操作是有效。现在运行这个程序后,打开Windows2000中的"开始"-》"程序"-》"管理工具"-》"计算机管理"。在"计算机管理"窗口中展开"服务和应用程序"-》"消息队列"-》"传出队列",你将在右边的窗口中看见你建立的消息。(如果你使用tM.Path = "./Private$/jk"语句,在"计算机管理"窗口中展开"服务和应用程序"-》"消息队列"-》"专用队列"可以看见你建立的队列。)

其实消息队列的编程并不复杂,但它在网络环境的程序开发中是非常有用的,可以简化大量的开发过程和节省开发时间。而且消息队列的编程有很大的灵活性,几乎可以解决网络编程的大部分问题。比如聊天程序,远程控制程序。

本文针对消息队列做了一个简单的介绍,并举了一个例来说明怎么在.net下使用消息编程,达到快速高效稳定的对数据库进行操作。最后补充要说的是在internet中也一样可以使用消息队列,只需要将tM.Path = "FORMATNAME:PUBLIC=3d3dc813-c555-4fd3-8ce0-79d5b45e0d75语句后面的数字变成消息队列所在服务器的数字就可以了。但是要提醒大家的是使用消息在传输时将占有大量的带宽,所以在不是必须的时候,internet下的编程不要使用消息。

在vb.net、win2000 、sql server 2000下通过。

原创粉丝点击