MSMQ使用

  应用场景:

  典型的生产者-消费者模式, 目前虽已实现,但存在一些问题,准备更换成MSMQ.

  多个生产者(producer)应用从业务平台拉取订单放入队列应用(QueueManager)(自己实现),

  多个消费者(consumer)应用从队列应用中每次取出1笔订单进行处理,处理完成后直接向业务平台返回订单结果.

  业务性质要求实现的细节:

  1. consumer因涉及硬件设备,数量有限,并且每次仅能处理1笔订单,但是要尽量满载运行.

    满载运行意味着QueueManager要有待处理的订单给consumer去处理,当然前提是producer生产力足够强.

  2. consumer优先处理大面值订单,确认没有合适面值订单的情况下,依次类推100元->50元->30元->20元

  3. QueueManager中超过2min中仍未处理的订单要停止处理,并向业务平台返回最终结果.

    因为consumer要优先处理大面值订单,所以小面值订单就存在超时的情况.

  目前运行的实现流程:

  1. 因受限于consumer的消费能力,仅使用了1个producer从业务平台拉取订单放入QueueManager.

  2. QueueManager中按照订单面值声明了4个队列,每个面值对应1个队列,在接收到producer传送的订单后,按照订单面值放入相应的队列.

  3. consumer在处理完订单后向业务平台返回订单结果,并间隔指定时间后,向QueueManager发送请求,表示当前consumser空闲了,可以处理订单了.

  4. QueueManager接收到consumer的请求后,按照面值从大到小遍历4个队列,如取出订单则跳出遍历,把订单异步给consumer.

  5. QueueManager自启动后就开了一个监控订单超时的线程,按照面值从小到大遍历4个队列,如有超时订单,则跳出遍历,把订单结果返回给业务平台.

  存在的问题:

  1. 向业务平台返回订单结果的操作不能集中管控,在交互过程中若网络异常,就会出现不能把订单结果返回发业务平台的情况.

  2. 人工介入在业务平台处理订单情况较多,故QueueManager未做持久化处理,也就是说如果队列应用挂掉,会有一批订单卡住无法处理.

  3. consumer处理完订单向QueueManager请求新订单,然后队列应用异步新订单的处理方式太繁琐.

  最近正在规划更换成MSMQ的方式实现, 如园友看完上述处理流程有比较好的建议, 一定要多多指教.

时间: 2024-08-25 14:57:02

MSMQ使用的相关文章

【转】MSMQ 微软消息队列 简单 示例

MSMQ它的实现原理是:消息的发送者把自己想要发送的信息放入一个容器中(我们称之为Message),然后把它保存至一个系统公用空间的消息队列(Message Queue)中:本地或者是异地的消息接收程序再从该队列中取出发给它的消息进行处理. 我个人的理解,你可以把他当做一种,把数据打包后,发送到一个地方,程序也可以去取到这个打包的程序,队列的机制就不讲了,并发问题荡然无存.呵呵. 上代码: 首先 using System.Messaging; public class MsmqManagerHe

WCF基于MSMQ的事件代理服务

前言 公司目前楼主负责的项目正在改版升级,对之前的服务也在作调整,项目里有个操作日志的模块,就决定把日志单独提取出来,做个日志服务,所以就有了这篇文章 正文 MSMQ作为消息队列,B/S项目调用日志服务,日志服务往消息队列发送消息,事件代理服务负责处理消息队列的消息,贴下核心代码 事件代理服务契约 using System; using System.Collections.Generic; using System.Linq; using System.ServiceModel; using

微软消息队列MSMQ 传输异常的总结!

公司线上环境99%是esxi的虚拟环境,随着公司线上虚拟机的增加,在部署虚拟机时我们一般都是采用模板才统一部署,当一个模板建立好后,新建虚拟机时就默认采用该模版运行,没有加入用户自定义环节. 由于公司为软件型企业且百分之九十采用的是微软的.net开发用户平台,由于平台的特殊性需要和多方面机构进行数据交换工作,根据开发的环境特点,选用的是微软系统自带的消息队列MSMQ进行数据传输, 随着msmq服务器越来越多的上线,而且会多台服务器往一台服务器上发送消息,最近频繁的发现一个问题,服务器服务正常,各

C#-MSMQ安装及配置

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 <system.serviceModel>     <behaviors>         <serviceBehaviors>             <behavior name="">                 <ser

MSMQ小Demo

Demo基于http://www.cnblogs.com/zhili/p/MSMQ.html Server代码: using System.Messaging; using System.Text; using System.Threading.Tasks; namespace MSMQServer { class Program { static void Main(string[] args) { const string messageQueuePath = @".\Private$\My

NET中MSMQ的使用----附例子

目录 一:MSMQ的一些理论上的知识 二:队列类型(Queue Type) 三:安装消息队列 四:在C#中Messagequeue class 五:MSMQ-发送消息到远程专用队列 六:例子 一.在学习Messagequeue 类之前,首先介绍一下MSMQ的一些理论上的知识          MSMQ(MicroSoft Message Queue,微软消息队列)官方的解释是:在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的

C#关于MSMQ通过HTTP远程发送专有队列消息的问题

两台计算机的操作系统都是Windows Server 2008两台计算机都安装了MSMQ+Http支持两台计算机的防火墙全部关闭本地Ip:192.168.1.104远程Ip:192.168.1.142远程建立专有队列:Test本地发送消息的代码:System.Messaging.MessageQueue mq =    new System.Messaging.MessageQueue ("FormatName:Direct=http://192.168.1.142/msmq/Private$/

ASP.NET中进行消息处理(MSMQ) 二

在我上一篇文章<ASP.NET中进行消息处理(MSMQ)一>里对MSMQ做了个通俗的介绍,最后以发送普通文本消息和复杂的对象消息为例介绍了消息队列的使用. 本文在此基础上继续介绍MSMQ的相关知识点,最后还是通过一个示例程序来分析MSMQ在实际项目开发中的应用. 建议:如果你对MSMQ不够了解,在你阅读本文前请先阅读第一部分:<ASP.NET中进行消息处理(MSMQ)一>. 一.消息传递的优先级      在MSMQ中消息在队列里传输是分有优先级的,这里我就以实例的形式介绍下关于优

ASP.NET中进行消息处理(MSMQ) 一

MSMQ是微软消息队列的英文缩写.那么什么是消息队列?这些介绍网上一大片这里就不多说了.本文对于大虾级的人物来说这只是小玩意而已,对于初学者来说这文章还是有一定的帮助,希望路过的大虾们别笑话我班门弄斧. 一.MSMQ介绍和安装消息队列      关于MSMQ详细的介绍请大家向http://www.baidu.com/或http://www.g.cn/等专家咨询.      使用消息队列的优点:稳定.消息优先级.脱机能力以及安全性.      消息队列分为用户创建的队列(专用队列)和系统队列,用户

ASP.NET中进行消息处理(MSMQ) 三

在本文的前两篇文章里对MSMQ的相关知识点进行了介绍,很多阅读过这前两篇文章的朋友都曾问到过这样一些问题:  1.如何把MSMQ应用到实际的项目中去呢?  2.可不可以介绍一个实际的应用实例?  3....... 在前两篇文章里,关于MSMQ常用的技术点基本介绍完毕了,本文主要以MS开源项目PetShop中的MSMQ应用作为案例来介绍MSMQ在实际项目中的应用.在PetShop里,由于系统使用了多线程的专用应用程序来监控消息队列,在进入PetShop应用分析前,我们先来了解下关于多线程和MSMQ