ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

消息中间件之RabbitMQ

2021-10-22 22:02:46  阅读:197  来源: 互联网

标签:exchange 队列 中间件 RabbitMQ 交换机 消息 消息中间件


何为中间件

中间件是将具体业务和底层逻辑解耦的软件,分为:MOM(消息中间件)、RPC(远程过程调用中间件)、UDA(数据访问中间件)、TPM(交易中间件)等。
消息中间件,又称为消息队列、消息队列中间件,分为RabbitMQ、ActiveMQ、Kafka等。

原理

在这里插入图片描述
各部分的名字和作用?
1.Brocker:消息队列服务器实体,Rabbitmq可以作为一个选择。
2.Exchange:消息交换机,用于接收、分配消息。指定消息按什么规则,路由到哪个队列。
3.Queue:消息队列,用于存储生产者的消息。每个消息都会被投入到一个或者多个队列里。
4.Binding Key:绑定关键字,用于把交换器的消息绑定到队列中,它的作用是把exchange和queue按照路由规则binding起来。
5.Routing Key:路由关键字,用于把生产者的数据分配到交换器上。exchange根据这个关键字进行消息投递。
6.Vhost:虚拟主机,一个broker里可以开设多个vhost,用作不用用户的权限分离。
7.Producer:消息生产者,就是投递消息的程序。
8.Consumer:消息消费者,就是接受消息的程序。
9.Channel:信道,消息推送使用的通道。可建立多个channel,每个channel代表一个会话任务。

使用流程

使用流程?
1.消息接收客户端连接到消息队列服务器,打开一个channel。
2.客户端声明一个exchange,并设置相关属性。
3.客户端声明一个queue,并设置相关属性。
4.客户端使用routing key,在exchange和queue之间建立好绑定关系。
5.消息发布客户端投递消息到exchange。
6.exchange接收到消息后,就根据消息的key和已经设置的binding,进行消息路由,将消息投递到一个或多个队列里。
总结起来就是:生产者发送一条消息给交换机——交换机根据关键字匹配到对应的队列——将消息存入队列——消费者从队列中取出消息使用。

队列模式

在官网中有明确的说明:http://www.rabbitmq.com/getstarted.html
1.简单队列模式:一个生产者对应一个消费者。
在这里插入图片描述
2.工作队列模式:一个生产者产生的消息可以供多个消费者消费,但是一个消息只能被其中一个消费者消费。
在这里插入图片描述

3.发布/订阅模式:多了一个交换机,生产者将消息发送到交换机上,交换机发送消息给各个队列,此时,一个消息可以被多个消费者获取。
值得一提的是,这又叫广播模式,是最常用的模式了,在ITOO中使用的就是这种模式。
在这里插入图片描述

4.路由模式:又多了一个routing key,生产者发送消息带有routingkey,消费者选择自己需要的消息进行消费,也配置一个routing key。
在这里插入图片描述

5.主题模式:又多了一个通配符,这样消费端如果需要好几种消息的时候,不用一个一个的设置,直接用通配符可以接收自己想要的各种消息。
在这里插入图片描述

6.RPC(远程调用):c对s说“我这有个任务需要你的帮助”,s处理完后,将结果返回给c。
在这里插入图片描述

为什么选择rabbitMQ

1.除了Qpid,RabbitMQ是唯一一个实现了AMQP标准的消息服务器;
2.可靠性,RabbitMQ的持久化支持,保证了消息的稳定性;
3.高并发,RabbitMQ使用了Erlang开发语言,Erlang是为电话交换机开发的语言,具备高并发和高可用特性
4.集群部署简单,正是因为Erlang使得RabbitMQ集群部署变的超级简单;
5.社区活跃度高,根据网上资料来看,RabbitMQ也是首选;

应用场景

RabbitMQ以至于MQ的应用场景有4个:异步处理、应用解耦、流量削峰、日志处理。

异步处理

案例:用户下单后,订单系统完成持久化处理后,将消息写入消息队列,返回用户订单下单成功。
库存系统订阅下单信息(消息队列),采用拉/推的方式,获取下单信息后,进行库存操作。

流量削峰

在秒杀活动中,极短的时间内,有大量的请求涌入,如果都从数据库层面操作,就会让数据库瘫痪。
解决办法就是加入消息队列,这样就将请求“积压”在了消息队列中,数据库能尽可能多地调用就调,调用不了的可以先存着。
当然,消息队列也有满的时候,如果超过了容量,它就会直接抛弃用户请求或跳转到错误页面。

日志处理

日志处理和流量削峰的过程大致一样,解决的是大量日志传输的问题。Rabbitmq也能进行日志处理,但是我们一般使用Kafka进行日志处理。

转载自https://blog.csdn.net/qsbbl/article/details/82947284

kafka和RabbitMQ的区别

1.应用场景方面
RabbitMQ:用于实时的,对可靠性要求较高的消息传递上。
kafka:用于处于活跃的流式数据,大数据量的数据处理上。

2.语言方面
RabbitMQ是由内在高并发的erlanng语言开发,用在实时的对可靠性要求比较高的消息传递上。

kafka是采用Scala语言开发,它主要用于处理活跃的流式数据,大数据量的数据处理上

3.吞吐量方面
RabbitMQ:支持消息的可靠的传递,支持事务,不支持批量操作,基于存储的可靠性的要求存储可以采用内存或硬盘,吞吐量小。
kafka:内部采用消息的批量处理,数据的存储和获取是本地磁盘顺序批量操作,消息处理的效率高,吞吐量高。

4.Brokerr与Consume交互方式不同

RabbitMQ 采用push的方式

kafka采用pull的方式

5.集群负载均衡方面
RabbitMQ:本身不支持负载均衡,需要loadbalancer的支持
kafka:采用zookeeper对集群中的broker,consumer进行管理,可以注册topic到zookeeper上,通过zookeeper的协调机制,producer保存对应的topic的broker信息,可以随机或者轮询发送到broker上,producer可以基于语义指定分片,消息发送到broker的某个分片上。

相关知识

AMQP理论
即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,RabbitMQ遵循此协议。
ACK机制
每次消费者取出消息时会通知队列,我拿到了,当队列接收到这条消息,就会把消息删除,这是默认的ACK机制。如果在接收消息之后,消费者挂掉,或者任何情况没有返回ack,队列中这条消息将不会删除,可以一直存着,等待其他消费者来取。
Erlang
我们知道,安装Rabbitmq时,需要先下载安装Erlang。因为Rabbitmq是由Erlang语言编写的。

参考:

  1. https://blog.csdn.net/weixin_43194723/article/details/114263025
  2. https://blog.csdn.net/qsbbl/article/details/82941986

标签:exchange,队列,中间件,RabbitMQ,交换机,消息,消息中间件
来源: https://blog.csdn.net/PANDORA_A/article/details/120913825

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有