怎么设置和应用Beanstalkd专门的工作行列,Rabbit

2019-11-03 作者:365必发唯一官网   |   浏览(152)

哪些设置和动用Beanstalkd工作行列(1)

介绍

当心地发布每一成分的天职安插应用程序栈带给好多实惠,包含简单的确诊难点时发出,规模迅猛的技能,以致更清晰的保管范围波及的构件。

在当今世界web服务的工程,叁个根本的组件达成上述场景涉及使用信息队列和劳作(或任务)。那一个平铺直叙是弹性和灵活的应用程序相当轻巧达成和设置。他们是应有尽有的解体的两样部分之间的事体逻辑应用程序包时分娩。

在此篇小说中,大家的应用程序等第类别通讯施工方案,大家将看看Beanstalkd创设那个有个别的分别。

什么是Beanstalkd

Beanstalkd首先是解决了多个风靡的web应用程序的急需(Facebook上的原因)。这几天,那是叁个纯属可信赖,易于安装的信息传递服务,是完备的开始和利用。

如前所述,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 

365必发唯一官网 1


) 介绍 小心严慎地透露每一元素的职务布置应用程序栈带给多数益处,满含轻巧的确诊难题时发生,规模迅...

在四个特大型的分布式系统中,音信队列是不行缺点和失误的中间件,能很好的缓解异步新闻、应用解耦、均衡并发等难点。在.net中,有的时候开采八个频率不错、安全可信、功效齐全的音讯组件,忍不住翻译过来,供大家快速预览。

1. 说明 

  在公司应用系统领域,会直面不一致系统里面包车型地铁通信、集成与构成,越发当面前遭遇异构系统时,这种布满式的调用与通讯变得更为首要。其次,系统中日常会有广大对实时性供给不高的而是进行起来比较较耗时的地点,举个例子发送短信,邮件提示,更新小说阅读计数,记录顾客操作日志等等,借使实时管理的话,在顾客访问量超大的意况下,对系统压力非常的大。

面前遇到这个难题,大家日常会将这么些哀告,放在消息队列MQ中拍卖;异构系统里头选择消息进行报纸发表。

    MQ全称为Message Queue, 音信队列(MQ卡塔 尔(英语:State of Qatar)是黄金时代种应用程序对应用程序的通讯形式。应用程序通过读写出入队列的音讯(针对应用程序的多寡卡塔尔来通信,而没有必要专项使用连接来链接它们。消息传递指的是前后相继之间通过在音信中发送数据进行通讯,并不是透过直接调用互相来通讯,直接调用经常是用于诸如远程进程调用的本事。排队指的是应用程序通过 队列来通讯。队列的运用除去了收到和出殡和下葬应用程序相同的时候实行的必要。

  MQ是花费-临蓐者模型的一个优质的象征,生龙活虎端往音讯队列中持续写入新闻,而另后生可畏端则足以读取或然订阅队列中的新闻。

   RabbitMQ是三个在AMQP根底上完整的,可复用的营业所消息系统。他根据Mozilla Public License开源公约。 

  音讯传递相较文件传递与长途进程调用(RPC卡塔尔国来讲,如同更胜一筹,因为它有着越来越好的阳台非亲非故性,并能够很好地支撑并发与异步调用。所以黄金时代旦系统中现身了之类意况:

  • 对操作的实时性须要不高,而急需施行的职责极为耗费时间;
  • 存在异构系统间的组成;

  日常的能够构思引进音讯队列。对于第生机勃勃种意况,日常会筛选信息队列来拍卖实施时间较长的天职。引进的新闻队列就成了音讯管理的缓冲区。新闻队列引进的异步通讯机制,使得发送方和接收方都无须等待对方回来成功音信,就能够继续实施上边包车型客车代码,进而提升了数码管理的能力。非常是当访谈量和数码流量超级大的景况下,就足以组成消息队列与后台职责,通过避开高峰期对大数量举行管理,就足以有效收缩数据库管理多少的载荷。 

  本文简介在RabbitMQ那风度翩翩消息代理工科具,以至在.NET中怎样选取RabbitMQ.

注:原来的书文者用windows服务运营新闻队列服务,然而本人在win10上测量检验出错,可自动改成调节台运转新闻队列服务,然后用第三方工具注册服务(如:SrvanyUI)

2. 搭建意况

  2.1 安装Erlang语言运营境遇

  由于RabbitMQ使用Erlang语言编写,所以先安装Erlang语言运营条件。   采用六18个人系统装置

  2.2 安装RabbitMQ服务端

  地址 

  下载安装。

  使RabbitMQ以Windows Service的核心在后台运维:展开cmd切换来sbin目录下实践

rabbitmq-service install
rabbitmq-service enable
rabbitmq-service start

   未来RabbitMQ的服务端已经起步起来了。

  要查看和调节RabbitMQ服务端的境况,能够用rabbitmqctl这一个本子。

  比方查看情况:

rabbitmqctl status

  365必发唯一官网 2

  如果显示node未有连接上,要求到C:Windows目录下,将.erlang.cookie文件,拷贝到客户目录下 C:Users{客商名},那是Erlang的Cookie文件,允许与Erlang实行相互影响。

   使用命令查看客商:

rabbitmqctl list_users

365必发唯一官网 3

  RabbitMQ会为大家成立暗许的客户名guest和密码guest,guest默许具有RabbitMQ的有所权力。

  经常的,大家供给新建一个大家友好的客商,设置密码,并付与权限,并将其安装为大班,能够接收下边包车型地铁通令来施行那风流倜傥操作:

rabbitmqctl  add_user  JC JayChou   //创建用户JC密码为JayChou
rabbitmqctl  set_permissions  JC ".*"  ".*"  ".*"    //赋予JC读写所有消息队列的权限
rabbitmqctl  set_user_tags JC administrator    //分配用户组

  修改JC密码为123:

rabbitmqctl change_password JC  123

  删除顾客JC:

rabbitmqctl delete_user  JC

  也能够敞开rabbitmq_management插件,在web分界面查看和管理RabbitMQ服务

rabbitmq-plugins enable rabbitmq_management  

365必发唯一官网 4

 

  2.3下载RabbitMQ的Client端dll

  可一贯设置VS自带的NuGet程序包中的RabbitMQ.Client,也可自行下载并援用。

  下载地址:

  自身下载了这么些 rabbitmq-dotnet-client-3.6.6-dotnet-4.5.zip

365必发唯一官网 5

   解压,我们要求的是以此文件,现在会引用到vs的系列中:

365必发唯一官网 6

原文:

3.使用

  3.1在采纳RabitMQ此前,先对多少个概念做一下验证

  

  RabbitMQ是一个音信代理。他从新闻生产者(producers)这里接到音信,然后把新闻送给音信成本者(consumer卡塔尔国在出殡和下葬和收受之间,他能够遵照设置的中规中矩实行路由,缓存和长久化。

  日常涉及RabbitMQ和音信,都用到有个别专有名词。

  • 生育(Producing)意思正是出殡和埋葬。发送新闻的前后相继正是叁个劳动者(producer)。我们日常用"P"来代表:

       365必发唯一官网 7

  • 队列(queue)正是邮箱的称谓。新闻通过你的应用程序和RabbitMQ举办传输,它们只好存款和储蓄在队列(queue卡塔尔中。 队列(queue卡塔 尔(英语:State of Qatar)体量未有节制,你要存款和储蓄多少新闻都足以——基本上是四个极其的缓冲区。多少个坐蓐者(producers卡塔 尔(英语:State of Qatar)能够把音讯发送给同一个队列,同样,多少个买主(consumers卡塔尔国也能从同三个系列(queue卡塔尔国中获取数据。队列能够画成这么(图上是队列的称号卡塔 尔(英语:State of Qatar):

     365必发唯一官网 8

  • 开销(Consuming卡塔 尔(英语:State of Qatar)和拿到音讯是如出大器晚成辙的意思。叁个开支者(consumer卡塔 尔(阿拉伯语:قطر‎正是三个等候获取音讯的次序。我们把它画作"C":

     365必发唯一官网 9

  日常,音信坐蓐者,音讯花费者和消息代理不在同风度翩翩台机器上。

 

3.2 Hello Word

  上边来显示轻便的RabbitMQ的行使:

      365必发唯一官网 10

 3.2.1 首先创设名字为ProjectSend的调整台项目,必要援用RabbitMQ.Client.dll。那几个程序当作Producer生产者,用来发送数据:

365必发唯一官网 11

static void Main(string[] args)
    {
        var factory = new ConnectionFactory();
        factory.HostName = "localhost";//RabbitMQ服务在本地运行
        factory.UserName = "guest";//用户名
        factory.Password = "guest";//密码

        using (var connection = factory.CreateConnection())
        {
            using (var channel = connection.CreateModel())
            {
                //创建一个名称为hello的消息队列
          channel.QueueDeclare(queue: "hello",//队列名 
                      durable: false,//是否持久化 
                      exclusive: false,//true:排他性,该队列仅对首次申明它的连接可见,并在连接断开时自动删除 
                      autoDelete: false,//true:如果该队列没有任何订阅的消费者的话,该队列会被自动删除 
                      arguments: null);//如果安装了队列优先级插件则可以设置优先级
                string message = "Hello World"; //传递的消息内容
                var body = Encoding.UTF8.GetBytes(message);
          channel.BasicPublish(exchange: "",//exchange名称 
                      routingKey: "hello",//如果存在exchange,则消息被发送到名称为hello的queue的客户端 
                      basicProperties: null, 
                      body: body);//消息体
                Console.WriteLine("已发送: {0}", message);
          Console.ReadLine();
            }
        }
    }

365必发唯一官网 12

  

  首先,须求创建二个ConnectionFactory,设置目的,由于是在本机,所以设置为localhost,若是RabbitMQ不在本机,只须要安装目的机器的IP地址只怕机器名称就可以,然后设置前边创立的客商名和密码。

  紧接着要开创三个Channel,固然要发送新闻,供给创建一个队列,然后将新闻宣布到这几个行列中。在开立队列的时候,独有RabbitMQ上该队列不设有,才会去创制。新闻是以二进制数组的格局传输的,所以只要音信是实业对象的话,必要类别化和接下来转向为二进制数组。

  未来顾客端发送代码已经写好了,运维之后,信息会发布到RabbitMQ的音讯队列中,以后亟需编制伏务端的代码连接到RabbitMQ上去获取这个讯息。

3.2.2创设名字为ProjectReceive的调控台项目,援用RabbitMQ.Client.dll。作为Consumer花费者,用来接受数据:

365必发唯一官网 13

static void Main(string[] args)
        {
            var factory = new ConnectionFactory();
            factory.HostName = "localhost";
            factory.UserName = "guest";
            factory.Password = "guest";

            using (var connection = factory.CreateConnection())
            {
                using (var channel = connection.CreateModel())
                {
                    channel.QueueDeclare("hello", false, false, false, null);

                    var consumer = new EventingBasicConsumer(channel);
                    channel.BasicConsume("hello", false, consumer);
                    consumer.Received  = (model, ea) =>
                    {
                        var body = ea.Body;
                        var message = Encoding.UTF8.GetString(body); 
                        Console.WriteLine("已接收: {0}", message);   
                    };
                    Console.ReadLine(); 
                }
            }
        }

365必发唯一官网 14

   和发送相仿,首先要求定义连接,然后注脚音讯队列。要收到音讯,须要定义一个Consume,然后在吸取音信的风云中拍卖多少。

 3.2.3 以往发送和收受的客商端都写好了,让我们编写翻译试行起来

  发送音信:

365必发唯一官网 15

  未来,名叫hello的新闻队列中,发送了一条新闻。那条音讯存款和储蓄到了RabbitMQ的服务器上了。使用rabbitmqctl 的list_queues可以查看全部的信息队列,以致在那之中的新闻个数,能够观察,近些日子Rabbitmq上独有二个音讯队列,里面唯有一条音讯:

365必发唯一官网 16

  也能够在web管理分界面查看此queue的连锁消息:

 365必发唯一官网 17

 

  选取音信:

365必发唯一官网 18

   既然音信少年老成度被选取了,那大家再来看queue的剧情:

365必发唯一官网 19

  可以知道,新闻中的内容在接到之后已被删去了。

正文: 

3.3 职业行列

  前边的事例展现了什么样在钦命的新闻队列发送和吸收接纳消息。

  以往大家创制三个办事行列(work queue卡塔 尔(英语:State of Qatar)来将生机勃勃部分耗费时间的任务分发给五个工小编(workers卡塔 尔(阿拉伯语:قطر‎:

   365必发唯一官网 20

  专门的学业行列(work queues, 又称任务队列Task Queues卡塔 尔(英语:State of Qatar)的严重性思想是为着幸免马上施行并伺机一些损人益己多量能源、时间的操作完毕。而是把任务(Task卡塔 尔(英语:State of Qatar)当做音讯发送到队列中,稍后管理。一个运作在后台的劳力(worker卡塔尔进度就能抽取职分然后管理。当运维八个工我(workers卡塔尔时,职分会在它们中间分享。

  这么些在互连网使用中丰硕有用,它能够在短暂的HTTP乞求中管理局地盘根错节的职责。在部分实时性供给不太高之处,大家得以管理完重要操作之后,以音讯的主意来拍卖其余的不首要的操作,例如写日记等等。

准备

  在第大器晚成有个别,发送了四个分包“Hello World!”的字符串新闻。现在发送一些字符串,把那些字符串当做复杂的任务。这里运用time.sleep()函数来效仿耗费时间的天职。在字符串中增添点号(.卡塔尔来代表任务的复杂程度,三个点(.卡塔 尔(阿拉伯语:قطر‎将会耗费时间1分钟。举例"Hello..."就能够耗费时间3分钟。

对以前示例的send.cs做些轻便的调动,以便能够发送随便的音讯。那一个程序会依据布置发送职责到大家的行事行列中。

365必发唯一官网 21

static void Main(string[] args)
{
    var factory = new ConnectionFactory();
    factory.HostName = "localhost";
    factory.UserName = "yy";
    factory.Password = "hello!";

    using (var connection = factory.CreateConnection())
    {
        using (var channel = connection.CreateModel())
        {
            channel.QueueDeclare("hello", false, false, false, null);
            string message = GetMessage(args);
            var properties = channel.CreateBasicProperties();
            properties.DeliveryMode = 2;

            var body = Encoding.UTF8.GetBytes(message);
            channel.BasicPublish("", "hello", properties, body);
            Console.WriteLine(" set {0}", message);
        }
    }

    Console.ReadKey();
}

private static string GetMessage(string[] args)
{
    return ((args.Length > 0) ? string.Join(" ", args) : "Hello World!");
}

365必发唯一官网 22

 

随着我们校订选拔端,让他依据消息中的逗点的个数来Sleep对应的秒数:

365必发唯一官网 23

static void Main(string[] args)
{
    var factory = new ConnectionFactory();
    factory.HostName = "localhost";
    factory.UserName = "yy";
    factory.Password = "hello!";

    using (var connection = factory.CreateConnection())
    {
        using (var channel = connection.CreateModel())
        {
            channel.QueueDeclare("hello", false, false, false, null);

            var consumer = new QueueingBasicConsumer(channel);
            channel.BasicConsume("hello", true, consumer);

            while (true)
            {
                var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();

                var body = ea.Body;
                var message = Encoding.UTF8.GetString(body);

                int dots = message.Split('.').Length - 1;
                Thread.Sleep(dots * 1000);

                Console.WriteLine("Received {0}", message);
                Console.WriteLine("Done");
            }
        }
    }
}

365必发唯一官网 24

 

轮询分发

  使用专门的职业行列的二个好处便是它亦可彼此的管理队列。假设堆成堆了不计其数职务,大家只供给加上更加的多的工小编(workers卡塔 尔(阿拉伯语:قطر‎就足以了,扩大比较轻巧。

现行反革命,我们先运行多少个接受端,等待选用消息,然后运行二个发送端起来发送新闻。

365必发唯一官网 25 

  在cmd条件下,发送了5条新闻,每条信息后边的逗点表示该音讯必要执行的时间长度,来效仿耗费时间的操作。

  然后能够看见,七个接纳端依次选取到了爆发的音讯:

365必发唯一官网 26 

暗中认可,RabbitMQ会将各样音信依照顺序依次分发给下二个主顾。所以每种顾客选拔到的音信个数差非常少是平均的。 这种消息分发的办法叫做轮询(round-robin卡塔 尔(英语:State of Qatar)。


3.4 消息响应

当管理二个比较耗费时间得任务的时候,也许想领悟花费者(consumers卡塔尔是不是运行到二分一就挂掉。在现阶段的代码中,当RabbitMQ将新闻发送给花费者(consumers卡塔 尔(英语:State of Qatar)之后,即刻就能够将该新闻从队列中移除。那个时候,假如把拍卖这么些音讯的工作者(worker卡塔尔国停掉,正在管理的那条新闻就能放弃。同临时候,全部发送到那么些工小编的还尚未拍卖的新闻都会放弃。

我们不想不见任何职责音信。借使一个劳重力(worker卡塔 尔(阿拉伯语:قطر‎挂掉了,大家希望该新闻会再一次发送给其余的劳重力(worker卡塔 尔(英语:State of Qatar)。

为了避防万意气风发音讯遗失,RabbitMQ提供了音信响应(acknowledgments卡塔 尔(阿拉伯语:قطر‎机制。花费者会经过一个ack(响应卡塔尔国,告诉RabbitMQ已经选择并管理了某条消息,然后RabbitMQ才会放出并删除那条新闻。

假设买主(consumer卡塔 尔(英语:State of Qatar)挂掉了,未有发送响应,RabbitMQ就能以为新闻没有被完全管理,然后再度发送给其他花费者(consumer卡塔尔国。那样,固然工作者(workers卡塔 尔(阿拉伯语:قطر‎偶然的挂掉,也不会放弃音信。

新闻是还未有过期那一个定义的;当工我与它断开连的时候,RabbitMQ会重新发送音讯。那样在管理贰个耗时非常短的音讯职分的时候就不会出难点了。

音信响应暗中同意是张开的。在前面包车型客车事例中央银行使了no_ack=True标记把它倒闭。是时候移除那些标志了,当工小编(worker卡塔尔国完毕了任务,就发送多少个响应。

365必发唯一官网 27

channel.BasicConsume("hello", false, consumer);

while (true)
{
    var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();

    var body = ea.Body;
    var message = Encoding.UTF8.GetString(body);

    int dots = message.Split('.').Length - 1;
    Thread.Sleep(dots * 1000);

    Console.WriteLine("Received {0}", message);
    Console.WriteLine("Done");

    channel.BasicAck(ea.DeliveryTag, false);
}

365必发唯一官网 28

 

至今,能够确认保障,尽管正在管理音信的劳引力被停掉,那些音讯也不会放任,全数未有被回应的音讯会被重复发送给其余工笔者.

三个很平淡无奇的失实便是忘掉了BasicAck这些方法,那些乖谬很布满,但是后果很严重. 当客户端退出时,待管理的新闻就能被重新分发,可是RabitMQ会消耗愈来愈多的内部存款和储蓄器,因为这一个从未被回应的音讯无法被保释。调节和测量检验这种case,能够行使rabbitmqct打字与印刷messages_unacknoledged字段。

rabbitmqctl list_queues name messages_ready messages_unacknowledged
Listing queues ...
hello    0       0
...done.

 

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

3.5 音讯持久化

前方早已解决了尽管花销者down掉,任务也不会抛弃,可是,即使RabbitMQ Server停掉了,那么那个新闻照旧会扬弃。

当RabbitMQ Server 关闭可能崩溃,那么内部积累的类别和消息私下认可是不会保留下来的。倘使要让RabbitMQ保存住消息,必要在五个地点还要设置:供给确认保证加利亚队列和消息都以持久化的。

先是,要保险RabbitMQ不会放任队列,所以要做如下设置:

bool durable = true;
channel.QueueDeclare("hello", durable, false, false, null);

 

虽说在语法上是情有可原的,然而在这里时此刻阶段是不许确的,因为大家后面曾经定义了四个非悠久化的hello队列。RabbitMQ差别意我们利用不一样的参数重新定义叁个早就存在的同名队列,要是这么做就能够报错。以后,定义别的多少个比不上名目标体系:

bool durable = true;
channel.queueDeclare("task_queue", durable, false, false, null);

 

queueDeclare 那么些改造要求在发送端和选拔端相同的时候安装。

未来保管了task_queue那几个消息队列就算在RabbitMQ Server重启之后,队列也不会甩掉。 然后要求确认保证消息也是长久化的, 那能够通过安装IBasicProperties.Persistent = true来达成:

var properties = channel.CreateBasicProperties();
properties.Persistent = true;

 

亟待潜心的是,将音信设置为长久化并不可能一心保障消息不遗弃。固然他告知RabbitMQ将音讯保存到磁盘上,不过在RabbitMQ接纳到信息和将其保存到磁盘上这时候期依然有三个小的日子窗口。 RabbitMQ 恐怕只是将新闻保存到了缓存中,并从未将其写入到磁盘上。持久化是不可能料定保障的,不过对于一个简约职务队列来讲已经够用。借使急需音信队列持久化的强保险,能够应用publisher confirms

下载源代码 - 1.28 MB

3.6 公平分发

您也许会注意到,音讯的散发大概并不曾如笔者辈想要的那么公平分配。比方,对于七个工作者。当奇数个音讯的职务相当重,可是偶数个信息职分超级轻时,奇数个工小编始终管理费力景色,而偶数个工小编始终管理空闲状态。可是RabbitMQ并不知道那些,他依旧会平均依次的分发新闻。

为了改造本场所,大家得以行使basicQos方法,设置perfetchCount=1 。那样就告知RabbitMQ 不要在同时给三个劳力发送多于1个的音讯,只怕换句话说。在二个劳动力还在拍卖新闻,并且未有响应音信在此以前,不要给他分发新的消息。相反,将那条新的消息发送给下三个不那么费劲的劳力。

channel.BasicQos(0, 1, false); 

 

下载二进制文件 - 933 KB

3.7 完整实例

前段时间将持有那一个身处一块儿:

发送端代码如下:

365必发唯一官网 29

static void Main(string[] args)
{
    var factory = new ConnectionFactory();
    factory.HostName = "localhost";
    factory.UserName = "yy";
    factory.Password = "hello!";

    using (var connection = factory.CreateConnection())
    {
        using (var channel = connection.CreateModel())
        {

            bool durable = true;
            channel.QueueDeclare("task_queue", durable, false, false, null);

            string message = GetMessage(args);
            var properties = channel.CreateBasicProperties();
            properties.SetPersistent(true);


            var body = Encoding.UTF8.GetBytes(message);
            channel.BasicPublish("", "task_queue", properties, body);
            Console.WriteLine(" set {0}", message);
        }
    }

    Console.ReadKey();
}

private static string GetMessage(string[] args)
{
    return ((args.Length > 0) ? string.Join(" ", args) : "Hello World!");
}

365必发唯一官网 30

 

接纳端代码如下:

365必发唯一官网 31

static void Main(string[] args)
{
    var factory = new ConnectionFactory();
    factory.HostName = "localhost";
    factory.UserName = "yy";
    factory.Password = "hello!";

    using (var connection = factory.CreateConnection())
    {
        using (var channel = connection.CreateModel())
        {
            bool durable = true;
            channel.QueueDeclare("task_queue", durable, false, false, null);
            channel.BasicQos(0, 1, false);

            var consumer = new QueueingBasicConsumer(channel);
            channel.BasicConsume("task_queue", false, consumer);

            while (true)
            {
                var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();

                var body = ea.Body;
                var message = Encoding.UTF8.GetString(body);

                int dots = message.Split('.').Length - 1;
                Thread.Sleep(dots * 1000);

                Console.WriteLine("Received {0}", message);
                Console.WriteLine("Done");

                channel.BasicAck(ea.DeliveryTag, false);
            }
        }
    }
}

365必发唯一官网 32

 

下载例子 - 534 KB

4 管理界面

RabbitMQ管理分界面,通过该分界面能够查看RabbitMQ Server 当前的情事,该分界面是以插件情势提供的,并且在安装RabbitMQ的时候曾经自带了该插件。需求做的是在RabbitMQ调控台分界面中启用该插件,命令如下:

rabbitmq-plugins enable rabbitmq_management

365必发唯一官网 33

当今,在浏览器中输入 http://*server-name*:15672/ server-name换到机器地址恐怕域名,假设是地方的,直接用localhost(RabbitMQ 3.0事先版本端口号为55672卡塔 尔(阿拉伯语:قطر‎在输入之后,弹出登陆界面,使用大家事先创制的客户登陆。

365必发唯一官网 34 .

在该分界面上能够见见近日RabbitMQServer的享有情况。

小说大体

5 总结

正文简介了新闻队列的有关概念,并介绍了RabbitMQ消息代理的基本原理以致在Windows 上怎么安装RabbitMQ和在.NET中哪些采纳RabbitMQ。音信队列在构建分布式系统和增加系统的可扩充性和响应性方面有着很首要的效益,希望本文对你精晓消息队列以致哪些运用RabbitMQ有所支持。

 

摘自:

365必发唯一官网 35

  • 介绍
  • 怎么是音讯传递?
  • 什么是DotNetMQ?
  • 缘何要三个新的信息代理?
    • 消息代理的必要性
    • 幸存的新闻代理
  • 安装、运行DotNetMQ
  • 第一个DotNetMQ程序
    • 挂号应用程序到DotNetMQ
    • 开发Application1
    • 开发Application2
    • 消息属性:传送法则(Transmit Rule卡塔尔
    • 客商端属性:通信方式(CommunicationWay卡塔尔
    • 顾客端属性:出错开上下班时间再次连接服务器(ReConnectServerOnError卡塔 尔(英语:State of Qatar)
    • 顾客端属性:自动确认音信(AutoAcknowledgeMessages卡塔尔
  • 配置DotNetMQ
    • 服务端
    • 应用程序
    • 路由/负载均衡
    • 别的设置
  • 网络传输音讯
    • 叁个轻松易行的应用程序
    • 叁个真正的案例:布满式短信微型机(Distributed SMS Processor卡塔尔
  • 号召/应答式通讯
  • 面向服务架构的DotNetMQ
    • 同理可得应用程序:短息/邮件发送器
      • 服务端
      • 客户端
    • Web服务援救
  • DotNetMQ性能
  • 历史
  • 引用

介绍

在这里篇小说中,笔者将介绍三个新的、独立的、开源的,完全基于C#和.NET Framework3.5的音讯队列系统,DotNetMQ是三个消息代理,它归纳确定保障传输,路由,负载均衡,服务器图等等多项职能。作者将从解释新闻的概念和新闻代理的须要性讲起,然后,笔者会申明怎么样是DotNetMQ,以至如何使用它。

怎么样是音信传递

音信传递是风流倜傥种异步通信方法,具体正是在同二个或区别的机械上运转的八个应用程序之间可相信的音信传递。应用程序通过发送生机勃勃种叫音讯的数据包和别的应用程序通讯。

贰个音讯能够是三个字符串,三个字节数组,三个对象等等。平日处境下,多个发送者(生产者)先后创制三个音信,并将其推送到三个音讯队列,然后二个接受者(消费者)程序从队列中获取这么些消息并管理它。发送程序和收受程序无需同期运转,因为音信传递是贰个异步进度。那便是所谓的松耦合通信。

四头,Web服务措施调用(远程方法调用卡塔 尔(英语:State of Qatar)是黄金时代种紧耦合一同通讯(那七个应用程序在整整通讯的历程中都亟须是运转着还要可用,假如Web服务脱机或在点子调用时期发生错误,那么客商端应用程序将拿到二个那三个卡塔尔。

365必发唯一官网 36

图 - 1:四个应用程序间最简单易行的新闻传递。

在上海教室中,八个应用程序通过音信队列进行松散耦合方式通讯。借使选取者管理音信的快渐渐于发送者发生音讯的进度,那么队列里的音讯数就可以增添。其余,在发送者发送消息的长河中,采取者恐怕是离线的。在这里种气象下,当选用者上线后,它会从队列中获得信息(当它初叶并参与这么些行列时卡塔 尔(阿拉伯语:قطر‎。

365必发唯一官网,音信队列平常由消息代理提供。新闻代理是二个独立的应用程序(二个服务卡塔 尔(阿拉伯语:قطر‎,其余应用程序通过连续几日它发送、接受音讯。在新闻被接受者选用以前,新闻代理负担累积音讯。音讯代理能够经过路由多台机械把新闻传送给目的应用程序,在音讯被选取者正确处理在此之前,音信代理会平昔尝试传送它。不经常候新闻代理也被可以称作面向音讯的中间件(Message-Oriented-Middleware MOM卡塔 尔(阿拉伯语:قطر‎只怕简单的叫音信队列(Message Queue MQ卡塔 尔(英语:State of Qatar).

什么是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为前缀的类。

缘何要四个新的新闻代理?

新闻代理的供给性

第风华正茂,作者将演示一个亟待音信代理的粗略情形。

在本人的专门的学问经验中,笔者来看过局地不行倒霉且不平凡的异步公司应用集成技术方案。平日是运营在生机勃勃台服务器上的一个程序推行一些职务,况兼产生局地多少,然后将结果数据发送到另意气风发台服务器上的另多个主次。第三个使用在多少上举办其它义务或总括结果(那台服务器在相同网络中恐怕通过互连网连接卡塔 尔(阿拉伯语:قطر‎。其余,新闻数据必得是悠久的。纵然长途程序失掉工作或互连网不可用,音讯必得第偶尔间发送过去。

让大家来寻访下边包车型客车设计图:

365必发唯一官网 37

图 - 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显示于下图。

365必发唯一官网 38

图 - 3:使用DotNetMQ的大致新闻传递。

DotNetMQ是四个单身的Windows服务,分别运转在Server-A和Server-B服务器上。由此,你只需编写代码和DotNetMQ通讯。使用DotNetMQ客商端类库,和DotNetMQ服务发送、采取音讯是特别轻松和快捷的。Application -1策画音讯,设置目的,并将信息传递给DotNetMQ代理。DotNetMQ代理将以最可行和最快的艺术传送给Application -2。

幸存的新闻代理

很分明,在合龙应用程序中国国投息代理是有供给的。笔者网络检索,查找书籍,想找三个免费的(最棒也是开源的卡塔 尔(英语:State of Qatar)何况是.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开采的。

从顾客角度来看,作者只是想经过“音信数据,目的服务器和应用程序名称”来定位本身的代理。其余的笔者都不关怀。他将会依照供给在互联网上再三路由多个音讯,最终发送到指标服务器的目的程序上。小编的音讯传送系统必得为自己提供那几个便利。那是本身的着重点。小编依照那一点光景设计了新闻代理的布局。下图呈现了本身想要的。

365必发唯一官网 39

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

Application -1 传递一个新闻到地面服务器(Server-A卡塔 尔(阿拉伯语:قطر‎上的音信代理:

  • 指标服务器:Server-D
  • 目标应用程序:Application -2
  • 音讯数据:应用程序特定的数量

Server-A未有向来和Server-D连接。由此,新闻代理在服务器间转载消息(那些音信依次通过Server-A,Server-B,Server-C,Server-D卡塔 尔(英语:State of Qatar),新闻最终达到Server-D上的新闻代理,然后传递给Application -2。注目的在于Server-E上也是有一个Application-2在运营,可是它不会选拔这几个新闻,因为音信的对象服务器是Server-D。

DotNetMQ提供了这种功效和有助于。它在劳动器图上找到最好的(最短的卡塔尔国路线把音信从原服务器转载到对象服务器。

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

安装、运行DotNetMQ

今后还不曾达成活动安装,可是安装DotNetMQ是特别轻易的。下载并解压小提及头提供的二进制文件。只需将全数的东西复制到C:Progame FilesDotNetMQ下,然后运营INSTALL_x86.bat(假设你用的是61人系统,那么将进行INSTALL_x64)。

你能够检查Windows服务,看看DotNetMQ是不是早就设置并平日办事。

第一个DotNetMQ程序

让大家看看实际中的DotNetMQ。为了使第三个程序丰硕轻便,小编风流倜傥旦是同黄金年代台机械上的两个调整台应用程序(实际上,就疑似我们待会在小说中看见的百般,和在两台机械上的三个应用程序是没什么显然差别的,只是必要安装一下音讯的指标服务器名字而已卡塔 尔(英语:State of Qatar)。

  • Application1:从顾客输入这里得到二个字符串消息,并将其发送到Application2.
  • Application2:在调整台上打字与印刷出流传的音讯。

注册应用程序到DotNetMQ

咱俩的应用程序为了接收DotNetMQ,要先挂号一下,只需操作三回,是八个非常轻巧的长河。运行DotNetMQ微电脑(DotNETMQ文件夹下的MDSManager.exe,如上所诉,暗中认可是在C:Programe FilesDotNetMQ文件夹下卡塔尔国,并在Applications菜单中开荒Application类表。点击Add New Appliction开关,输入应用程序名称。

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

365必发唯一官网 40

图 - 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方法就能够被调用来管理新闻。大家从MessageReceived伊夫ntArgs参数对象的Message属性能够赢得发送过来的音信。这几个音信的花色是IIncomingMessage。IIncomingMessage对象的MessageData属性实际包罗了由Application1发送的音信数据。由于它是一个字节数组,大家用UTF8编码把它调换来字符串。然后把文件新闻打印到调控台上。

365必发唯一官网 41

图 - 6:Application1通过DotNetMQ发送多个音信到Application2。

拍卖传入音讯之后,还需求来认同那几个音信。那表示音信已经不错接纳并拍卖。然后DotNetMQ将从音讯队列中把新闻删除。大家也能够用Reject方法拒却一个新闻(假设在一念之差的气象下大家不能够管理那几个音讯卡塔尔国。在此种气象下,该音讯将回到音讯队列,稍后再试着发到指标应用程序(若是在同三个服务器上存在另贰个Application2的实业,也说不佳发到另二个上卡塔尔。那是DotNetMQ系统的三个刚劲机制。因此,能够确认保证音信不会放任并相对能够被拍卖。若是你不认同或谢绝四个新闻,系统生龙活虎旦是被驳倒的。所以,尽管你的应用程序崩溃了,在您的应用程序平常运作后,照旧会接到音讯的。

要是您在平等台服务器上运维五个Application2的实例,哪贰个会吸收接纳新闻啊?在此种状态下,DotNetMQ会把信息顺序地发放那多少个实例。所以您可以创建多发送/采纳的系统。二个音讯只好被三个实例接受(实例选拔相互区别的音信卡塔 尔(阿拉伯语:قطر‎。DotNetMQ提供那全部效能和同盟。

新闻属性:传送法规(Transmit Rule卡塔 尔(英语:State of Qatar)

在出殡和安葬八个音讯此前,你可以像这么设置贰个新闻的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卡塔 尔(英语:State of Qatar)。假若叁个应用程序不要求采用信息,能够设置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用的不行卡塔 尔(英语:State of Qatar)的服务器。你能够用DotNetMQ微电脑配置/设计三个服务器图。

365必发唯一官网 42

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

在上海教室中,你见到了叁个包蕴5个节点的服务器图。深橙节点表示目前服务器(当前服务器正是你用DotNetMQ微处理器连接的要命卡塔尔国。直线表示五个节点(它们互相相邻节点卡塔 尔(阿拉伯语:قطر‎是可连接的(它们可以发送/选用音信卡塔尔国。服务器/节点图形中的名称是很主要的,它被用来向该服务器发送音信。

您可以双击图形中的一个服务器来编排它的质量。为了连接多个服务器,你要按住Ctrl键,点击第三个再点击第3个(断开连接也是风流倜傥律的操作卡塔 尔(阿拉伯语:قطر‎。你能够经过点击右键,选取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配置文件里手动定义路由的情事下卡塔 尔(英语:State of Qatar)。思忖那个境况,运转在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卡塔 尔(英语:State of Qatar)/(Destinations里存有RouteFactor的总额)。

Filters用于决定音讯使用哪个路由。假若贰个音信的习性和中间叁个过滤器相配,该音信就能够被路由。那有5个标准(XML的5个属性卡塔尔来定义三个过滤器:

  • SourceServer:音信的首先个源服务器,能够用this表示近年来服务器。
  • SourceApplication:开采音信的应用程序。
  • DestinationServer:新闻的最后指标服务器,能够用this表示前段时间服务器。
  • DestinationApplication:接纳音讯的应用程序。
  • TransmitRule:新闻传送法规的生机勃勃种(StoreAndForward,DirectlySend,NonPersistent卡塔尔国。

过滤音讯时,不会思谋并未有概念的尺度。所以,纵然具备的尺度都以空的(或直接没概念卡塔尔,那么富有的新闻都合乎这几个过滤器。独有全体的法则都非凡时,三个过滤器才合乎这些音信。若是多个音信正确相称(最少是过滤器定义的都非凡卡塔尔一个路由中的多少个过滤器,那么那些路由将被增选并行使。

Destinations是用来将音讯路由到其余服务器用的。二个目的服务器被选中是依附Route节点的DistributionType属性(前面解释过卡塔 尔(阿拉伯语:قطر‎决定的。一个destination节点必得定义三个属性

  • Server:指标服务器,能够用this表示这段时间服务器。
  • Application:目的应用程序,目的应用程序经常和音信的原指标程序是同样的,但是这里您能够重定向到另三个应用程序。
  • RouteFactor:那脾个性用于表澳优个对象服务器被选中的对峙比率,能够用来做负载均衡。要是你想把音信平均分发到独具服务器上,你能够把持有指标服务器的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 艾达pter(.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微处理器编辑服务器图,那几个值是自行安装的。

互联网传输消息

向二个互连网服务器的应用程序发音信是和向同一个服务器的应用程序发音讯相符轻易的。

三个简单易行的应用程序

让大家思索上面那几个网络:

365必发唯一官网 43

图 - 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分钟到位,大概有四百万人发短息到大家的劳动。

我们将会收取每一条短息,处理它(格式化短息文本,校正数据库,以便增添选手的票数卡塔尔,并要发送确认音讯给发送者。我们从两台服务器收到新闻,在四台服务器上拍卖新闻,然后从两台服务器上发送确认音信。大家一同有八台服务器。让我们看看完整的种类暗指图:

365必发唯一官网 44

图 - 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(非长久卡塔 尔(英语:State of Qatar)。当然,你能够发送StoreAndForward(持久性)新闻。那几个是程序运营的截图:

365必发唯一官网 45

图 - 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#类。MDSService和MDSServiceMethod七个特色是必得的,其余的特征是可选的(可是写上去是最棒了,你将急速会看见什么样会用那几个特色卡塔尔国。你提供劳动的措施必得有MDSServiceMehod性子,借使您不想精通一些办法,只要不加MDSServiceMethod脾气就能够了。

你还必得在你的劳动方式中确认音信,不然,这一个音讯(引起这么些服务方法调用的那几个卡塔尔就不会从新闻队列中删除,而大家的劳务措施将会被再度调用。如若大家不可能管理这一个音讯(举例,假诺邮件服务未有职业,大家不能发送时卡塔 尔(英语:State of Qatar)大家也能够拒绝它。假使我们否决了那个新闻,它稍后还有大概会发送给大家(很可靠卡塔 尔(阿拉伯语:قطر‎。你能够因此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安装目录卡塔 尔(阿拉伯语:قطر‎.

365必发唯一官网 46

图 - 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。新闻传送和章程调用是在同等台计算机上的七个应用程序之间进行的。

引用

书籍: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)
    • 首先次发布。

 

本文由www.bifa365365.com发布于365必发唯一官网,转载请注明出处:怎么设置和应用Beanstalkd专门的工作行列,Rabbit

关键词: www.bifa3653