betway必威-betway必威官方网站
做最好的网站

【betway必威】如何安装和使用Beanstalkd工作队列,

哪些设置和动用Beanstalkd职业行列(1)

介绍

不敢越雷池一步地宣布每一成分的天职安顿应用程序栈带来很多益处,富含轻巧的确诊难点时发出,规模迅猛的技巧,以至更清晰的治本范围波及的零部件。

在当今世界web服务的工程,叁个重大的零件实现上述场景涉及使用音讯队列和做事(或职分)。那个平常是弹性和灵活的应用程序很轻易达成和设置。他们是圆满的解体的不等部分之间的事务逻辑应用程序包时生产。

在这里篇小说中,我们的应用程序等级类别通信技术方案,我们将看看Beanstalkd创设这些部分的分别。

什么是Beanstalkd

Beanstalkd首先是寸草不留了多个风行的web应用程序的须要(Twitter上的来由)。近期,那是四个相对可信,易于安装的音信传递服务,是无所不至的初阶和使用。

如前所述,Beanstalkd的主要性用例是管制不相同部分和工人之间的职业流应用程序的配置通过职业行列和音信仓库,类似于此外受迎接的消除方案,比如RabbitMQ。但是,创造Beanstalkd使它有别于别的干活。

自创设以来,与另外技术方案,Beanstalkd意在成为贰个干活行列,并不是一把雨伞工具来满意广大体求。为了兑现这一指标,它看成一种轻量级的、火速有效的应用程序基于C编制程序语言。精益建筑还允许它是设置和行使特别轻松,使它符合大大多用例。

Features(特性)

能够监控职业回到ID,在创制再次回到,独有二个的特色使它有别于其余的Beanstalkd。提供一些此外风趣的功能是:

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

2.预先级—>与相当多增选同一,Beanstalkd提供了分化的天职的先行级来处理急切业务时索要。

3.布满 —->不相同的服务器实例能够布满类似于Memcached是何等做事的。

4.掩盖 —-> 有望因此蒙蔽它Infiniti制期限延迟的作业(即职分)。

5.第三方工具—>Beanstalkd附带各类第三方工具蕴含总计当先目标和依照web的保管理调控制台。

6.逾期 —->专业可以安装为过期,auto-queue之后(TT奥迪Q5 – 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安装:

下载并安装逼eanstalkd运营以下命令:

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 

betway必威 1


) 介绍 敬终慎始地发表每一成分的职责计划应用程序栈带来好些个好处,包涵轻便的检查判断难题时发生,规模迅...

在三个巨型的遍及式系统中,新闻队列是不行缺点和失误的中间件,能很好的缓慢解决异步音信、应用解耦、均衡并发等主题材料。在.net中,不经常开掘二个功用不错、安全可信赖、功效齐全的音讯组件,忍不住翻译过来,供大家急速预览。

1. 说明 

  在集团应用系统领域,相会前蒙受分裂系统里头的通讯、集成与重组,特别当面前遭遇异构系统时,这种布满式的调用与通信变得尤其主要。其次,系统中平时会有大多对实时性要求不高的而是施行起来相比较耗费时间的地点,比如发送短信,邮件提醒,更新小说阅读计数,记录客商操作日志等等,假使实时管理的话,在顾客访问量相当的大的事态下,对系统压力非常的大。

面临这么些主题素材,大家日常会将那个诉求,放在消息队列MQ中拍卖;异构系统里面利用音信实行报导。

    MQ全称为Message Queue, 新闻队列(MQ)是一种应用程序对应用程序的通讯格局。应用程序通过读写出入队列的新闻(针对应用程序的数目)来通讯,而无需专项使用连接来链接它们。信息传递指的是程序之间通过在音讯中发送数据进行通讯,实际不是因此一向调用互相来通讯,直接调用平日是用来诸如远程进度调用的能力。排队指的是应用程序通过 队列来通讯。队列的行使除去了接收和出殡和安葬应用程序同期实行的渴求。

  MQ是开支-生产者模型的一个标准的表示,一端往新闻队列中不只有写入音信,而另一端则足以读取只怕订阅队列中的音讯。

   RabbitMQ是贰个在AMQP基础上完整的,可复用的店堂信息系统。他依据Mozilla Public License开源左券。 

  音讯传递相较文件传递与远程进度调用(RPC)来讲,就如更胜一筹,因为它具有越来越好的阳台毫无干系性,并能够很好地扶助并发与异步调用。所以假若系统中冒出了如下情状:

  • 对操作的实时性须求不高,而需要进行的天职极为耗费时间;
  • 留存异构系统间的三结合;

  常常的能够思量引进消息队列。对于第一种境况,经常会选取音讯队列来管理试行时间较长的任务。引入的音信队列就成了信息管理的缓冲区。音信队列引进的异步通讯机制,使得发送方和接收方都并不是等待对方回来成功新闻,就足以继续试行下边包车型大巴代码,从而加强了多少管理的能力。尤其是当访谈量和数据流量异常的大的景况下,就足以结合消息队列与后台职分,通过避开高峰期对大数据开展管理,就足以有效收缩数据库管理数据的负荷。 

  本文简要介绍在RabbitMQ这一信息代理工科具,乃至在.NET中哪些选择RabbitMQ.

注:最早的著小编用windows服务运营音讯队列服务,可是自身在win10上测量试验出错,可活动改成调控台运转消息队列服务,然后用第三方工具注册服务(如:SrvanyUI)

2. 搭建碰着

  2.1 安装Erlang语言运营景况

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

  2.2 安装RabbitMQ服务端

  地址 

  下载安装。

betway必威,  使RabbitMQ以Windows Service的章程在后台运维:张开cmd切换来sbin目录下实行

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

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

  要查看和调节RabbitMQ服务端的情事,能够用rabbitmqctl这一个剧本。

  比方查看情形:

rabbitmqctl status

  betway必威 2

  假诺展现node未有连接上,须要到C:Windows目录下,将.erlang.cookie文件,拷贝到客户目录下 C:Users{客户名},这是Erlang的Cookie文件,允许与Erlang进行相互。

   使用命令查看客商:

rabbitmqctl list_users

betway必威 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  

betway必威 4

 

  2.3下载RabbitMQ的Client端dll

  可直接设置VS自带的NuGet程序包中的RabbitMQ.Client,也可活动下载并援用。

  下载地址:

  本身下载了那些 rabbitmq-dotnet-client-3.6.6-dotnet-4.5.zip

betway必威 5

   解压,大家需求的是这么些文件,以往会援用到vs的连串中:

betway必威 6

原文:

3.使用

  3.1在行使RabitMQ在此以前,先对多少个概念做一下表明

  

  RabbitMQ是八个音讯代理。他从音讯生产者(producers)这里收受消息,然后把新闻送给新闻花费者(consumer)在发送和收受之间,他能够依据设置的法则实行路由,缓存和长久化。

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

  • 生产(Producing)意思就是出殡和安葬。发送新闻的顺序就是三个劳动者(producer)。大家平时用"P"来表示:

       betway必威 7

  • 队列(queue)正是邮箱的称谓。音讯通过你的应用程序和RabbitMQ举办传输,它们只可以存款和储蓄在队列(queue)中。 队列(queue)容积未有范围,你要存款和储蓄多少音讯都足以——基本上是多少个最棒的缓冲区。四个生产者(producers)能够把音讯发送给同多少个队列,同样,多个买主(consumers)也能从同贰个行列(queue)中获取数据。队列能够画成那样(图上是队列的名目):

     betway必威 8

  • 开支(Consuming)和获得新闻是同样的情趣。贰个买主(consumer)正是三个等候获取新闻的顺序。咱们把它画作"C":

     betway必威 9

  平日,音讯生产者,音信成本者和新闻代理不在同一台机械上。

 

3.2 Hello Word

  上面来展现轻松的RabbitMQ的接纳:

      betway必威 10

 3.2.1 首先成立名称叫ProjectSend的调控台项目,须求援用RabbitMQ.Client.dll。那一个顺序作为Producer生产者,用来发送数据:

betway必威 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();
            }
        }
    }

betway必威 12

  

  首先,供给制造贰个ConnectionFactory,设置指标,由于是在本机,所以设置为localhost,即使RabbitMQ不在本机,只必要安装指标机器的IP地址大概机器名称就能够,然后设置前边创设的顾客名和密码。

  紧接着要开创叁个Channel,假设要发送新闻,须要创建一个队列,然后将消息宣布到那么些行列中。在成立队列的时候,唯有RabbitMQ上该队列不设有,才会去创立。新闻是以二进制数组的样式传输的,所以只要音讯是实业对象的话,供给系列化和接下来转向为二进制数组。

  未来客户端发送代码已经写好了,运营之后,新闻会发布到RabbitMQ的音信队列中,未来必要编克制务端的代码连接到RabbitMQ上去获取这一个新闻。

3.2.2创立名叫ProjectReceive的调整台项目,援用RabbitMQ.Client.dll。作为Consumer花费者,用来接收数据:

betway必威 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(); 
                }
            }
        }

betway必威 14

   和殡葬相同,首先需求定义连接,然后注脚音讯队列。要摄取新闻,须求定义一个Consume,然后在吸收接纳新闻的事件中管理数量。

 3.2.3 以后出殡和安葬和抽取的顾客端都写好了,让大家编写翻译实行起来

  发送音讯:

betway必威 15

  今后,名称叫hello的音信队列中,发送了一条音信。那条音讯存款和储蓄到了RabbitMQ的服务器上了。使用rabbitmqctl 的list_queues能够查看全数的音信队列,以致在那之中的音信个数,能够看见,近来Rabbitmq上唯有叁个新闻队列,里面唯有一条音讯:

betway必威 16

  也得以在web处理分界面查看此queue的相关音信:

 betway必威 17

 

  接收新闻:

betway必威 18

   既然音信已经被接到了,那大家再来看queue的剧情:

betway必威 19

  可以预知,消息中的内容在接受之后已被删除了。

正文: 

3.3 专门的工作行列

  前边的例证呈现了怎么在钦点的新闻队列发送和抽打消息。

  未来我们创造贰个办事行列(work queue)来将一部分耗费时间的职责分发给多少个工作者(workers):

   betway必威 20

  工作行列(work queues, 又称职责队列Task Queues)的机要怀恋是为了幸免马上执行并等候一些占用多量能源、时间的操作完毕。而是把职务(Task)当做音信发送到队列中,稍后管理。三个运营在后台的劳重力(worker)进度就能抽取任务然后管理。当运营多个工作者(workers)时,职务会在它们之间分享。

  这么些在网络使用中十三分有用,它能够在短短的HTTP伏乞中拍卖部分复杂的职分。在一些实时性须求不太高的位置,大家能够拍卖完首要操作之后,以音讯的法子来管理其余的不重大的操作,举例写日记等等。

准备

  在首先有的,发送了一个暗含“Hello World!”的字符串音讯。现在出殡一些字符串,把这个字符串当作复杂的天职。这里运用time.sleep()函数来效仿耗费时间的任务。在字符串中加上点号(.)来代表职责的复杂程度,二个点(.)将会耗费时间1分钟。比方"Hello..."就能耗费时间3分钟。

对后面示例的send.cs做些轻易的调动,以便能够发送随便的音信。那个程序会遵照布署发送职务到大家的干活行列中。

betway必威 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!");
}

betway必威 22

 

随时大家修改接收端,让她依赖新闻中的逗点的个数来Sleep对应的秒数:

betway必威 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");
            }
        }
    }
}

betway必威 24

 

轮询分发

  使用工作行列的贰个低价就是它能够相互的拍卖队列。若是堆成堆了广大职分,我们只须求增加越来越多的工作者(workers)就足以了,扩大很简单。

这段日子,大家先运转四个接收端,等待接受音信,然后运营三个出殡和下葬端起来发送消息。

betway必威 25 

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

  然后可以看来,多个接收端依次接收到了产生的音信:

betway必威 26 

私下认可,RabbitMQ会将各类信息依照顺序依次分发给下几个买主。所以各种客商接受到的新闻个数大致是平均的。 这种音讯分发的办法叫做轮询(round-robin)。


3.4 音讯响应

当管理一个比较耗费时间得职分的时候,大概想明白开支者(consumers)是不是运营到八分之四就挂掉。在脚下的代码中,当RabbitMQ将信息发送给花费者(consumers)之后,登时就能够将该音讯从队列中移除。此时,要是把拍卖那几个消息的工作者(worker)停掉,正在管理的那条音信就能遗弃。同一时候,全体发送到这些工小编的还未曾管理的音信都会舍弃。

咱俩不想不见任何任务新闻。如果三个劳力(worker)挂掉了,大家期望该消息会重复发送给其余的劳力(worker)。

为了堤防新闻错过,RabbitMQ提供了音信响应(acknowledgments)机制。花费者会经过三个ack(响应),告诉RabbitMQ已经吸取并拍卖了某条音讯,然后RabbitMQ才会自由并剔除那条音信。

倘若花费者(consumer)挂掉了,未有发送响应,RabbitMQ就能够以为音讯尚未被全然管理,然后再一次发送给别的客户(consumer)。那样,固然工作者(workers)不时的挂掉,也不会放任音信。

消息是没有过期这么些定义的;当工作者与它断开连的时候,RabbitMQ会重新发送消息。那样在拍卖三个耗费时间不行长的音讯职务的时候就不会出问题了。

音讯响应默许是开启的。在后面包车型客车事例中使用了no_ack=True标志把它倒闭。是时候移除那些标记了,当工小编(worker)完结了职分,就发送八个响应。

betway必威 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);
}

betway必威 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 完整实例

近来将具有那个身处一块儿:

发送端代码如下:

betway必威 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!");
}

betway必威 30

 

接收端代码如下:

betway必威 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);
            }
        }
    }
}

betway必威 32

 

下载例子 - 534 KB

4 处理分界面

RabbitMQ管理分界面,通过该界面能够查看RabbitMQ Server 当前的图景,该界面是以插件格局提供的,何况在安装RabbitMQ的时候已经自带了该插件。要求做的是在RabbitMQ调节台分界面中启用该插件,命令如下:

rabbitmq-plugins enable rabbitmq_management

betway必威 33

近日,在浏览器中输入 http://*server-name*:15672/ server-name换来机器地址可能域名,假使是本地的,直接用localhost(RabbitMQ 3.0事先版本端口号为55672)在输入之后,弹出登录分界面,使用大家事先创造的客户登陆。

betway必威 34 .

在该分界面上得以看出如今RabbitMQServer的具备情状。

小说大要

5 总结

本文简介了消息队列的相关概念,并介绍了RabbitMQ音讯代理的基本原理以致在Windows 上怎么着安装RabbitMQ和在.NET中什么运用RabbitMQ。音讯队列在营造布满式系统和增加系统的可扩张性和响应性方面有所很关键的效果,希望本文对你明白音讯队列乃至怎么着使用RabbitMQ有所扶助。

 

摘自:

betway必威 35

  • 介绍
  • 哪些是音讯传递?
  • 什么是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服务脱机或在措施调用期间发生错误,那么客商端应用程序将得到二个丰盛)。

betway必威 36

图 - 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为前缀的类。

怎么要壹个新的新闻代理?

消息代理的须求性

先是,作者将演示八个急需音信代理的轻便景况。

在本人的事体经历中,小编看出过一些非常不好且不平时的异步集团应用集成技术方案。平时是运作在一台服务器上的三个程序试行一些义务,而且产生一些数码,然后将结果数据发送到另一台服务器上的另贰个程序。第贰个应用在数额上进行此外职务或计算结果(那台服务器在一样网络中大概通过网络连接)。别的,音讯数据必需是长久的。尽管长途程序没有专业或互连网不可用,新闻必得第临时间发送过去。

让大家来探视下边包车型大巴陈设性图:

betway必威 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突显于下图。

betway必威 38

图 - 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开采的。

从客商角度来看,作者只是想透过“信息数据,指标服务器和应用程序名称”来恒定本人的代办。其余的自个儿都不关怀。他将会基于须求在网络上往往路由三个音讯,最终发送到指标服务器的指标程序上。作者的音信传送系统必得为自家提供这么些便利。那是本人的出发点。小编根据那点光景设计了新闻代理的布局。下图显示了本身想要的。

betway必威 39

图 - 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(要是你用的是六11位系统,那么将实行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。最后,你的应用程类别表应该像上边那样。

betway必威 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();
        }
    }
}

本文由betway必威发布于网络技术,转载请注明出处:【betway必威】如何安装和使用Beanstalkd工作队列,

TAG标签: betway必威
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。