ActiveMQ和RabbitMQ的区别?
-
ActiveMQ 需要借助Zookeeper搭建集群,RabbitMQ 已经内部实现集群,不需要手动搭建集群。
-
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
相关评论