引言

接下来的文章是讨论有关企业分布式开发的文章,文章筹划了很长时间,文章的技术并不算新,但是文章中使用到的技术都是经过笔者研究实践后总结的,正所谓站在巨人的肩膀上,笔者并不是巨人,但也希望这篇文章能够帮助初涉企业分布式开发的一些童鞋。

文章将会从MessageQueue、Windows Services和WCF着手来讨论企业分布式的开发,MQ是一种消息中间件技术,该篇文章将会详细讨论。Windows Services在分布式开发中同样起着重要的作用,将会在下篇文章中详细讨论,最后是使用MQ、WS并结合WCF做一个分布式的Demo来演示分布式的架构。在敲定写这几篇文章前还有一个重要的内容--ESB(Enterprise Service Bus,企业服务总线),它是传统中间件技术与XML、Web服务等技术结合的产物,也就是集合了MQ和WS为一体的一种框架,但还没有做详细的研究所以这三篇文章就没有包括ESB,等到有充足的时间了然后再去详细的研究吧。

一、 论新技术的学习

在使用到新技术时往往首先需要学习它,然后在项目中应用,这里说到了学习那么就来讨论下技术学习的方法,也是笔者对新技术学习的一种总结。

对于做旧了开发的人员来说在学习新技术时往往会比年轻的开发人员较快,这个问题有没有想过?其实这个问题的答案相当的简单,在学习新技术时对于不同的人都是站在同一个起跑线的,只不过对于有经验的开发人员来说,在使用新技术时学习的并不是它是什么东西,而是学习的如何使用它。这种不同的思想观点就决定了谁会掌握的更快,可以这么理解,开发是一个世界,刚踏入编程界的人来说就像是刚出生的一个婴儿,这时候他们是要去认知这个世界,于是就会问很多问题,诸如:面向对象是什么东西,为什么要这样编写,最后把自己陷入到一个个泥潭中。但是对于经验丰富的开发人员来说,他要认知不是这个世界,在开发中可以说已经是成年人,在学习新技术时就不会问很愚蠢的问题,而是会想这个东西也是面向对象的,那么可以把方法封装到一个基类中,子类继承父类的方法,然后重写来实现多态,所以这时候经验就决定了学习新技术时的快慢。

这就类似于生活中的幼儿和成年人在学习开电动车时的场景,想要幼儿使用电动车就会很困难,因为最简单的脚踏车都没有骑过,你让他学习电动车,这不是作死的节奏吗。但是成年人就不同了,成年人骑脚踏车相当的熟练,在换电动车的时候就会想这个和脚踏车是一样的,而且可以不用每次脚踩,真是好用。这两种思维方式就决定了幼儿在使用电动车时需要几天的事件才能学会,但是成年人刚看到就能够使用。

学习新技术也是类似,新技术也是只是一种新的实现方式,可能给它加上了一个电动的开关,做一个开关然后使用它里面的功能自个儿运行就可以了,实际的内容还是没有改变都是0和1的集合体。

二、MQ

上文讨论了学习的方法,接下来将会进入文章的正题,讨论有关MQ的基本使用方法。首先来对MQ的基本内容进行分类,这里从静态和行为角度将MQ的内容分为两大类,其中的静态角度是指MQ所包含的类别以及在系统消息队列中的类型,行为角度是指MQ在通信方面的类型,具体分类如下图:

MQ是一种通信的机制,因为是一种中间件技术,所以它能够支持多种类型的语言开发,同时也是跨平台的通信机制,也就是说MQ支持将信息转化为XML或者JSon等类型的数据存储到消息队列中,然后可以使用不同的语言来处理消息队列中的消息,这样就很容易的做到了信息的通信,同时也为信息的通信起到了缓冲的作用,经常会在金融项目中使用这种通信机制。

2.1 理论积淀

2.1.1 静态

息队列是和网络相关联的,所以根据网络的不同划分为公共队列、专用队列,其中公共队列是公布到整个网络中,在整个网络中所有站点公开,相对的就是专用队列,专用队列只能由知道队列完整路径名或标签的应用程序访问。另外根据接收消息的操作不同把消息队列划分为管理队列和响应队列,管理队列是指在整个消息线路中所有已经发送和接收的消息;响应队列是指目标程序接收和回应消息。它们在消息队列中的类型,可以使用下图来进行区分。

另外对于系统生成的队列这里不再详细的描述,可以上网查看一些文章。

2.1.2 行为

在行为方面从队列的通信和消息处理两个大的方面把MQ分为两大类,其中MQ的队列通信分为同步和异步两种类型,同步消息是指请求的发送方执行其他任务前,必须等待来自预定接收方的响应,具体等待的时间取决于接收方处理响应的时间。和同步相对应的是异步消息,发送方不会等待接收方的任何回应即可继续其它的操作。

另外在消息队列交互方面,消息的交互同时也有数据完整性、数据一致性、稳定性等类型的,具体分为稳定性、消息优先级、脱机能力、事务性和安全性等。

2.2 MQ 详解

理论部分已经积累的很多了,接下来我们从实际的代码实例中来分析MQ的使用方法,另外在使用MQ前首先应该要安装MQ才可以,这样在本机的服务器上才会有MQ的管理器,做消息处理的时候可以查看消息的具体内容。

2.2.1 MQ安装

打开Control Panel-“Add/Remove Programs” – “Add/Remove Windows Components”步骤安装MSMQ。

MSMQ可以安装为工作组模式或域模式。如果安装程序没有找到一台运行提供目录服务的消息队列的服务器,则只可以安装为工作组模式,此计算机上的“消息队列”只支持创建专用队列和创建与其他运行“消息队列”的计算机的直接连接。

2.2.2 配置MSMQ

打开Computer Management – Message Queuing,在Private Queues下创建MSMQDemo队列

2.2.3 MQ Demo

在.NET中微软对MQ做了封装,把MQ有关的信息封装到了MessageQueue类中,在开发的时候可以直接引用该类,对队列中的消息做操作。

在操作消息前首先要为消息指定存储的队列,所以在创建消息时首先要在服务器上创建一个队列,然后为MessageQueue指定消息队列的路径。具体MQ类的方法和属性如下导图:

MQ类的主要使用方法已经在上面的导图中列出,接下来分析类中的主要方法和属性。

在Method中分为队列管理和消息管理两类方法,其中的队列管理的方法很简单,通过调用方法就能够创建和删除队列。另外就是消息管理的方法,其中的方法分为同步和异步两种类型,可以根据实际的需求来确定使用的类型。

在Property中主要用到的主要是Path和Label属性,其中的Path指定消息的队列地址,Label能设置或获取队列描述信息。

接下来演示发送数据和接收数据代码的编写方法,下面的示例中使用的是私有的队列类型来演示的操作。首先从发送数据开始,在发送数据时首先要创建我们的MQ,然后根据MQ的地址创建相应的队列,调用队列的send方法将数据信息发送到队列中,如下代码:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Linq.Expressions;

using System.Messaging;

using System.Runtime.CompilerServices;

using System.Text;

using System.Threading;

using System.Xml;

using System.Xml.Serialization;

using System.Runtime.Serialization.Formatters.Binary;

namespace MsMQTest

{

class Program

{

static void Main(string[] args)

{

//declare the MQ Path

string ekQ= ".\Private$\EKTestQueue";

//create the MQ if the MQ is not exist

if (!MessageQueue.Exists(ekQ))

MessageQueue.Create(ekQ);

//create a new queue

var queue = new MessageQueue(ekQ);

for (int i = 0; i < 2; i++)

{

//create the model that want to send

Test test=new Test();

test.Name = "fdsfd";

test.Sex = "cvx";

//serialize the model

string str = Program.xmlSerial(test);

//send the model data to queue

queue.Send("Test" + str);

Console.WriteLine("Message sent {0} n--------------", "Test" +str);

}

Console.Read();

// MessageQueue.Delete(ekQ);

}

public static string xmlSerial(T serializeClass)

{

string xmlString = string.Empty;

XmlWriterSettings settings = new XmlWriterSettings();

XmlSerializer serializer = new XmlSerializer(typeof(T));

StringBuilder xmlStringBuilder = new StringBuilder();

using (XmlWriter writer = XmlWriter.Create(xmlStringBuilder))

{

serializer.Serialize(writer, serializeClass);

xmlString = xmlStringBuilder.ToString();

}

return xmlString;

}

}

public class Test

{

public string Name {

get;

set;

}

public string Sex {

get;

set;

}

}

}

对应的生成结果如下图:

运行上面的代码后MQ将会把消息发送到相应的队列中,这里采用的是专有队列所以会将消息发送到本地的队列中,查看消息如下图所示:

运行上面的代码后会把消息发送到相应的消息队列中,这样在消息的发送方和调用方之间就构建了一个相互松耦合的桥梁,它就是消息队列,接下来演示如何接收消息队列。

using System;

using System.Collections.Generic;

using System.Linq;

using System.Messaging;

using System.Text;

using System.Threading;

namespace MsqueueReaderTest

{

class Program

{

static void Main(string[] args)

{

string ekQ = ".\Private$\EKTestQueue";

using (var queue = new MessageQueue(ekQ))

{

queue.Formatter = new XmlMessageFormatter(new Type[] { typeof(String)

}

);

var exist = false;

while (!MessageQueue.Exists(ekQ))

{

Console.WriteLine("No existing queue");

}

exist = true;

while (exist)

{

var m = queue.Receive();

Console.WriteLine("Message Received {0} n--------------",(string)m.Body);

// Thread.Sleep(500);

}

}

}

}

}

运行程序后控制台输出结果:

在上例中我们使用的异步Receive方法,而且该方法会将消息队列中的消息取出并删除,所以在操作完成后消息队列中的消息会为空,所以运行后的队列为下图:

结语

MQ是一种企业服务的消息中间节技术,这种技术常常伴随着企业服务总线相互使用,构成了企业分布式开发的一部分,如果考虑到消息的发送和传送之间是可以相互不联系的并且需要分布式架构,则可以考虑使用MQ做消息的中间价技术,MQ的功能已经足够开发使用。但是对于分布式开发的技术只了解MQ是远远不足够的,因为在系统中往往会实现消息的自动发送和获取,如果想要实现消息队列的自动操作就不得不说说Windows服务了,下文将会对Windows服务做详细的讨论。

Java高级架构狮:专注于Java开发技术的研究与知识分享!

————END————

点赞(感谢)

...

转发(感谢)

...

关注(感谢)

...

阿里消息队列mq服务器,阿里的架构之路——漫谈MQ相关推荐

  1. 阿里云消息队列MQ学习—阿里云大学视频课

    在刷ACE题的过程中,感觉对于消息队列部分的理解不是很深刻,这里来学习一下. 例行还是先走一遍阿里云大学的一些视频课程扫扫盲,选择如下课程: 阿里消息队列MQ简介:阿里巴巴中间件技术部自主研发的专业消 ...

  2. 分布式服务(RPC)+分布式消息队列(MQ)面试题精选

    分布式系统(distributed system)是建立在网络之上的软件系统.正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性.因此,网络和分布式系统之间的区别更多的在于高层软件(特别是操作 ...

  3. 【转载!!】一个用消息队列 的人,不知道为啥用 MQ,这就有点尴尬

    https://www.cnblogs.com/williamjie/p/9481780.html 消息队列 为什么写这篇文章? 博主有两位朋友分别是小A和小B: 小A,工作于传统软件行业(某社保局的 ...

  4. 架构师的 36 项修炼第04讲:架构核心技术之分布式消息队列

    本课时的主题是分布式消息队列,分布式消息队列的知识结构如下图. 本课时主要介绍以下内容. 同步架构和异步架构的区别.异步架构的主要组成部分:消息生产者.消息消费者.分布式消息队列.异步架构的两种主要模 ...

  5. JAVA应用开发MQ实战最佳实践——Series2:消息队列RocketMQ性能测试案例

    简介:JAVA应用开发MQ实战最佳实践--Series2:消息队列RocketMQ性能测试案例 往期内容 JAVA应用开发MQ实战最佳实践--Series1:RocketMQ综述及代码设计 1. 消息 ...

  6. 消息队列专题(架构篇):RabbitMQ 的集群架构模式

    RabbitMQ 的集群架构模式主要有四种,分别是主备模式.远程模式.多活模式和镜像模式,本篇博客将依次介绍这四种架构模式,其中的镜像模式使用范围最广,我们将对其进行重点介绍. 主备模式 主备模式是指 ...

  7. 消息队列面试 - 如何进行消息队列架构设计?

    消息队列面试 - 如何进行消息队列架构设计? 面试题 如果让你写一个消息队列,该如何进行架构设计?说一下你的思路. 面试官心理分析 其实聊到这个问题,一般面试官要考察两块: 你有没有对某一个消息队列做 ...

  8. MQ消息队列中间件:

    MQ消息队列中间件: 微服务间通讯有同步和异步两种方式: 同步通讯:就像打电话,需要实时响应. 异步通讯:就像发信息,不需要马上回复. 同步调用的优点: 时效性较强,可以立即得到结果 同步调用的问题: ...

  9. 几种常见的微服务架构方案简述——ZeroC IceGrid、Spring Cloud、基于消息队列

    微服务架构是当前很热门的一个概念,它不是凭空产生的,是技术发展的必然结果.虽然微服务架构没有公认的技术标准和规范草案,但业界已经有一些很有影响力的开源微服务架构平台,架构师可以根据公司的技术实力并结合 ...

最新文章

  1. Rancher部署Traefik实现微服务的快速发现
  2. 面试官: 讲讲 Spring 事务有哪些坑?
  3. centos ipvsadm 规则保存_从VAR精神到判罚规则:终场哨声后的VAR点球,到底是否合理?...
  4. MYSQL数据库——mysql的数据类型和运算符
  5. docker:Error running DeviceCreate (createSnapDevice) dm_task_run failed
  6. Java 方法使用final 修饰参数的作用
  7. 《南明史》txt版本
  8. python string_Python String center()
  9. Python 里 and、or 的计算规则
  10. 静态成员常量的初始化
  11. 3809. 修改数组——AcWing题库
  12. mybatis-generator自动生成代码(lombok带注释)
  13. 吴恩达机器学习作业2
  14. 安卓系统使用chrome插件(以yandex安装油猴为例)
  15. html5红外遥控,自己写的单片机万能红外遥控解码
  16. mxh缩写英语_mxh的含义,mxh是什么的缩写,mxh的词语,mxh代表的意思
  17. 2021-2027全球与中国教育ERP套件软件市场现状及未来发展趋势
  18. 王倩兮金碧山水作品《绿水青山就是金山银山》
  19. c语言教学方法措施,C语言教学对策
  20. Worktile中的实时消息推送服务实现

热门文章

  1. IBASE read buffer
  2. Webdynpro ALV component usage
  3. PRDICQR and PRD01QR
  4. 我去德国出差后学习的一些德语
  5. 使用Visual Studio Code编写和激活ABAP代码 (上)
  6. SAP 销售云支持的丰富的报表显示类型
  7. 错误消息 This computer doesn‘t have VT-X/AMD-v enabled
  8. 树状数组基础原理与模板
  9. java 高并发_Java 高并发之无锁(CAS)
  10. html class和id,css教程之样式表的基本语法(二) class(类)和id的一个小实例