ActiveMQ和RabbitMQ的区别?

2019-08-10 阅读数:1126
  1. ActiveMQ 需要借助Zookeeper搭建集群,RabbitMQ 已经内部实现集群,不需要手动搭建集群。

  2. RabbitMQ 相对于ActiveMQ在高并发的情况下性能更好。


    RabbitMQ简介

     在介绍Rabbitmq之前先给大家介绍一下MQ,MQ是什么?

    MQ全称是Message Queue,可以理解为消息队列的意思,简单来说就是消息以管道的方式进行传递。

    既然我们知道了MQ是什么,那我们来说说RabbitMQ是什么?

    RabbieMQ是一个开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据,rabbitmq是使用Erlang语言来编写的,并且rabbitmq是基于amqp协议的。

    可能很多人不理解AMQP协议是什么?

    AMQP:高级消息队列协议。他是应用层协议的一个开放标准,为面对消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不接受产品、开发语言等条件的限制。简单理解就是定义了一个规范,而rabbitmq就是实现了这个规范。

    应用场景         

       在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理(请求与动作分离),而这种异步处理的    方式大大的节省了服务的请求响应时间,从而提高了系统的性能等。

    RabbitMQ一些优秀的特点:

    1.除了Qpid,RabbitMQ是唯一一个实现了AMQP标准的消息服务器;

    2.可靠性,RabbitMQ的持久化支持,保证了消息的稳定性;

    3.高并发,RabbitMQ使用了Erlang开发语言,Erlang是为电话交换机开发的语言,天生自带高并发光环,和高可用特性;

    4.集群部署简单,正是应为Erlang使得RabbitMQ集群部署变的超级简单;

    5.社区活跃度高,根据网上资料来看,RabbitMQ也是首选;

    RabbitMQ中一些相关名词:

    Broker:简单来说就是消息队列服务器实体。

    Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。

    Queue:消息队列载体,每个消息都会被投放到一个或多个队列。

    Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。

    Routing Key:路由关键字,exchange根据这个关键字进行消息投递。

    vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。

    producer:消息生产者,就是投递消息的程序。

    consumer:消息消费者,就是接收消息的程序。

    channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。

    RabbitMQ消息发送原理

    首先就是连接RabbitMQ,你的应用程序和RabbitMQ Server之间会创建一个TCP连接,一旦TCP打开,并通过了认证,认证就是你试图连接RabbitMQ之间发送的RabbitMQ服务器连接信息和用户名密码,一旦认证通过,你的应用程序和RabbitMQ就创建了一条AMQP信道(Channel)。

    信道是创建在真是TCP上的虚拟连接,AMQP命令都是通过信道发送出去的,每个信道都会有一个唯一的ID,不论是发布信息,订阅队列或者介绍信息都市通过信道完成的。

    为什么不通过TCP直接发送命令?

    对于操作系统来说创建和销毁TCP会话是非常昂贵的开销,假设高峰期每秒有成千上万条连接,每个连接都要创建一条TCP会话,这就造成了TCP连接的巨大浪费,而且操作系统每秒能创建的TCP也是有限的,因此很快就会遇到系统瓶颈。

    如果我们每个请求都使用一条TCP连接,既满足了性能的需要,又能确保每个连接的私密性,这就是引入信道概念的原因。

      

    RabbitMQ执行流程

     消息生产者投递消息到exchange,Exchange根据某种路由规则路由到队列,消费者只需要监听队列进行消费就行,

    生产者不需要关心要把消息投送到哪个队列,接收者只需要监听队列进行消费,从而做到解耦。

    消息的持久化       

    RabbitMQ 在重启服务器会导致消息丢失,那么怎么保证RabbitMQ在重启的时候不丢失呢?那就是持久化。

    1.交换机持久化  Durable:是否持久化参数设为True即可

    2.队列持久化  Durable:是否持久化参数设为True即可

    这样就可以了  ,我们把服务器重启下,我们的消息还在,我这边就不贴图了。

    持久化的工作原理

       RabbitMQ会将你的持久化消息写入磁盘上的持久化日志文件,等消息被消费后,RabbitMQ会把这条信息标识为等待垃圾回收。

    持久化的缺点

    消息持久化的有点显而易见,但缺点也很明显,那就是性能,因为要写入硬盘要比写入内存性能较低很多,从而降低了服务器的吞吐量,尽管使用SSD硬盘可是使事情得到环节,但他仍然吸干了RabbitMQ的性能,当消息成千上万条要写入硬盘的时候,性能的降低就显而易见了。

    虚拟主机

    每个RabbitMQ都能创建很多vhost,我们称之为虚拟主机,每个虚拟主机其实都市mini版的RabbitMQ,拥有自己的队列,交换器,绑定,权限机制。

    vhost特性

    RabbitMQ默认的vhost是"/"开箱即用;
    多个vhost是隔离的,多个vhost无法通讯,并且不用担心命名冲突(队列和交换机和绑定),实现了多层分离;
    创建用户的时候必须指定vhost;
    vhost操作


    --------------------- 
    版权声明:本文为CSDN博主「卿染」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qq_40296032/article/details/90812358

声明: 本文采用 BY-NC-SA 协议进行授权. 转载请注明转自: ActiveMQ和RabbitMQ的区别?

相关评论

验证码: