如何安装和使用Beanstalkd工作队列,NET版完整的消

2019-10-18 13:58 来源:未知

什么样设置和使用Beanstalkd职业行列(1)

介绍

一毫不苟地公布每一成分的任务安插应用程序栈带来比非常多益处,包涵轻巧的会诊难题时发出,规模迅猛的力量,以致更清晰的管住范围涉及的机件。

在当今世界web服务的工程,一个第一的零部件达成上述场景涉及使用音讯队列和职业(或任务)。这么些平日是弹性和灵活的应用程序很轻易达成和装置。他们是体贴入妙的分崩离析的不等部分之间的职业逻辑应用程序包时生产。

在这里篇小说中,大家的应用程序品级类别通讯建设方案,大家将看看Beanstalkd成立这么些局地的离别。

什么是Beanstalkd

Beanstalkd首先是缓和了一个风靡的web应用程序的须求(Twitter(TWT普拉多.US)上的原因)。近些日子,那是二个相对可信,易于安装的音讯传递服务,是健全的初步和利用。

如前所述,Beanstalkd的首要用例是治本分歧部分和工友之间的职业流应用程序的配置通过职业行列和音讯货仓,类似于此外受款待的缓慢解决方案,比方RabbitMQ。然则,创设Beanstalkd使它有别于别的工作。

自创立以来,与其余技术方案,Beanstalkd目的在于成为三个做事行列,实际不是一把雨伞工具来满意众多要求。为了落到实处这一目标,它看作一种轻量级的、神速有效的应用程序基于C编制程序语言。精益建筑还允许它是安装和应用很简单,使它相符大好多用例。

Features(特性)

可以预知监察和控制职业回来ID,在创制重临,只有三个的风味使它有别于其余的Beanstalkd。提供一些别样有意思的成效是:

1.长久性—>Beanstalkd运转使用内部存款和储蓄器,但也提供了长久性扶持。

2.优先级—>与大大多采摘同样,Beanstalkd提供了分裂的任务的刚开始阶段级来管理迫切工作时要求。

3.布满 —->分裂的服务器实例能够遍布类似于Memcached是何等专门的工作的。

4.蒙蔽 —-> 有希望由此蒙蔽它Infiniti制期限延迟的作业(即职责)。

5.第三方工具—>Beanstalkd附带各类第三方工具蕴含总计超越指标和依赖web的田间管控台。

6.逾期 —->专门的工作得以设置为过期,auto-queue之后(TT普拉多 – Time To Run).

Beanstalkd使用案例

一对范例的Banstalkd用例:

允许web服务器快捷响应央浼,实际不是被迫现场曾推高程序实施

在钦定的小时间距施行某个工作(即爬行web)

分发到多个专门的学业人士实行处理

让离线顾客端(比方叁个断开连接的客户)获取数据在稍后的年华,并非让它恒久失去了通过二个工人

引进完全异步成效的后端系统

预约和预先职责

应用程序负载不相同职员和工人之间保持平衡

相当大地进步应用程序的可信赖性和正常运维时刻

拍卖CPU密集型专门的学业(录像、图片等)

发送电子邮件到您的列表和越来越多。

Beanstalkd元素

就像是大多数应用程序,Beanstalkd附带本人的术语来讲解它的一些。

Tubes / Queues

Beanstalkd管翻译从任何消息传递应用程序队列。他们是由此专业(或音信)转移到买主(即工人)。

Jobs / Messages

是因为Beanstalkd是二个办事行列,通过管称为转移工作是怎么着——类似于所发送的音信。

Producers / Senders

生产商,类似于高端新闻队列左券的概念,是应用程序创设和出殡和下葬职业(或消息)。他们正在选拔的费用者。

Consumers / Receivers

接收器是例外的应用程序的货仓从管找份专门的学业,由生产者举办管理。

在Ubuntu 13安装Beanstalkd

能够很简短获得Beanstalkd通过包管理器才具和起始。可是,在多少个指令,您还足以从源下载并设置它。

专一:大家将进行安装和进行行动列在此边的自成一家和新制造的液滴由于各类原因。假若你是前赴后继服务顾客,恐怕会修改您的系统,不要打破任何专门的学问和不运营在标题,刚烈提议您试着在叁个新类别上面包车型大巴表达。

使用aptitude安装:

下载并设置Beanstalkd运维以下命令:

aptitude install -y beanstalkd 

编写私下认可配置文件让随着系统运转

vim /etc/default/beanstalkd 

开发文件后,向下滚动并找到尾巴部分线#开班= yes。将其改动为:

START=yes 

上面介绍源码安装

咱俩须要从源代码安装进程的叁个关键工具- Git。

运营以下获取Git在您系统上:

aptitude install -y git 

下载要求的开垦工具软件包:

aptitude install -y build-essential 

使用Git克隆(下载)官方库:

git clone https://github.com/kr/beanstalkd 

进去到下载目录:

cd beanstalkd 

从源代码构建应用程序:

make 

安装:

make install 

再介绍一下centos下源码安装:

下载地址:   wget   http://cloud.github.com/downloads/kr/beanstalkd/beanstalkd-1.4.6.tar.gz   解压:   tar xzf beanstalkd-1.4.6.tar.gz   cd beanstalkd-1.4.6   /configure  make   make install   默认安装路径 :/usr/local/bin/   查看版本:   /usr/local/bin/beanstalkd -v   1.4.6 

图片 1


) 介绍 翼翼小心地公布每一成分的任务铺排应用程序栈带来多数平价,包罗轻松的会诊难点时发出,规模迅...

在一个巨型的分布式系统中,新闻队列是不行缺点和失误的中间件,能很好的缓和异步新闻、应用解耦、均衡并发等主题材料。在.net中,有的时候开掘一个功效不错、安全可相信、功能齐全的音信组件,忍不住翻译过来,供我们快捷预览。

注:原来的书文者用windows服务运转新闻队列服务,可是小编在win10上测量试验出错,可自动改成调节台运行音讯队列服务,然后用第三方工具注册服务(如:SrvanyUI)

原文:

 

正文: 


 三个新的、独立的、开源的,完全基于C#和.NET Framework3.5的新闻队列系统

下载源代码 - 1.28 MB

下载二进制文件 - 933 KB

下载例子 - 534 KB

小说概况

  • 介绍
  • 哪些是音讯传递?
  • 什么是DotNetMQ?
  • 怎么要二个新的音信代理?
    • 音讯代理的须要性
    • 现成的信息代理
  • 安装、运行DotNetMQ
  • 第一个DotNetMQ程序
    • 注册应用程序到DotNetMQ
    • 开发Application1
    • 开发Application2
    • 音讯属性:传送准绳(Transmit Rule)
    • 客商端属性:通信方式(CommunicationWay)
    • 顾客端属性:出错开上下班时间再也连接服务器(ReConnectServerOnError)
    • 客户端属性:自动确认新闻(AutoAcknowledgeMessages)
  • 配置DotNetMQ
    • 服务端
    • 应用程序
    • 路由/负载均衡
    • 别的设置
  • 网络传输信息
    • 八个轻便易行的应用程序
    • 多少个切实地工作的案例:布满式短信管理器(Distributed SMS Processor)
  • 恳请/应答式通讯
  • 面向服务架构的DotNetMQ
    • 轻松易行应用程序:短息/邮件发送器
      • 服务端
      • 客户端
    • Web服务支撑
  • DotNetMQ性能
  • 历史
  • 引用

介绍

在这里篇小说中,作者将介绍五个新的、独立的、开源的,完全基于C#和.NET Framework3.5的音信队列系统,DotNetMQ是三个新闻代理,它包涵确定保证传输,路由,负载均衡,服务器图等等多项职能。作者将从解释音信的定义和新闻代理的要求性讲起,然后,笔者会表明如何是DotNetMQ,以至怎么样选取它。

何以是音信传递

音讯传递是一种异步通讯措施,具体正是在同三个或区别的机器上运转的八个应用程序之间可相信的音讯传递。应用程序通过发送一种叫音讯的数据包和此外应用程序通讯。

八个消息能够是叁个字符串,四个字节数组,叁个对象等等。经常状态下,叁个发送者(生产者)程序创立多个音讯,并将其推送到多个音讯队列,然后三个接受者(消费者)次第从队列中获得这一个新闻并管理它。发送程序和经受程序无需同期运行,因为音信传递是三个异步进度。那正是所谓的松耦合通信。

单向,Web服务方法调用(远程方法调用)是一种紧耦合手拉手通讯(那四个应用程序在总体通讯的进度中都亟须是运作着还要可用,要是Web服务脱机或在措施调用时期发生错误,那么客商端应用程序将赢得两个十一分)。

图片 2

图 - 1:三个应用程序间最简便的新闻传递。

在上海体育场面中,五个应用程序通过消息队列举办松散耦合方式通讯。假使接受者管理新闻的进度慢于发送者爆发音讯的速度,那么队列里的新闻数就能够追加。其他,在发送者发送新闻的进度中,接受者只怕是离线的。在此种景色下,当接收者上线后,它会从队列中赢得新闻(当它开头并参加那几个队列时)。

消息队列平时由消息代理提供。音信代理是八个单身的应用程序(七个劳务),别的应用程序通过连日它发送、接收消息。在音信被接收者接收此前,新闻代理担当积存音信。消息代理能够透过路由多台机器把音信传送给目的应用程序,在消息被接收者精确管理以前,新闻代理会一向尝试传送它。不时候音信代理也被称为面向音信的中间件(Message-Oriented-Middleware MOM)可能容易的叫新闻队列(Message Queue MQ).

什么是DotNetMQ?

DotNetMQ是三个开源的消息代理,它有以下几天本性:

  • 坚韧不拔和非持久的新闻发送。
  • 纵使在系统崩溃时,也会保险长久音讯的传递。
  • 可在叁个机器图里活动和手动设置消息的路由。
  • 扶植各类数据库(MS SQL Server,MySQL,SQLite,和部分存活的依赖内部存款和储蓄器的存款和储蓄)
  • 支撑不存储,直接发送即时新闻。
  • 帮衬诉求/应答式的音讯。
  • 用客户端类库和DotNetMQ新闻代理通讯很方便
  • 停放的框架,能够轻巧地在音信队列上构建RMI服务。
  • 支撑把新闻传送给ASP.NET Web服务。
  • 借助图形分界面包车型地铁管理和督察工具。
  • 轻巧安装,管理和使用。
  • 完全由C#开发(使用.NET Framework 3.5)。

在开班创办它的时候,作者更爱好叫它为MDS(音信传送系统 Message Delivery System)。因为它不光是三个新闻队列,并且照旧多个从来传送消息到应用程序的种类和三个提供了创立应用服务框架的境况。笔者把它叫做DotNetMQ,是因为它完全由.NET开垦,何况以此名字也更加好记。所以它原来的名字是MDS,以致于源码里有无数以MDS为前缀的类。

干什么要一个新的新闻代理?

新闻代理的须要性

第一,作者将演示贰个索要消息代理的归纳情状。

在自个儿的事体经历中,作者看齐过部分特不佳且不平凡的异步集团应用集成技术方案。常常是运转在一台服务器上的一个程序推行一些任务,并且产生部分数量,然后将结果数据发送到另一台服务器上的另一个主次。第一个应用在数量上实行另外职分或计算结果(那台服务器在同等网络中或然通过网络连接)。其他,新闻数据务必是原原本本的。即便长途程序尚未专门的学问或互联网不可用,音讯必得第一时间发送过去。

让大家来探视上面包车型大巴安顿图:

图片 3

图 - 2:一个不佳的集成应用程序施工方案。

Application -1 和Application -2是可实行程序(或是Windows服务),Sender Service是二个Windows服务。Application -1试行一些职务,发生多少,并调用Server-B服务器上的Remote Web Service方法来传输数据。那几个web服务将数据插入到数据表。Application -2定时检查数据表来得到新的数据行并管理它们(然后从表中删除它们,或将其标识为已处理,防止管理重复数据)。

如若在调用Web服务时或Web服务管理数量时出错,数据不能够错失,何况稍后必得重发。然而,Application -1有任何职务要做,所以它不可能一遍又壹回的品尝重发数据。它只是将数据插入到数据表。另贰个Windows服务(要是Application -1是间接运行的,也得以使里的多少个线程)定期检查这么些表,并尝试将数据发送到Web服务,直到数据成功发送。

以此实施方案的确是保险的(新闻确定保障传送了),但它不是多个应用程序之间通讯的卓有成效方法。该技术方案有一点丰盛首要的主题素材:

  • 急需非常长的支出时间(去编码)。
  • 要定制具备的消息类型(或远程方法调用),对于一个新的Web服务措施调用,你必得更动全部的服务、应用程序和数据表。
  • 对每贰个平日的劳务,必得开销繁多同样的软件和结构(或复制,然后修改)。
  • 编码后要求对服务、程序、数据库做太多的测量试验和维护。
  • 一些程序和劳务在尚未新新闻的时候,如故会定时检查数据库(要是数据库没有很好的目录和优化,那可能会严重消耗系统财富)。

当今用音讯代理来做这全部的政工,用最低价的方法担任将音信传送给长途应用。同一应用程序集成用上DotNetMQ展现于下图。

图片 4

图 - 3:使用DotNetMQ的简便新闻传递。

DotNetMQ是三个独门的Windows服务,分别运维在Server-A和Server-B服务器上。因而,你只需编写代码和DotNetMQ通讯。使用DotNetMQ客商端类库,和DotNetMQ服务发送、接收新闻是特别轻便和高效的。Application -1打算新闻,设置指标,并将音信传递给DotNetMQ代理。DotNetMQ代理将以最管用和最快的点子传送给Application -2。

现成的信息代理

很刚毅,在合龙应用程序中国国投息代理是有至关重要的。小编网络检索,查找书籍,想找叁个无偿的(最棒也是开源的)况兼是.Net用起来很轻易的新闻代理。让大家看看本身找到了什么样:

  • Apache ActiveMQ():它是开源的,并且完结了JMS(Java Message Service,java消息服务在java世界里是二个正经的音信传输API)。它也是有二个.NET顾客端类库。笔者为着越发精晓,读完了“ActiveMQ in Action”整本书,何况开荒了部分轻巧的施用。即便作者通读了那本书,作者并未有观察三个简约可信的不二法门来创设贰个一齐同盟和路有消息的ActiveMQ服务图。作者也并未有看见怎么样给一个新闻设置目的服务器。它自动路由音讯,但本身无法有效的决定路由的门径。笔者的知道是,它日常和Apache Camel()一同利用来达成大面积的接纳集成形式。Apache Camel也是另三个要求去打听的领域,更糟的是,它只利用Java。最后,作者以为它相当不够精炼易用,非常是安顿,监察和控制和治本。于是作者割舍了对ActiveMQ的钻研。
  • MSMQ():这是缘于微软的概念方案,是.NET应用程序最合适的框架。它很轻巧选拔和读书,并且它有工具看检验队列和音信。它更是适用于那一个运营在同等台机械上,或能够直接连接到同样台机器的应用程序间的异步通讯。但自己力所不比找到三个放权的建设方案,创设三个MSMQ服务器图来路由音讯。因为路由是作者的观点,所以本人只得淘汰掉那一个音讯代理。
  • RabbitMQ():它是由Erlang(有爱立信支付的一种编制程序语言)开垦的。你要求先安装Erlang。小编花了不菲时刻来安装,配置,并写了一个示范程序。它有多个.NET客商端,但当自家计划开拓并运营三个简单的前后相继是,出现众多破绽相当多。很难安装,很难使差别服务器上的三个RabbitMQ协同工作。过了几天,笔者就吐弃了,因为自己以为学习并起先开荒顺序不应有那么难。
  • OpenAMQ(),ZeroMQ():笔者完整切磋了那五个音信代理,但自个儿发掘笔者不可能轻巧做笔者想用.NET想做的事。
  • 其他:作者还开采了一部分其余的门类,但它们缺点和失误一些最首要的效果如路由,悠久消息传递,必要/应答新闻...等。

如您所见,在上头的列表中从未哪三个音讯代理是完全由.NET开采的。

从顾客角度来看,笔者只是想通过“新闻数据,指标服务器和应用程序名称”来牢固本人的代理。别的的自己都不爱慕。他将会基于需求在互联网上反复路由叁个音讯,最后发送到指标服务器的目的程序上。小编的音讯传送系统必得为作者提供这些便利。那是自个儿的落脚点。作者依照这点光景设计了新闻代理的构造。下图展现了自家想要的。

图片 5

图 - 4:自动路由音信的音信代理服务器图。

Application -1 传递多个音讯到地面服务器(Server-A)上的音信代理:

  • 指标服务器:Server-D
  • 对象应用程序:Application -2
  • 新闻数据:应用程序特定的多寡

Server-A未有直接和Server-D连接。由此,音信代理在劳务器间转载新闻(那个音信依次通过Server-A,Server-B,Server-C,Server-D),新闻最终到达Server-D上的新闻代理,然后传递给Application -2。注意在Server-E上也可能有二个Application-2在运作,然而它不会接到那些音信,因为新闻的对象服务器是Server-D。

DotNetMQ提供了这种意义和惠及。它在劳动器图上找到最棒的(最短的)路线把音讯从原服务器转载到对象服务器。

经过这种周到的介绍会,让大家看看假使在施行中使用DotNetMQ。

安装、运行DotNetMQ

于今还尚无完毕活动安装,但是安装DotNetMQ是特别轻松的。下载并解压作品开端提供的二进制文件。只需将所有事物复制到C:Progame FilesDotNetMQ下,然后运营INSTALL_x86.bat(如若你用的是六十几个人系统,那么将试行INSTALL_x64)。

您能够检查Windows服务,看看DotNetMQ是还是不是业已安装并符合规律办事。

第一个DotNetMQ程序

让大家看看实际中的DotNetMQ。为了使第二个程序充分轻松,小编假诺是一样台机械上的四个调整台应用程序(实际上,仿佛大家待会在文章中看出的那多少个,和在两台机械上的八个应用程序是没什么明显差其余,只是要求设置一下音讯的靶子服务器名字而已)。

  • Application1:从顾客输入这里获取四个字符串新闻,并将其发送到Application2.
  • Application2:在调控台上打字与印刷出流传的音信。

登记应用程序到DotNetMQ

咱俩的应用程序为了选取DotNetMQ,要先挂号一下,只需操作二次,是五个特别简单的长河。运维DotNetMQ管理器(DotNETMQ文件夹下的MDSManager.exe,如上所诉,暗中同意是在C:Programe FilesDotNetMQ文本夹下),并在Applications菜单中张开Application类表。点击Add New Appliction按键,输入应用程序名称。

总的看,增多Application1和Application2到DotNetMQ。最后,你的应用程系列表应该像上面这样。

图片 6

图 - 5:DotNetMQ管理工科具的应用程系列表分界面。

开发Application1

在Visual Studio中创建二个名字为Application1的调节台应用程序,并增多MDSCommonLib.dll引用,那一个dll文件里提供了连接到DotNetMQ必得的一些类。然后在Program.cs文件中写上上面的代码:

using System;
using System.Text;
using MDS.Client;

namespace Application1
{
    class Program
    {
        static void Main(string[] args)
        {
            //Create MDSClient object to connect to DotNetMQ
            //Name of this application: Application1
            var mdsClient = new MDSClient("Application1");

            //Connect to DotNetMQ server
            mdsClient.Connect();

            Console.WriteLine("Write a text and press enter to send " + 
               "to Application2. Write 'exit' to stop application.");

            while (true)
            {
                //Get a message from user
                var messageText = Console.ReadLine();
                if (string.IsNullOrEmpty(messageText) || messageText == "exit")
                {
                    break;
                }

                //Create a DotNetMQ Message to send to Application2
                var message = mdsClient.CreateMessage();
                //Set destination application name
                message.DestinationApplicationName = "Application2";
                //Set message data
                message.MessageData = Encoding.UTF8.GetBytes(messageText);

                //Send message
                message.Send();
            }

            //Disconnect from DotNetMQ server
            mdsClient.Disconnect();
        }
    }
}

在创立MDSClient对象时,我们把要连接的应用程序名称传给构造函数,用这一个构造函数,大家将用暗中认可端口(10905)连接本地服务器(127.0.0.1)上的DotNetMQ。重载的构造函数可以用于连接其余服务器和端口。

MDSClient的CreateMessage方法重回贰个IOutgoingMessage的指标。对象的MessageData属性是事实上发送给指标应用程序的数据,它是二个字节数组。大家利用UTF8编码把客商输入的文书调换来字节数组。对象的DestinationApplicationName和DestinationServerName属性是用来安装音信的指标地点。即使大家从未点名指标服务器,暗中认可便是地点服务器。最终,大家发送这一个音讯对象。

开发Application2

在Visual Studio里成立二个新的调节台应用程序,命名称为Application2,增加MDSCommonLib.dll并写下以下代码:

using System;
using System.Text;
using MDS.Client;

namespace Application2
{
    class Program
    {
        static void Main(string[] args)
        {
            //Create MDSClient object to connect to DotNetMQ
            //Name of this application: Application2
            var mdsClient = new MDSClient("Application2");

            //Register to MessageReceived event to get messages.
            mdsClient.MessageReceived += MDSClient_MessageReceived;

            //Connect to DotNetMQ server
            mdsClient.Connect();

            //Wait user to press enter to terminate application
            Console.WriteLine("Press enter to exit...");
            Console.ReadLine();

            //Disconnect from DotNetMQ server
            mdsClient.Disconnect();
        }

        /// <summary>
        /// This method handles received messages from other applications via DotNetMQ.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e">Message parameters</param>
        static void MDSClient_MessageReceived(object sender, MessageReceivedEventArgs e)
        {
            //Get message
            var messageText = Encoding.UTF8.GetString(e.Message.MessageData);

            //Process message
            Console.WriteLine();
            Console.WriteLine("Text message received : " + messageText);
            Console.WriteLine("Source application    : " + e.Message.SourceApplicationName);

            //Acknowledge that message is properly handled
            //and processed. So, it will be deleted from queue.
            e.Message.Acknowledge();
        }
    }
}

咱俩用和Application1相似的章程制造三个MDSClient对象,区别的就是接连应用程序的名目是Application2。为了接收新闻,须求给MDSClient对象注册MessageReceived事件。然后大家连年DotNetMQ,直到客户输入Enter才断开。

当一个音信发送给Application2是,MDSClient_MessageReceived方法就能够被调用来管理音讯。大家从MessageReceivedEventArgs参数对象的Message属性能够赢得发送过来的新闻。这么些新闻的花色是IIncomingMessage。IIncomingMessage对象的MessageData属性实际包括了由Application1发送的音信数据。由于它是贰个字节数组,我们用UTF8编码把它转变来字符串。然后把文件音信打字与印刷到调控台上。

图片 7

图 - 6:Application1通过DotNetMQ发送三个音讯到Application2。

处理传入音信随后,还亟需来认可那个音讯。那意味新闻已经正确接受并管理。然后DotNetMQ将从音讯队列中把音讯删除。我们也足以用Reject方法拒绝二个新闻(尽管在阴差阳错的图景下我们无法管理那么些消息)。在此种状态下,该新闻将回到信息队列,稍后再试着发到指标应用程序(假诺在同贰个服务器上设有另三个Application2的实业,也也许发到另三个上)。那是DotNetMQ系统的一个无敌机制。由此,能够确定保障新闻不会放任并相对能够被拍卖。要是你不承认或拒绝三个新闻,系统一旦是被驳回的。所以,就算你的应用程序崩溃了,在你的应用程序符合规律运转后,依旧会吸收接纳新闻的。

假若您在平等台服务器上运营多个Application2的实例,哪二个会收到音信啊?在这种场地下,DotNetMQ会把音信顺序地发放那多少个实例。所以您能够成立多发送/接收的系统。三个音讯只好被贰个实例接收(实例接收相互差别的音讯)。DotNetMQ提供那全体功效和一道。

音信属性:传送法规(Transmit Rule)

在出殡和安葬三个信息从前,你能够像这么设置贰个音讯的Transmit Rule属性:

message.TransmitRule = MessageTransmitRules.NonPersistent;

传递准绳有三体系型:

  • StoreAndForward:这么些是暗中同意传送准则,新闻是长久的,不会吐弃的,何况使保障传送的。假若Send方法未有抛出十一分,就标识音讯已被DotNetMQ接收,并且蕴藏到了数据库。直到指标应用程序接收并确认了它,这一个音信会一贯存款和储蓄在数据Curry。
  • NonPersistent:音信不会储存到数据库,那是发送消息最快的办法。仅在DotNetMQ服务结束工作,音信才会放弃。
  • DirectlySend:那么些是DotNetMQ独有的效果与利益。那连串型的音讯平素发送给目的应用程序。在接收者确认二个新闻从前,发送者程序是间接被封堵的。所以,即使发送者在调用Send方法的进程中平昔不生出分外,就表示该新闻被接受者准确接受并确认。假设在传递消息时发出错误,或接受者处于脱机状态,也许接受者拒绝了信息,发送者在调用Send方法时都会赢得二个老大。纵然应用程序是在不相同的服务器上(更即便在应用程序之间有为数不菲服务器要路由),那几个准则还是能够正常工作。

是因为暗中认可的传递法则是StoreAndForward,让大家尝试上边那些:

  • 运维Application1(那时Application2未有运维),输入一些音讯,然后关闭程序。
  • 运转Application2,你将看见音信并未有错失,而是被Application2摄取了。

不畏在Application1发送过新闻后,你甘休了DotNetMQ服务,你的音讯也是不会放弃的,这就叫持久化

客户端属性:通信格局(CommunicationWay)

暗中同意景况下,一个应用程序能够通过MDSClient发送和接收新闻(CommunicationWays.SendAndReceive)。即便七个应用程序无需收取新闻,能够安装MDSClient的CommunicationWay为CommunicationWays.Send。那性情格在接连DotNetMQ在此之前或在和DotNetMQ通讯中都能够变动。

客商端属性:出错开上下班时间再一次连接服务器(ReConnectServerOnError)

私下认可情形下,MDSClient由于某种原因断开DotNetMQ时会自动重连。所以,纵然你重启DotNetMQ服务,也不用重启你的应用程序。你能够把ReconnectServerOnError设置为false来禁止使用电动重连。

顾客端属性:自动确认音信(AutoAcknowledgeMessages)

暗中同意情状下,你不能够不在MessageReceived事件中显式的承认新闻。不然,系统将认为新闻是被驳回了。假使您想改换这种作为,你须要把AutoAcknowledgeMessages属性设为true。在此种情形下,假设您的MessageReceived事件管理程序尚未抛出拾分,你也未尝显式确认和拒绝三个新闻,系统将机关确认该音信(假诺抛出极度,该音讯将被拒绝)。

配置DotNetMQ

有三种形式能够配备DotNetMQ:通过XML配置文件或用DotNetMQ管理工科具(贰个Windows Forms程序),这里小编分别演示那三种艺术,某个配置是及时生效的,而略带则需求重启DotNetMQ。

服务端

你能够只在一台服务器上运转DotNetMQ,在这里种地方下,是不必要为服务器配置任何事物的。但万一您想在多台服务器上运转DotNetMQ并使它们相互通讯,你就需求定义服务器图了。

二个服务器图包蕴七个或更七个节点,每一个节点都以多个持有IP地址和TCP端口(被DotNetMQ用的这么些)的服务器。你能够用DotNetMQ管理器配置/设计四个服务器图。

图片 8

图 - 8:DotNetMQ服务器图管理。

在上海教室中,你看见了三个暗含5个节点的服务器图。金色节点表示前段时间服务器(当前服务器就是您用DotNetMQ管理器连接的丰裕)。直线表示几个节点(它们相互相邻节点)是可三翻五次的(它们得以发送/接收消息)。服务器/节点图形中的名称是很注重的,它被用来向该服务器发送新闻。

您可以双击图形中的多少个服务器来编排它的习性。为了连接七个服务器,你要按住Ctrl键,点击第二个再点击第2个(断开连接也是一律的操作)。你可以经过点击右键,选择Set as this server来设置处理器连接该服务器。你可以从图中删除贰个服务器或透过右键菜单增加二个新的服务器。最后,你可以通过拖拽增多或移除服务器。

当您安顿好服务器图之后,你必得点击Save & Update Graph按钮来保存这几个改换。那么些改换将保存在DotNetMQ安装目录的MDSSettings.xml文件里。你不能够不重启DotNetMQ手艺动用那么些退换。

对于地点的劳动器图,对应的MDSSettings.xml设置如下:

<?xml version="1.0" encoding="utf-8"?>
<MDSConfiguration>
  <Settings>
    ...
  </Settings>
  <Servers>
    <Server Name="halil_pc" IpAddress="192.168.10.105" 
       Port="10099" Adjacents="emre_pc" />
    <Server Name="emre_pc" IpAddress="192.168.10.244" Port="10099" 
       Adjacents="halil_pc,out_server,webserver1,webserver2" />
    <Server Name="out_server" IpAddress="85.19.100.185" 
       Port="10099" Adjacents="emre_pc" />
    <Server Name="webserver1" IpAddress="192.168.10.263" 
       Port="10099" Adjacents="emre_pc,webserver2" />
    <Server Name="webserver2" IpAddress="192.168.10.44" 
       Port="10099" Adjacents="emre_pc,webserver1" />
  </Servers>
  <Applications>
    ...
  </Applications>
  <Routes>
    ...
  </Routes>
</MDSConfiguration>

自然,这一个布局是要基于你实际的网络张开的。你不能够不在图中保有服务器上安装DotNetMQ。另外,还必得在全部服务器上配置同样的劳务器图(你能够很轻便地从XML文件复战胜务器节点到别的服务器上)。

DotNetMQ采纳段路径算法发送音讯(未有在XML配置文件里手动定义路由的动静下)。思考那些现象,运维在halil_pc的Application A发送二个音信到webserver2上的Application B,路线是非常粗略的:Application A -> halil_pc -> emre_pc -> webserver2 -> Application B。halil_pc通过服务器图定义知道下一个要转账到的服务器(emre_pc)。

末了,MDSSettings.design.xml满含了劳动器图的规划音讯(节点在显示器上的位置)。这么些文件只是用于DotNetMQ管理器的服务器图窗体,运营时的DotNetMQ服务是不供给的。

应用程序

就好像图 - 5显得的那么,你可以把和DotNetMQ关联的应用程序作为音信代理来增加/删除。对于那些改变是无需重启DotNetMQ的。应用程序的安排也保留在MDSSettings.xml文件里,就好像下边那样:

<?xml version="1.0" encoding="utf-8"?>
<MDSConfiguration>
  ...
  <Applications>
    <Application Name="Application1" />
    <Application Name="Application2" />
  </Applications>
  ...
</MDSConfiguration>

一个应用程序必需在此个列表里技巧和DotNetMQ连接。要是你直接修改xml文件,你不可能不重启DotNetMQ服务手艺奏效。

路由/负载均衡

DotNetMQ的有贰个路由效用。未来路由设置只好通过MDSSettings.xml设置。你能够见见上面文件里有二种路由设置:

<?xml version="1.0" encoding="utf-8" ?>
<MDSConfiguration>
  ...
  <Routes>

    <Route Name="Route-App2" DistributionType="Sequential" >
      <Filters>
        <Filter DestinationServer="this" DestinationApplication="Application1" />
      </Filters>
      <Destinations>
        <Destination Server="Server-A" Application="Application1" RouteFactor="1" />
        <Destination Server="Server-B" Application="Application1" RouteFactor="1" />
        <Destination Server="Server-C" Application="Application1" RouteFactor="1" />
    </Destinations>
    </Route>

    <Route Name="Route-App2" DistributionType="Random" >
      <Filters>
        <Filter DestinationServer="this" DestinationApplication="Application2" /> 
        <Filter SourceApplication="Application2" TransmitRule="StoreAndForward" /> 
    </Filters>
      <Destinations>
        <Destination Server="Server-A" Application="Application2" RouteFactor="1" />
        <Destination Server="Server-B" Application="Application2" RouteFactor="3" />
      </Destinations>
    </Route>

  </Routes>
  ...
</MDSConfiguration>

各样路由节点有八个属性:Name属性是对客户自身的突显(不影响路由功效),DistributionType是路由的攻略。这里有两种类型的路由计策:

  • Sequential:音信依次顺序的路由到对象服务器。Destination的RouteFactor是散发因子。
  • Random:新闻随机的路由到对象服务器。选取Server-A服务器的概率是:(Server-A的RouteFactor)/(Destinations里存有RouteFactor的总和)。

Filters用于决定音讯使用哪个路由。若是三个音信的习性和中间八个过滤器相称,该音讯就能够被路由。那有5个条件(XML的5个属性)来定义贰个过滤器:

  • SourceServer:信息的首先个源服务器,能够用this表示近年来服务器。
  • SourceApplication:开掘音信的应用程序。
  • DestinationServer:音信的最后目的服务器,能够用this表示方今服务器。
  • DestinationApplication:接收新闻的应用程序。
  • TransmitRule:消息传送法规的一种(StoreAndForward,DirectlySend,NonPersistent)。

过滤音讯时,不会思考并未有概念的基准。所以,固然具备的基准都以空的(或直接没概念),那么具有的新闻都切合那个过滤器。唯有具有的标准都格外时,三个过滤器才相符这些音讯。假如四个音讯精确相称(最少是过滤器定义的都万分)三个路由中的四个过滤器,那么这几个路由将被挑选并选择。

Destinations是用来将音信路由到别的服务器用的。一个对象服务器被选中是依附Route节点的DistributionType属性(前边解释过)决定的。三个destination节点必得定义三个属性

  • Server:目的服务器,能够用this表示近期服务器。
  • Application:指标应用程序,目的应用程序常常和音讯的原指标程序是均等的,但是这里你能够重定向到另一个应用程序。
  • RouteFactor:那些天性用于表Bellamy(Bellamy)个目的服务器被选中的周旋比率,能够用来做负载均衡。假设您想把音讯平均分发到具有服务器上,你能够把具备指标服务器的FouteFactor属性都设为1。可是只要您有两台服务器,此中一台比另一台品质强盛的多,你能够经过设置这么些路由因子来到达接纳第一台服务器的票房价值是第二台的两倍以上。

修改路由安顿,不能够不重启DotNetMQ才会一蹴而就。

其余设置

目前DotNetMQ支持3中存储类型:SQLite(默认),MySQL内存(译者注:依照上面内容,还援助MSSQL)。你能够在MDSSettings.xml修改存款和储蓄类型。

  • SQLite:使用SQLite数据库系统。那一个是暗中同意存款和储蓄类型,使用(DotNetMQ安装目录SqliteDBMDS.s3db)文件作为数据库。
  • MSSQL:使用微软SQL Server数据库,你须要提供ConnectionString属性作为一连字符串(上边会谈到)。
  • MySQL-ODBC:通过ODBC使用MySQL数据库,你必要提供ConnectionString数据作为连接字符串。
  • MySQL-Net:通过.NET Adapter(.NET适配器)使用MySQL数据库,你须求提供ConnectionString数据作为连接字符串。
  • Memory:使用内部存款和储蓄器作为存款和储蓄设备。在此种景色下,倘若DotNetMQ截至了,漫长性新闻会放弃。

下边是贰个应用MySQL-ODBC作为存款和储蓄的简易布置:

<Settings>
    <Setting Key="ThisServerName" Value="halil_pc" />
    <Setting Key="StorageType" Value="MySQL-ODBC" />
    <Setting Key="ConnectionString" 
       Value="uid=root;server=localhost;driver={MySQL ODBC 3.51 Driver};database=mds" />
  </Settings>

您能够在SetupDatabases文件夹(那么些文件夹在DotNetMQ的装置目录)找到所需的文本,然后创设数据库和数据表,以供DotNetMQ使用。假如您有怎么着难题,能够随即问作者。

还应该有一个设置是概念"current/this"那几个称号代表哪台服务器的,这一个值必得是Servers节点里的贰个服务器名。要是你用DotNetMQ管理器编辑服务器图,这些值是机关安装的。

网络传输音信

向贰个网络服务器的应用程序发消息是和向同一个服务器的应用程序发音讯同样轻巧的。

四个简练的应用程序

让我们着想下边那几个网络:

图片 9

图 - 8:七个应用程序通过DotNetMQ在互连网上通讯。

运营在ServerA上的Application1想发音信到ServerC上的Application2,由于防火墙的条条框框,ServerA和ServerC不能够间接连接。让大家修改一下在第一个DotNetMQ程序里开垦的顺序。

Application2以至一些有不用修改,只要把Application2上ServerC上运营并等候传入的音讯即可。

Application1只是在怎样发新闻的地点有个别更改一点,就是安装DestinationServerName(目的服务器名)为ServerC。

var message = mdsClient.CreateMessage();
message.DestinationServerName = "ServerC"; //Set destination server name here!
message.DestinationApplicationName = "Application2";
message.MessageData = Encoding.UTF8.GetBytes(messageText);
message.Send();

就那样,就完事儿了。你无需理解ServerC在哪个地方,也不要求直接连接ServerC...这几个全体概念在DotNetMQ设置里。注意:假诺您不给二个音信设置DestinationServerName,系统一旦指标服务器便是"current/this"钦定的那台服务器,DotNetMQ也将把音讯发送到同一台服务器上的应用程序。别的,假诺您定义了非常重要的路由,你就没有须求安装目的服务器了,DotNetMQ会自动地路由新闻。

本来,DotNetMQ的设置必得依据服务器间的连天(服务器图)来设置,并且Application1和Application2供给像配置DotNetMQ一些说的那么注册到DotNetMQ服务器。

二个忠实的案例:分布式短信管理器(Distributed SMS Processor)

正如您已见到的那么,DotNetMQ能够用于营造分布式负载均衡动用系统。在本节中,小编将斟酌一个活着中实际的情景:贰个遍及式新闻管理系统。

如若有三个用来音乐较量投票的短音信(MSM)服务。全体竞技者唱过她们的歌曲后,观众给他们最喜爱的歌星投票,会发一条像"VOTE 103"那样的短信到咱们的短息服务器。并假定本次投票会在短短的30分钟达成,大概有五百万人发短息到大家的服务。

大家将会抽出每一条短息,管理它(格式化短息文本,修改数据库,以便扩张选手的票的数量),并要发送确认新闻给发送者。大家从两台服务器收到新闻,在四台服务器上管理音信,然后从两台服务器上发送确认新闻。大家一共有八台服务器。让我们看看完整的系统暗示图:

图片 10

图 - 9:布满式短信管理系统

这里有三种类型的应用:接受者,管理器,和发送者。在这里种意况下,你就可以利用DotNetMQ作为消息队列和负载均衡器,通过配备服务器图和路由(就如配备DotNetMQ小节中陈诉的那样),来构建一个遍布式的,可扩张的新闻管理体系。

恳请/应答式通信

在重重场合下,三个运用发一个消息到另三个行使,然后拿走一个回应新闻。DotNetMQ对这种通讯方式有内置的支撑。思索那样三个劳务:用于查询仓库储存的景色。这里有三种音讯类型:

[Serializable]
public class StockQueryMessage
{
    public string StockCode { get; set; }
}

[Serializable]
public class StockQueryResultMessage
{
    public string StockCode { get; set; }
    public int ReservedStockCount { get; set; }
    public int TotalStockCount { get; set; }
}

上边凸显了多少个轻易的仓库储存服务。

using System;
using MDS;
using MDS.Client;
using StockCommonLib;

namespace StockServer
{
    class Program
    {
        static void Main(string[] args)
        {
            var mdsClient = new MDSClient("StockServer");
            mdsClient.MessageReceived += MDSClient_MessageReceived;

            mdsClient.Connect();

            Console.WriteLine("Press enter to exit...");
            Console.ReadLine();

            mdsClient.Disconnect();
        }

        static void MDSClient_MessageReceived(object sender, 
                    MessageReceivedEventArgs e)
        {
            //Get message
            var stockQueryMessage = 
                GeneralHelper.DeserializeObject(e.Message.MessageData) 
                as StockQueryMessage;
            if (stockQueryMessage == null)
            {
                return;
            }

            //Write message content
            Console.WriteLine("Stock Query Message for: " + 
                              stockQueryMessage.StockCode);

            //Get stock counts from a database...
            int reservedStockCount;
            int totalStockCount;
            switch (stockQueryMessage.StockCode)
            {
                case "S01":
                    reservedStockCount = 14;
                    totalStockCount = 80;
                    break;
                case "S02":
                    reservedStockCount = 0;
                    totalStockCount = 25;
                    break;
                default: //Stock does not exists!
                    reservedStockCount = -1;
                    totalStockCount = -1;
                    break;
            }

            //Create a reply message for stock query
            var stockQueryResult = new StockQueryResultMessage
                                       {
                                           StockCode = stockQueryMessage.StockCode,
                                           ReservedStockCount = reservedStockCount,
                                           TotalStockCount = totalStockCount
                                       };

            //Create a MDS response message to send to client
            var responseMessage = e.Message.CreateResponseMessage();
            responseMessage.MessageData = 
               GeneralHelper.SerializeObject(stockQueryResult);

            //Send message
            responseMessage.Send();

            //Acknowledge the original request message.
            //So, it will be deleted from queue.
            e.Message.Acknowledge();
        }
    }
}

其一库存服务监听进来的StockQueryMessage音信对象,然后把StockQueryResultMessage音讯对象发送给查询者。为了轻易起见,笔者从未从数据库查询仓库储存。应答音信对象是由传入音讯对象的CreateResponseMessage()方法创立的。最后,发出回应音信后要确认步入的音讯。未来,作者出示叁个简约的仓库储存顾客端从服务器查询仓库储存的示范:

using System;
using MDS;
using MDS.Client;
using MDS.Communication.Messages;
using StockCommonLib;

namespace StockApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Press enter to query a stock status");
            Console.ReadLine();

            //Connect to DotNetMQ  
            var mdsClient = new MDSClient("StockClient");
            mdsClient.MessageReceived += mdsClient_MessageReceived;
            mdsClient.Connect();
            //Create a stock request message 
            var stockQueryMessage = new StockQueryMessage { StockCode = "S01" }; 
            //Create a MDS message 
            var requestMessage = mdsClient.CreateMessage(); 
            requestMessage.DestinationApplicationName = "StockServer"; 
            requestMessage.TransmitRule = MessageTransmitRules.NonPersistent; 
            requestMessage.MessageData = GeneralHelper.SerializeObject(stockQueryMessage); 
            //Send message and get response 
            var responseMessage = requestMessage.SendAndGetResponse(); 
            //Get stock query result message from response message 
            var stockResult = (StockQueryResultMessage) GeneralHelper.DeserializeObject(responseMessage.MessageData); 
            //Write stock query result 
            Console.WriteLine("StockCode = " + stockResult.StockCode); 
            Console.WriteLine("ReservedStockCount = " + stockResult.ReservedStockCount); 
            Console.WriteLine("TotalStockCount = " + stockResult.TotalStockCount); 
            //Acknowledge received message 
            responseMessage.Acknowledge(); 
            Console.ReadLine(); 
            //Disconnect from DotNetMQ server. 
            mdsClient.Disconnect(); 
       } 
       static void mdsClient_MessageReceived(object sender, MessageReceivedEventArgs e) { 
            //Simply acknowledge other received messages 
            e.Message.Acknowledge(); 
       } 
   } 
}

 

在地点的亲自去做中,为了演示指标TransmitRule设置成了NonPersistent(非长久)。当然,你能够发送StoreAndForward(悠久性)音讯。那么些是程序运维的截图:

图片 11

图 - 10:诉求/应答式的通讯应用。

面向服务架构的DotNetMQ

SOA(面向服务的架构)是以个流行多年的定义了。Web服务和WCF是三个重大的SOA实施方案。平时景况下,一个音讯队列系统是不会预期支持SOA的。同有的时候间,新闻通讯是异步的,松耦合的进度,而Web服务方法调用则平时是共同的,紧耦合的。纵然(正如您在头里示例程序中来看的那样)音信通讯并比不上调用一个长间距方法一致简单,可是当你的音讯数增添,你的应用变复杂以致于难以维护时就分裂等了。DotNetMQ帮忙长久性和非长久性的长间距调用机制,全体你能够异步地调用三个远道方法,DotNetMQ会确认保证调用成功。

总结应用程序:短息/邮件发送器

在此边我们将开采四个简短的劳务,可用于发送短信和邮件。可能无需特地写多个服务来发送短信和邮件,那么些意义都足以在行使自个儿完成,可是想象一下你有不菲行使都要发邮件,在发送时只要邮件服务出难题了如何是好?在能够成功发送邮件早前,应用程序必需一向尝试。所以您不可能不在你的应用程序中树立贰个邮件队列机制,用于叁遍又三次的尝尝发送。在最坏的事态下,你的应用程序大概只运维十分的短的光阴(如Web服务)只怕必需在发送完邮件前关闭。不过在邮件服务器上线后,你还非得发送,不允许邮件错过。

在此种景观下,你能够付出二个独门的邮件/短信服务,它将尝试发送直到成功。你能够经过DotNetMQ开荒三个邮件服务,仅当邮件发送成功时断定诉求,假设发送败北,只要不鲜明(或拒绝)新闻就行了,它稍后会重试。

服务端

首先,大家开采短信/邮件的劳动部分。为了贯彻这些,大家不能够不定义五个派生自MDSService的花色:

using System;
using MDS.Client.MDSServices;

namespace SmsMailServer
{
    [MDSService(Description = "This service is a " + 
              "sample mail/sms service.", Version = "1.0.0.0")]
    public class MyMailSmsService : MDSService
    {
        //All parameters and return values can be defined.
        [MDSServiceMethod(Description = "This method is used send an SMS.")]
        public void SendSms(
            [MDSServiceMethodParameter("Phone number to send SMS.")] string phone,
            [MDSServiceMethodParameter("SMS text to be sent.")] string smsText)
        {
            //Process SMS
            Console.WriteLine("Sending SMS to phone: " + phone);
            Console.WriteLine("Sms Text: " + smsText);

            //Acknowledge the message
            IncomingMessage.Acknowledge();
        }

        //You do not have to define any parameters
        [MDSServiceMethod]
        public void SendEmail(string emailAddress, string header, string body)
        {
            //Process email
            Console.WriteLine("Sending an email to " + emailAddress);
            Console.WriteLine("Header: " + header);
            Console.WriteLine("Body  : " + body);

            //Acknowledge the message
            IncomingMessage.Acknowledge();
        }

        // A simple method just to show return values.
        [MDSServiceMethod]
        [return: MDSServiceMethodParameter("True, if phone number is valid.")]
        public bool IsValidPhone([MDSServiceMethodParameter(
               "Phone number to send SMS.")] string phone)
        {
            //Acknowledge the message
            IncomingMessage.Acknowledge();

            //Return result
            return (phone.Length == 10);
        }
    }
}

如您所见,它只是三个含有天性(Attribute)的贰个常规C#类。MDS瑟维斯和MDSServiceMethod八个特色是必得的,别的的特点是可选的(不过写上去是最棒了,你将神速拜会到什么会用这个特征)。你提供服务的主意必需有MDSServiceMehod天性,假诺您不想精晓一些格局,只要不加MDSServiceMethod性格就行了。

您还非得在您的劳动方法中确认音信,否则,这些音讯(引起那几个服务章程调用的丰盛)就不会从新闻队列中除去,而大家的劳务方式将会被另行调用。假若大家无法管理那一个新闻(比如,假使邮件服务失业,大家无法发送时)大家也足以拒绝它。要是我们拒绝了这几个信息,它稍后还也许会发送给大家(很可靠)。你能够透过MDSService类的IncomingMessage属性获得原音信,此外,你也足以由此RemoteApplication属性得到远程应用程序的音讯。

创设了不易的服务类后,大家必得成立三个施用来运作它,上边是用二个差相当的少的调节台程序运转大家的MyMailSmsService服务:

using System;
using MDS.Client.MDSServices;

namespace SmsMailServer
{  
    class Program
    {
        static void Main(string[] args)
        {
            using (var service = new MDSServiceApplication("MyMailSmsService"))
            {
                service.AddService(new MyMailSmsService());
                service.Connect();

                Console.WriteLine("Press any key to stop service");
                Console.ReadLine();
            }
        }
    }
}

如您所见,只需求3行代码就足以成立并运转服务,由于MDSService是可销毁的,所以您能够uing语句,别的,你也得以动用MDSServiceApplication的Disconnect方法手动关闭服务。你能够因此AddService方法在一个MDSServiceApplication中运作多个服务。

客户端

为了开采二个选取DotNetMQ服务的运用,你必得成立八个服务代办(就如Web服务和WCF那样)。为了创立代理,你可以用MDSServiceProxyGenerator工具。首先,编写翻译你的服务项目,然后运转MDSServiceProxyGenerator.exe(在DotNetMQ安装目录).

图片 12

图 - 11:为DotNetMQ服务转移代理类。

挑选你的劳动程序集(在这里个大致的例子中是指SmsMailServer.exe)。你能够选拔服务类或生成那么些程序集里全部服务的代理。输入多个命名空间和二个对象文件夹,然后生成代理类。生成玩后,你就足以把它加到你的品种里了。

笔者就不出示那个代理类了,但你必需询问它(你能够看源码,它是多个很简短的类)。你方法/参数上的性情用来生成那几个代理类的笺注。

在大家的体系里增添这一个代理类后,大家就足以想差相当的少方法调用那样向劳动发音讯了。

using System;
using MDS.Client;
using MDS.Client.MDSServices;
using SampleService;

namespace SmsMailClient
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Press enter to test SendSms method");
            Console.ReadLine();

            //Application3 is name of an application that sends sms/email.
            using (var serviceConsumer = new MDSServiceConsumer("Application3"))
            {
                //Connect to DotNetMQ server
                serviceConsumer.Connect();

                //Create service proxy to call remote methods
                var service = new MyMailSmsServiceProxy(serviceConsumer, 
                    new MDSRemoteAppEndPoint("MyMailSmsService"));

                //Call SendSms method
                service.SendSms("3221234567", "Hello service!");
            }
        }
    }
}

您也足以调用服务的其他形式,会收获像正规方法那样的重临值。实际上,你的章程调用被调换来了牢靠的音讯,比方,尽管你的长途应用程序(MyMailSmsService)在措施调用时未有运维,在劳动运行后也会被调用,所以您的不二等秘书诀调用是迟早会被调用的。

你能够经过退换服务代办的TransmitRule属性来改换音讯传输的法则。假如服务措施重临void,那么他的默许传输准则是StoreAndForward。要是服务方法有个一再次回到值,那么方法调用将会不可相信赖(因为方法调用时一并的,要等待叁个结实的),它的平整是DiretlySend。你能够选拔任何项目作为艺术的参数,如若参数类型是基元类型(string,int,byte...),就无需增大的装置,然则一旦你想用你自定义的项目作为艺术参数,这一个体系务必标识为Serializable,因为DotNetMQ会用二进制体系化参数。

瞩目:你在运转那一个事例前必需在DotNetMQ里登记MyMailSmsService和Application3。

Web服务支撑

自然,你能够在Web服务里接连DotNetMQ,因为把自个儿照旧五个.Net应用程序。然而,为啥您要写二个ASP.NET Web方法为应用程序管理音讯(并且可以在同贰个左右文中回复音讯)呢?Web服务更切合那样央浼/应答式的主意调用。

DotNetMQ援救ASP.NET web服务并可以传递信息到web服务。这里有个web服务的模版样板(在下载文件中)来兑现这一对象。它的定义如下:

using System;
using System.Web.Services;
using MDS.Client.WebServices;

[WebService(Namespace = "http://www.dotnetmq.com/mds")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class MDSAppService : WebService
{
    /// <summary>
    /// MDS server sends messages to this method.
    /// </summary>
    /// <param name="bytesOfMessage">Byte array form of message</param>
    /// <returns>Response message to incoming message</returns>
    [WebMethod(Description = "Receives incoming messages to this web service.")]
    public byte[] ReceiveMDSMessage(byte[] bytesOfMessage)
    {
        var message = WebServiceHelper.DeserializeMessage(bytesOfMessage);
        try
        {
            var response = ProcessMDSMessage(message);
            return WebServiceHelper.SerializeMessage(response);
        }
        catch (Exception ex)
        {
            var response = message.CreateResponseMessage();
            response.Result.Success = false;
            response.Result.ResultText = 
              "Error in ProcessMDSMessage method: " + ex.Message;
            return WebServiceHelper.SerializeMessage(response);
        }
    }

    /// <summary>
    /// Processes incoming messages to this web service.
    /// </summary>
    /// <param name="message">Message to process</param>
    /// <returns>Response Message</returns>
    private IWebServiceResponseMessage 
            ProcessMDSMessage(IWebServiceIncomingMessage message)
    {
        //Process message

        //Send response/result
        var response = message.CreateResponseMessage();
        response.Result.Success = true;
        return response;
    }
}

如上所述,你不须求转移ReceiveMDSMessage方法,何况必需在ProcessMDSMessage方法里管理消息。另外,你要求向上边那样在MDSSettings.xml里定义你的web服务地址,你也得以用DotNetMQ管理工科具增加web服务。

 ... 
  <Applications>
    <Application Name="SampleWebServiceApp">
      <Communication Type="WebService" 
        Url="http://localhost/SampleWebApplication/SampleService.asmx" />
    </Application>
  </Applications>
  ... 

DotNetMQ的性能

那是有些由此DotNetMQ传送新闻的测量检验结果:

新闻传送:

  • 持久地 10,000个消息差不离供给25秒(约每秒400个消息)。
  • 非持久地 10,000个音讯大概须求3.5秒(约每秒2850个消息)。

艺术调用(在DotNetMQ服务里)

  • 持久地 10,000个主意调用大致必要25秒(约每秒400个)。
  • 非悠久地 10,000个艺术调用大概须要8.7秒(约每秒1150个)。

测验平台:英特尔 Core 2 Duo 3,00 GHZ CPU.2 GB RAM PC。新闻传送和措施调用是在同等台Computer上的八个应用程序之间展开的。

引用

书籍:Enterprise Integration Patterns: Designing,Building,and Deploying Messaging Solutions .作者 Gregor Hohpe,Bobby Woolf(艾迪生Wesley出版,二〇〇一年)。

历史

  • 2011-05-23(DotNetMQ v0.9.1.0)
    • 累积对微软SQL Server数据库的支撑。
    • 把MySQLConnectionString设置改成ConnectionString。
    • 修改源码。
    • 基于修改更新了稿子。
  • 2011-05-16 (DotNetMQ v0.9.0.0)
    • 增多web服务模板的下载。
    • 对文章做了一些改换和拉长。
  • 2011-05-09(DotNetMQ v0.9.0.0)
    • 率先次发表。

 

TAG标签:
版权声明:本文由金沙澳门唯一官网发布于金沙澳门登陆网站,转载请注明出处:如何安装和使用Beanstalkd工作队列,NET版完整的消