zoukankan      html  css  js  c++  java
  • 基于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的发布者/订阅者模式的开发总结。

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

       

     
     
    分类: 系统集成
  • 相关阅读:
    python3.x:No matching distribution found for PIL
    类似No module named 'bs4'等错误的解决方法
    微信小程序(一)
    Eclipse (eclipse-jee-luna-SR2-win32)4.4.2 , jdk1.7, pydev 4.5.5版本的 完成的python环境集成
    C#学习笔记(12)——三种方法操作XML
    WPF学习笔记(3)——style
    ASP.NET学习笔记(2)——用户增删改查
    jquery加载页面的方法(页面加载完成就执行)
    ASP.NET学习笔记(1)——VS自动引入命名空间快捷键
    临时2017-6-19 00:02:03
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2920192.html
Copyright © 2011-2022 走看看