日期:2014-05-19  浏览次数:21085 次

消息队列(MSMQ)到底能起什么样的作用?
最近看了一些MSMQ的资料,感觉很是奇怪,在IIS中装上此服务后,感觉这东西就像一个小数据库一样,暂时保存一些发送过来的数据,然后另一端再去收取?这样有什么用呢?直接在数据库中建立一个表不就直接解决了吗?还可以实现到底发送给哪一个的用户,可是MSMQ就是一个简单的发送与接收,连用户方向都没有,真不知道他为什么存在?或者说在什么样的解决方案中它可以存在?

困惑!困惑!

------解决方案--------------------
它是用来做信息传递的,和数据库可不一样,而且比数据库的性能高多了!
一般它被用来做进程间通讯用!

------解决方案--------------------
petshop4.0里面用到它了,看看可以增加一点感性认识。
数据库也可以实现消息通讯:同意。
MSMQ就是一个简单的发送与接收,连用户方向都没有:用户方向是什么意思?
消费者,生产者?


------解决方案--------------------
Q:最近看了一些MSMQ的资料,感觉很是奇怪,在IIS中装上此服务后,感觉这东西就像一个小数据库一样,暂时保存一些发送过来的数据,然后另一端再去收取?
A:是的。

Q:这样有什么用呢?直接在数据库中建立一个表不就直接解决了吗?
A:你可以在数据库中保存一个对象(类的实例)吗?(当然SQL2005是面向对象的了),比如你有一个customer的类的实例,包含有这个customer的名称、年龄等等,你可以直接把这个实例保存到MSMQ,取出后也是实例,由你的问题可以看出对OOP的概念还不熟悉。为什么要用OOP而不是所有的应用都用数据库呢?这个问题你应该好好想想。

Q:还可以实现到底发送给哪一个的用户,可是MSMQ就是一个简单的发送与接收,连用户方向都没有,真不知道他为什么存在?
A:你可以建立若干不同名称,不同权限的MSMQ,并且有入和出两种队列,为何你说没有方向?

Q:或者说在什么样的解决方案中它可以存在?
A:在基于OOP的B/S或C/S结构中都可以采用其作为数据通讯的方式,尤其是需要长时间等待的异步处理。
------解决方案--------------------
最后一个问题补充下:第一有网络通讯的需求(机器之间的数据交换),第二一定要有Windows系统组成的工作组或域
------解决方案--------------------
如果数据库中断了连接怎么办?数据没有办法上传了!你可以写到本机的队列中等待通讯恢复后上传服务器。比如银行的业务,底下的分行不需要和总行服务器随时连通的,否则......

http://www.microsoft.com/china/windowsserver2003/technologies/msmq/default.mspx
------解决方案--------------------
消息通讯大致有两种方式:
在这里把发送消息的称为producer,接收消息的称为consumer,当然身份不是绝对的。
1. 点对点,producer和consumer都对某个确定队列进行收发操作,producer发送消息时不需要
consumer存在,消息只能由一个consumer读取,即读取后消息从队列中删除。
2. publish-describe,consumer订阅某个主题,当producer针对该主题发送消息后,所有订阅了该主题的consumer都可以收到该消息
这样不会乱套,可以根据实际情况设计通讯方式。
------解决方案--------------------
Q:关键问题是,如果点对点之间的发送消息,如果用socket我可以指定对方用户的IP,port就可以找到对方,但是MSMQ是要手动创建这么一个消息名称(例如.\Private$\名称),或者用程序去create,但是在B/S中程序只有一个,客户端无数个,或者说session会话N多个,大家都来用这个名称接受发送,岂不是乱套了,这就是我所说的用户接收方向(可能我上次表达的不是很清楚)
A: 这个和你的设计有关系,我们不是说所有的程序都需要纪录客户机的ID,你的B/S程序需要纪录客户机的信息吗?你所说的发送和接收是基于物理上的需求,大多数情况和应用有关,比如QQ,MSN,它不管你在哪台机器上发信息,它只纪录当前用户信息,用户收到的信息它可以查询服务器(MSN是这样,QQ有没有做成P2P我没有研究)。再比如一个需要多层审批的办公系统,其中有多个文件等待审批,中间可能还有往复,这种情况我们不需要纪录机器ID,而是纪录这个文件的ID号和状态,不同的消息名称(例如.\Private$\名称)对应不同的状态(比如某某科等待处理文件,某某科正处理文件 etc.,而不是每个用户或计算机建立一个名称),那么查询服务器上的队列就可以知道目前某种状态等待处理的文件有多少。每台客户机的用户只需要根据需求选出队列中的文件进行处理就可以了。当然你从哪台计算机上发出的信息也是可以打包到MSMQ中去的。MSMQ比数据库好就是信息可以保存到本地队列中,连接中断也无所谓,等连上后再从队列中传输到服务器上去。
感觉你的设计思路还不是太宽。
------解决方案--------------------
这是个很有用的东西。
petshop 4.0 中有使用,相信楼主应该使用过亿唐网站查询CET4 6级吧,应为访问的人数太多,所以系统让用户排队。
------解决方案--------------------
用于通信的基础设施,发送端和接收端可以以各自的节奏来处理消息,无需同步
发送端发送后可以立即返回,无需等待消息被处理完,队列缓冲了消息
还有MSMQ可以和IBM MQ互通,这在银行系统很常用

自己建表当然也可以部分实现异步的功能,不过相关的管理,和系统账户绑定的安全,性能;不是那么容易自己搞定的
------解决方案--------------------
MSMQ还是相当有用的。我们这里的软件要保持更改的一致性,当一台机器对列表什么的进行修改了之后,在其他的机器上需要立即显示出有地方修改了,提示用户更新当前机器打开的列表。这些都是用MSMQ来实现的。不过MSMQ的安装有时候会比较麻烦。呵呵。