• 热门专题

RabbitMq应用一

作者:CL静淡  发布日期:2016-12-22 20:36:19
Tag标签:RabbitMq应用一  
  •    RabbitMq应用一

     RabbitMQ的具体概念,百度百科一下,我这里说一下我的理解,如果有少或者不对的地方,欢迎纠正和补充。

     一个项目架构,小的时候,一般都是传统的单一网站系统,或者项目,三层架构,到现在的MVC架构。随着用户访问量越来越多,系统业务越来越多,会出现以下问题:

       1.修改完大量代码后,不敢更新,因为都是集成在一起,互相耦合性非常强,一处报错,满盘皆挂;

         2.整个项目文件夹,层级越来越多,对新来的同事很不友好,文件不可避免的会乱放,重复的过多,甚至为了紧急更新,会把很多原本的需要编译的代码,挪到一般处理程序中,

        时间越长,越会发现,整个代码结构像一锅粥一样;

         3.会有很多地方需要记录日志,邮件,短信等等很多需要异步的操作,如果访问量过高,会把这个系统拖垮。

    上述问题出现一定时间后,一定会重构整个,进行业务分离,SOA架构服务化,这就涉及到多个应用相互之间的通信,常见的方式,是通过API的方式通过JSON的方式,进行数据交互,

    这种做法实时性很高,但是对单个业务系统的高峰期压力还是非常大的,需要对但业务API系统进行负载均衡,这时候,如果说把一些要求实时性相对低一些,并且特别消耗性能的请求,摘出去慢慢处理的话,消息队列就派上用场了,引入的消息队列就成了消息处理的缓冲区。消息队列引入的异步通信机制,使得发送方和接收方都不用等待对方返回成功消息,就可以继续执行下面的代码,从而提高了数据处理的能力。尤其是当访问量和数据流量较大的情况下,就可以结合消息队列与后台任务,通过避开高峰期对大数据进行处理,就可以有效降低数据库和程序处理数据的负荷。

    一 搭建环境

    RabbitMq是由erlang语言开发,所有到先安装erlang语言的环境,传送门下载,并且安装,默认安装后会自动配置一个环境变量ERLANG_HOME ,如果没配置的话,手动配置一下,指向erlang安装目录就可以了。

    安装好erlang语言环境,我们去下载rabbitmq服务了。地址http://www.rabbitmq.com/download.html,下载RabbitMq Server.

    下载完,安装完毕后,打开安装目录到sbin下 

     我们右键CMD,用管理员身份打开,然后切到上图这个目录下,执行3行命令

    rabbitmq-service install
    rabbitmq-service enable
    rabbitmq-service start
    开启rabbitMq的服务,这时候可以自己查看服务是否开启。
    安装好以后,我们使用rabbitmqctl list_users命令,是列出当前服务用户的列表,

    这个用户是我自己添加的,刚开始的时候是默认有一个用户guest
    我们可以自己添加用户,并且设置密码,设置权限,设置管理员操作,还可以删除用户,更改密码
    rabbitmqctl  add_user  feige  habi  添加用户,账号feige,密码habi
    rabbitmqctl  set_permissions  feige  '.*'  '.*'  '.*'给feige这个用户设置对所有消息队列设置和配置,读,写的权限
    rabbitmqctl  set_user_tags feige administrator给feige这个用户设置成管理员
    rabbitmqctl delete_user feige  这个是删除用户
    rabbitmqctl change_password feige  1234修改feige的密码

    运行下面命令来启用管理插件:rabbitmq-plugins enable rabbitmq_management
    默认端口:http://localhost:15672/#/这个是可以监控的后台。

    
    综上,RabbitMq的环境已经部署完毕,一些基本命令已经熟悉了,下面开始使用

    二 基本使用
      

    在.NET中使用RabbitMQ需要下载RabbitMQ的客户端程序集,可以到官网下载,下载解压后就可以得到RabbitMQ.Client.dll,这就是RabbitMQ的客户端。

    在使用RabitMQ之前,需要对下面的几个基本概念说明一下:

    RabbitMQ是一个消息代理。他从消息生产者(producers)那里接收消息,然后把消息送给消息消费者(consumer)在发送和接受之间,他能够根据设置的规则进行路由,缓存和持久化。

    我们用VS2012+,可以直接从nuget控制台命令,添加

    Install-Package RabbitMq.Client -version 3.6.5

    生产(Producing)意思就是发送。发送消息的程序就是一个生产者(producer)。

    队列(queue)就是邮箱的名称。消息通过你的应用程序和RabbitMQ进行传输,它们只能存储在队列(queue)中。 队列(queue)容量没有限制,你要存储多少消息都可以——基本上是一个无限的缓冲区。多个生产者(producers)能够把消息发送给同一个队列,同样,多个消费者(consumers)也能从同一个队列(queue)中获取数据。队列可以画成这样(图上是队列的名称):

    消费(Consuming)和获取消息是一样的意思。一个消费者(consumer)就是一个等待获取消息的程序

    通常,消息生产者,消息消费者和消息代理不在同一台机器上。

    下面,我们用.net代码,来分别做一个制造者,发送消息的控制台,一个消费者,接收消息的控制台,当然,我们在本机做一下实验,。

    /// <summary>
        /// 消息生产者,客户端消息存进队列中
        /// </summary>
        class Program
        {
            static void Main(string[] args)
            {
                //创建链接工厂,设置目标,用户,密码
                var factory = new ConnectionFactory();
                factory.HostName = '127.0.0.1';
                factory.UserName = 'feiyang';
                factory.Password = '123456';
                //开启当前服务设置的用户的链接
                using (var connection =  factory.CreateConnection())
                {
                    //开启一个频道
                    using (var channel = connection.CreateModel())
                    {
                        //创建一个队列
                        channel.QueueDeclare('firstQueue',false,false,false,null);
                        byte[] body = null;
                        //消息是以二进制数组的形式传输的,所以如果消息是实体对象的话,需要序列化和然后转化为二进制数组。
                        for (int i = 0; i < 100000; i++)
                        {
                            body = Encoding.UTF8.GetBytes('这是第-----'+i+'-----条消息');
                            channel.BasicPublish('', 'firstQueue', null, body);
                            Console.Write('成功发送第-----'+i+'-----条消息!');
                        }
                        Console.ReadKey();
                    }
                }
            }
        }

    上述是消费者控制台代码,我下面那个循环时测试的10W条数据,不断的发送和另一个控制台不断的获取消息,测试下来还不错性能。。。这个例子发送的消息比较简单,直接转成二进制就可以了,但是如果我们

    用到对象的话,就要先反序列化,再转成二进制。

     /// <summary>
        /// 消息消费者读取消息队列
        /// </summary>
        class Program
        {
            static void Main(string[] args)
            {
                var factory = new ConnectionFactory();
                factory.HostName = '127.0.0.1';
                factory.UserName = 'feiyang';
                factory.Password = '123456';
                using (var connection  = factory.CreateConnection())
                {
                    using (var channel = connection.CreateModel())
                    {
                        //还是连接到哪个队列
                        channel.QueueDeclare('firstQueue',false,false,false,null);
                        //定义消息接受者
                        var customer = new QueueingBasicConsumer(channel);
                        //从指定队列获取消息
                        channel.BasicConsume('firstQueue',true,customer);
                        //开始不断循环出队列的消息
                        while (true)
                        {
                            var ea = (BasicDeliverEventArgs)customer.Queue.Dequeue();
                            //将消息二进制转回字符串
                            var msg = Encoding.UTF8.GetString(ea.Body);
                            Console.WriteLine(msg);
                        }
                        //sw.Stop();
                        //Console.WriteLine('共用时' + sw.ElapsedTicks + '毫秒');
                        //Console.ReadKey();
                    }
                }
            }
        }

    这个是消费者端。。下面我们运行一下。

    附加一句,当队列中有数据的话,用rabbitmqctl list_queues,可以列出所有队列名称,和队列中的消息数量

    运行的消息生产者客户端后,往队列firstQueue中发送了10W条消息,我们再运行消费者端。

    可见,队列firstQueue中的消息正在不断取出,而且速度很快。

    这些是一些RabbitMq的一些基本使用,后面会陆续增加深入的学习心得。

延伸阅读:

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规