目录

  • 前言
  • 一、MSMQ是什么?
  • 二、安装步骤
    • 1.Windows系统
    • 2.Windows Server系统
  • 三、使用步骤
    • 1.引入库
    • 2.封装读写消息类
    • 3.发送业务消息数据到队列
    • 4.接收队列中的业务消息数据并处理
  • 总结

前言

提示:大并发请求队列处理及实时聊天消息也可参考本文自行实现

随着大数据的不断发展,我们实际开发的项目也开始逐渐接触到大数据大并发造成的一些问题,由于近期项目需求要满足2000并发量,经过压测发现原项目中编写的正常逻辑读写程序很卡顿,服务器环境Windows Server 2019 32G16核,响应时间需要1-2分钟,造成程序无法正常使用;为解决这一问题,我研究了各种消息队列中间件及缓存队列,Redis、MSMQ、RabbitMQ等,最终选择了微软Windows系统自带的组件“消息队列”(以下简称:MSMQ)快速解决了此问题,本文主要讲述MSMQ的简单应用。

注意:MSMQ只支持Windows操作系统,其他操作系统暂不支持!!!


一、MSMQ是什么?

MicroSoft Message Queuing(微软消息队列)是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的任一位置。它的实现原理是:消息的发送者把自己想要发送的信息放入一个容器中(我们称之为Message),然后把它保存至一个系统公用空间的消息队列(Message Queue)中;本地或者是异地的消息接收程序再从该队列中取出发给它的消息进行处理。详细描述请参考此链接

二、安装步骤

1.Windows系统

1)首先找到:开始》控制面板》程序》程序和功能》启用或关闭Windows功能。点击打开,如下图:

2)勾选好下图圈出功能,点击确定安装。

3)安装完成后,可打开计算机管理功能(cmd命令打开方式:compmgmt.msc)查看是否安装成功,安装成功则如下图出现“消息队列”栏,也可在系统服务(cmd命令打开方式:services.msc)中查看是否有名称为“消息队列(Message Queuing)”服务正在运行。

2.Windows Server系统

1)首先打开:服务器管理器,找到 管理》添加角色和功能》功能》消息队列,全选“消息队列”下所有功能,“下一页”》“安装”,如下图:


2)安装完成后,可打开计算机管理功能(cmd命令打开方式:compmgmt.msc)查看是否安装成功,安装成功则如下图出现“消息队列”栏,也可在系统服务(cmd命令打开方式:services.msc)中查看是否有名称为“Message Queuing(消息队列)”服务正在运行(同上面Windows操作方式)。

三、使用步骤

1.引入库

首先新建类“MessageHandle”,搜索并引用系统dll程序集:System.Messaging,如下图:

2.封装读写消息类

插入以下封装好的代码到刚建的类“MessageHandle”:

 /// <summary>/// 消息处理类/// </summary>public class MessageHandle{/// <summary>/// 判断队列是否存在/// </summary>/// <param name="name">队列名称</param>public static bool ExistsQueue(string name){if (System.Messaging.MessageQueue.Exists(".\\private$\\" + name))//检查是否已经存在同名的消息队列{return true;}else{return false;}}/// <summary>/// 创建队列/// </summary>/// <param name="name">队列名称</param>public static string CreateNewQueue(string name){if (!ExistsQueue(name))//检查是否已经存在同名的消息队列{System.Messaging.MessageQueue mq = System.Messaging.MessageQueue.Create(".\\private$\\" + name);mq.Label = name;return name + " 创建成功";}else{return "已经存在";}}/// <summary>/// 删除队列/// </summary>/// <param name="name">队列名称</param>public static string DeleteQueue(string name){if (ExistsQueue(name))//检查是否已经存在同名的消息队列{System.Messaging.MessageQueue.Delete(".\\private$\\" + name);return name + " 删除成功";}else{return "不存在,无需删除";}}/// <summary>/// 同步发送消息/// </summary>/// <param name="input">发送的内容</param>/// <param name="queueName">发送到哪个消息队列中</param>public static void SendMsg(string input, string queueName){CreateNewQueue(queueName);//先创建队列,避免无此队列时报错System.Messaging.MessageQueue mq = new System.Messaging.MessageQueue(".\\private$\\" + queueName);System.Messaging.Message message = new System.Messaging.Message();message.Body = input;message.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(string) });mq.Send(message);}/// <summary>/// 同步接收消息/// </summary>/// <param name="queueName">从哪个消息队列读取消息</param>/// <returns>返回读取到的消息内容字符串</returns>public static string ReceiveMsg(string queueName){System.Messaging.MessageQueue mq = new System.Messaging.MessageQueue(".\\private$\\" + queueName);if (mq.GetAllMessages().Length == 0)//判断是否还有消息,如果没有消息的话Receive方法会一直独占进程直到有消息为止,所以必须判断{return null;}else{System.Messaging.Message m = mq.Receive();m.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(string) });return m.Body.ToString();}}}

其他用法及扩展请参考微软官方示例:点击进入 MessageQueue 类

3.发送业务消息数据到队列

1)根据自己业务需求,如果业务有多字段内容时可封装消息内容到实体(如下代码类),后续再把实体对象转换为json字符串发送到队列;如果业务只有一个字段,可直接使用string,无需封装实体。

 /// <summary>/// 消息队列使用的消息内容类(可自行封装其他业务类或直接用字符串)/// </summary>public class MQ_msgdata{/// <summary>/// 用户id/// </summary>public int UserId { get; set; }/// <summary>/// 数据内容/// </summary>public string Msg{ get; set; }}

2)组装消息内容发送到“TestMQ”队列,如下代码:

#region 添加业务请求内容到消息队列异步处理
#region 组装消息内容实体MQ_msgdata mQMsg = new MQ_msgdata();mQMsg.UserId = 1;mQMsg.Msg= "测试消息内容";
#endregionstring mqMsg = Newtonsoft.Json.JsonConvert.SerializeObject(mQMsg);//转json字符串(此处不一定要封装到对象再转json字符串存储,可根据业务需要直接存储字符串内容,如下一行注释代码)//string mqMsg = "测试消息内容";//字符串内容string qname = "TestMQ";//队列名称(可自行定义队列命名规则)MessageHandle.SendMsg(mqMsg, qname);//发送消息(内部已有创建队列逻辑)
#endregion

4.接收队列中的业务消息数据并处理

1)创建一个控制台应用程序(也可是其他定时任务程序,可根据自己业务需求选择),配置好自己业务需要的其他配置,此处就不讲解了(如数据库连接、缓存、公用库等),然后打开Program.cs类。
注意:这个程序要引用之前封装的消息处理类“MessageHandle”,或能调用此类,或直接拷贝此类到这个新建程序里,供使用!

2)拷贝以下代码到Main入口,以接收前面业务程序发送到队列“TestMQ”的消息。
注意:HandleData需要自己根据自己业务需求写自己的业务处理逻辑代码,前面的msg即为业务发送的消息内容字符串,如果是json字符串则需要解析成实体对象。

 //控制台程序入口static void Main(string[] args){Console.WriteLine("消息队列处理已启动");string _qname = "TestMQ";//队列名称(与前面发送消息创建的队列名称要一致)if (!MessageHandle.ExistsQueue(_qname)){//判断队列是否存在Console.WriteLine("开始创建【" + _qname + "】消息队列");MessageHandle.CreateNewQueue(_qname);//创建队列Console.WriteLine("【" + _qname + "】创建完成");}Task.Run(async () =>{Console.WriteLine("【" + _qname + "】开始接收…");while (true){//循环一直接收#region 处理接收数据string msg = MessageHandle.ReceiveMsg(_qname);//获取此队列中的消息if (!string.IsNullOrWhiteSpace(msg)){//空消息过滤Console.WriteLine("【" + _qname + "】在【" + DateTime.Now + "】收到队列消息:{0}", msg);//MQ_msgdata modelmsg = Newtonsoft.Json.JsonConvert.DeserializeObject<MQ_msgdata>(msg);//json字符串解析为实体对象HandleData(_qname, msg);//处理数据(自行解析msg内容根据业务再处理存库等)}#endregion}});Console.Read();}

3)运行上面的控制台程序即可开始实时接收处理前面发送的业务消息了。


总结

注意:消息发送和消息接收是异步的,发送了一条,未接收(消耗)的情况下,消息是一直存在队列中的,直到被接收(消耗)处理。
以上就是今天要讲的内容,本文仅仅简单介绍MSMQ的基本应用,大家可以根据自己的业务需要灵活运用,有不清楚的或不对的可评论留言,看即回!

关于MSMQ(System.Messaging.MessageQueue)安装及在.NET Framework框架下的简单应用实现,以解决大并发请求问题相关推荐

  1. Using System.Messaging引用报错解决办法

    1.在项目的引用上选择"添加引用" 2.在搜索里输主system.messaging,然后在列表中选中此项 3.这时候在代码中加入using System.Messaging就不会 ...

  2. LENOVO System X3650 M5安装Windows server 2008系统(U 盘+DVD的方法)

    LENOVO System X3650 M5安装Windows server 2008系统(U 盘+DVD的方法) 准备工作:一个刻录好SERVER2008的光盘,这里用的是SERVER2008 R2 ...

  3. ADS2020linux版本安装,Advanced Design System (ADS) 2020安装许可授权详细教程(附下载)

    Advanced Design System (ADS) 2020是一款由Keysight最新推出的先进设计系统(ADS),是领先的电子设计自动化软件,适用于射频.微波和信号完整性应用.Advance ...

  4. NSIS(Nullsoft Scriptable Install System)开源安装程序制作软件使用详细步骤(Windows系统下)

    NSIS(Nullsoft Scriptable Install System)开源安装程序制作软件使用详细步骤(Windows系统下)安装包制作 1.软件详情 软件版本 版本说明 翻译跟进 2.教程 ...

  5. ZooKeeper安装及配置(Windows系统下)

    ZooKeeper的定义用一句话就能说清:分布式服务框架 Zookeeper -- 管理分布式环境中的数据.下面从安装开始,对这个框架进行分析. 1.安装 1. 官网下载压缩包并解压到D:\Progr ...

  6. 安装开源在线教育平台edX的一个简单方法

    开放式在线教育平台edX在今年六月份开源,当时按着Google Group中的方法"Clean install on Ubuntu Server 12.04"在一台全新的VPS上安 ...

  7. linux ubuntu安装教程6,64位Ubuntu下安装IE6步骤

    64位Ubuntu下安装IE6步骤 ies4linux下载地址: cabextract下载地址: wine1.0下载地址: cab文件及字体下载地址: simsun.ttc下载地址: adobe fl ...

  8. oracle 安装找不到服务,win7 下安装oracle 11g出现错误: 启动服务出现错误 找不到服务OracleMTSRecoveryService...

    这种错误是在多次安装oracle都没有成功的情况下发生的. 正确安装oracle,是有前提条件的 1,安装最新的jdk,不是jre!!(并配好环境变量,在cmd中测试 java -version与ja ...

  9. python安装库后无法调用摄像头_银川监控摄像头安装,有人在代码里下毒!慎用 pip install 命令...

    原标题:银川监控摄像头安装,有人在代码里下毒!慎用 pip install 命令 大约一年前,Python软件基金会(Python Software Foundation)发了一个需求咨询帖子(RFI ...

最新文章

  1. 《Android传感器开发与智能设备案例实战》——导读
  2. Windows server 2003/2008更改远程桌面端口脚本
  3. OriginPro 2021安装教程(手把手式安装)
  4. 约瑟夫环的数学优化方法
  5. 【C++】error C2275 “XXXX” 将此类型用作表达式非法
  6. 对你的的应用程序进行Debug
  7. element-ui 设置table width %百分比
  8. 论文浅尝 | DeCLUTR: 无监督文本表示的深度对比学习
  9. 小tip: base64:URL背景图片与web页面性能优化(转载)
  10. Android NDK: WARNING: Ignoring unknown import directory:错误解决方法
  11. 【数据结构和算法笔记】:数据结构概述
  12. [C语言] 插入排序之希尔(shell)排序的特性及实现
  13. PTA--03-树2 List Leaves
  14. 滚动条----SCROLLBAR
  15. idea导入java项目步骤_idea导入javaweb项目
  16. js 判断2月份多少天
  17. Elasticsearch系列——(1.1)倒排索引原理
  18. 月薪不过万郑州程序员的真实生活
  19. 安利7个冷门好用的在线工具,每一个都足够惊艳
  20. 汉澳matrix矩阵电脑

热门文章

  1. C/C++编程学习 - 第22周 ⑦ 数字反写
  2. 基于Transformer的多变量风电功率预测TF2
  3. OA系统:实现添加岗位
  4. 微型计算机组成和键盘操作实验心得,微型计算机组成和键盘操作 实验报告.doc...
  5. 活动策划进阶指南:细节决定成败
  6. 小学生算术加法测试c 语言,程序设计方法学课程设计--小学生算术四则运算测试程序(C)...
  7. C++ Primer 学习笔记_62_重载操作符与转换 --调用操作符和函数对象
  8. 存储器金字塔层次结构
  9. 云渲染答疑:动画渲染价格一般多少?
  10. SDHC(高容量SD存储卡)