简介
它是一种异步传输模式,可以在不同的应用之间实现相互通信,相互通信的应用可以分布在同一台机器上,也可以分布于相连的网络空间中的任一位置。
它的实现原理是:消息的发送者把自己想要发送的信息放入一个Message中,然后把它保存至一个系统公用空间的消息队列(Message Queue)中;本地或者是异
地的消息接收程序再从该队列中取出发给它的消息进行处理。如图所示:
优缺点与使用场景
-
优缺点
优点:支持离线通讯;有消息优先级;有保障的消息传递和执行许多业务处理的可靠的防故障机制;息传递机制使得消息通信的双方具有不同的物理平台成为可能。
缺点:很难满足实时交互需求。
-
使用场景
1、数据采集:适合多设备多应用数据采集功能。
2、辅助实时交互:在大并发系统中,某一个操作涉及到很多步骤,某些步骤是不需要及时处理的,将不需要及时处理的步骤提出来,用消息队列处理。
比如:在一个高并发购物网站,一个顾客下单,顾客的操作记录、顾客的余额记录、商品相关的统计记录是不需要及时处理的,这些可以放消息队列处理,
延时处理。
3、多线程流水线处理:可以应用于生产者和消费者模式里面。比如:批量文件解压+解析+入库处理。为了降低服务器压力,将各个步骤分布在不同的
服务器上面,每个步骤的结果可以放入消息队列。
准备工作
-
环境准备
在使用MSMQ开发之前,需要安装消息队列。按顺序操作:控制面板-》程序-》打开或关闭Windows功能,勾选MSMQ服务器所有选项,如图所示:
-
存放位置
在调试、操作队列的时候,插入和取出队列信息以后,需要查看操作是否成功,就得去存放队列的服务器中查看队列信息。操作顺序:计算机-》管理-》
服务和应用程序,在里面有相应队列存储的信息,如图所示:
MSMQ的代码封装
-
基础准备
文件作用:
MSMQ队列操作的属性设置:
/// <summary> /// MSMQ队列操作的属性设置 /// </summary> public class MessageQueueSettings { /// <summary> /// 专用队列的基本路径 /// </summary> private string basePath = "private$"; /// <summary> /// 队列的ID /// </summary> public Guid MessageQueueId { get; set; } /// <summary> /// 队列的标签 /// </summary> public string MessageQueueLabel { get; set; } = "由程序创建的默认消息队列"; /// <summary> /// 访问队列的路径,默认是本机,记做“.” /// </summary> public string RemotePath { get; set; } = "."; /// <summary> /// 队列名称:默认是 msmqdefault /// </summary> public string MessageQueueName { get; set; } = ConfigSource.DefaultMSMQName; /// <summary> /// 队列的路径 /// </summary> public string MessageQueuePath => $"{RemotePath}\\{basePath}\\{MessageQueueName}"; /// <summary> /// 消息队列类型 /// </summary> public QueueType MessageQueueType { get; set; } = QueueType.PrivateQueue; /// <summary> /// 获取或设置队列日志的大小 /// </summary> public long MaximumJournalSize { get; set; } = uint.MaxValue; /// <summary> /// 是否启用日志 /// </summary> public bool UseJournalQueue { get; set; } = true; /// <summary> /// 获取或设置队列的大小 /// </summary> public long MaximumQueueSize { get; set; } = uint.MaxValue; /// <summary> /// 是否启用队列事务 /// </summary> public bool IsUseTransaction { get; set; } = true; /// <summary> /// 队列的访问方式 /// </summary> public QueueAccessMode AccessMode { get; set; } = QueueAccessMode.SendAndReceive; /// <summary> /// 设置/获取是否经过身份验证 /// </summary> public bool Authenticate { get; set; } = false; /// <summary> /// 获取或设置基优先级,“消息队列”使用该基优先级在网络上传送公共队列的消息。 /// </summary> public short BasePriority { get; set; } = 0; }