好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

基于RabbitMQ使用的几点实践经验总结

基于RabbitMQ使用的几点实践经验总结

基于RabbitMQ使用的几点实践经验总结

RabbitMQ是基于高级消息队列的AMQP协议的技术实现,是一个开源产品,其本身属于一个“半成品”的消息中间件,提供了丰富的开发文档和多种客户端API(如JAVA\.NET等)的开发组件,RabbitMQ服务器本身主要承担通讯和传输的功能,支持多种消息架构和模式,实践中需要采用哪些消息架构和模式,完全取决于客户端的设计和开发。 在企业实践中,设计或开发不当会造成严重的后果,特别是涉及到跨系统的交互和集成,对系统稳定性和可靠性等方面性能要求很高,本文总结了的几点实践经验,供各位同学参考。

    一、关于RabbitMQ 部署总结。

     如果使用早期在Windows下部署的RabbitMQ版本(因为早期的Erlang/OTP是基于32位的,Erlang/OTP R15B01以后开始支持64位Windows),生产环境下是不支持64位的,32位的在性能和吞吐量方面有很大影响,如果目前使用32位的应该升级到64位的,以提高系统处理能力。

     二、关于 RabbitMQ 消息持久化的总结。

       在OA与SAP等其他系统进行交互和集成的时候,发现供应商的客户端开发代码中没有进行持久化,如果RabbitMQ服务器或服务进行重启后,将导致消息的丢失,从而造成对业务的影响。而自行开发和集成的代码中已进行了消息持久化,因此通知供应商进行修改代码并给出了相应C#示例代码供参考:

       

   private   const   string  EXCHANGE_NAME =  "  xxx.bpms.ehr  "  ; 

          static   void  Main( string  [] args)
        {
            ConnectionFactory factory  =  new  ConnectionFactory { HostName =  "  localhost  " , VirtualHost= @"  /  " , UserName =  "  admin  " , Password =  "  12345678  "   };
          
              using  (IConnection connection =  factory.CreateConnection())
            { 
                  using  (IModel channel =  connection.CreateModel()) 
                {
                   
                      //  交换机持久化 
                    channel.ExchangeDeclare(EXCHANGE_NAME,  "  topic  " , true  );

                      //  队列持久化 
                    channel.QueueDeclare( "  xxx.bpms.ehr  " ,  true ,  false ,  false ,  null  );
                    
                    channel.QueueBind(  "  xxx.bpms.ehr  " , EXCHANGE_NAME,  "  EHR.EmpMessageUpdate  " ,  null  );


                         byte [] payload = File.ReadAllBytes( @"  c:\employeeSec1.xls  "  );
                     
                       Stream s  =  new   MemoryStream(payload);

                        

                       SystemComponent.ADHelper.XlsToDataTable xtd  =  new   SystemComponent.ADHelper.XlsToDataTable();
                       SystemComponent.ADHelper.FileConvert fct  =  new   SystemComponent.ADHelper.FileConvert();

                      DataTable dt  =  xtd.RenderFromExcel(s);

                        string  ls_json = JsonConvert.SerializeObject(dt,  new   DataTableConverter());

                   
 
                       IMapMessageBuilder mapmsg  =  new   MapMessageBuilder(channel);
                       
                      
                           //  数据持久化 
                        ((IBasicProperties)mapmsg.GetContentHeader()).DeliveryMode =  2  ;
                        
                        
                        channel.BasicPublish(EXCHANGE_NAME,   "  EHR.EmpMessageUpdate  "  , (IBasicProperties)mapmsg.GetContentHeade(),System.Text.Encoding.UTF8.GetBytes(ls_json));
                        

                } 
            } 
        } 

        消息持久化需要同时进行 交换机持久化、队列持久化、数据持久 ,也可以在RabbitMQ的管理界面中查看是否进行了持久化,如下图:
        

  

          三 、关于 RabbitMQ的发布者/订阅者模式 的开发总结。

             在实际开发中发现,发布者和订阅者的两者的声明交换机和队列参数需要保持一致(无论是相同的客户端开发语言还是不同的客户端开发语言都适用),如果发布者加入了持久化参数,而订阅者没有加入,则会导致交互不成功,无法消费相应消息,这点需要特别注意,以确保运行成功。

   

 

 

分类:  系统集成

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于基于RabbitMQ使用的几点实践经验总结的详细内容...

  阅读:41次