兔子是什么意思(附详细解释)
如果有更好的建议或者想看更多关于综合百科技术大全及相关资讯,可以多多关注茶馆百科网。

今天,我要给大家带来一个关于RabbitMQ兔的训练策略。兔子在RabbitMQ中的意思是兔子,意思是跑得和兔子一样快。是一个轻量级、高可用性的消息队列,支持多种消息传递协议。RabbitMQ是用Erlang语言写的,Erlang语言是自然适合高并发.的语言
他们都喜欢兔子吗?可爱的小兔子在我们的工作中扮演着手机的角色,毫不夸张的说现在是阿里的最爱。我在RabbitMQ前面介绍过兔子,那么MQ代表什么?其实大家都知道MessageQueue的缩写,用官方的话来说,RabbitMQ就是一只开源的消息队列系统.我们来看看这只小兔子是怎么和小羽一起培养出来的。
前言
市面上有很多主流的MQ,比如ActiveMQ、RabbitMQ、RocketMQ、Kafka、ZeroMQ等等。阿里巴巴原来用的是ActiveMQ,但是随着业务的不断发展,ActiveMQIO模块出现了瓶颈。后来阿里巴巴通过了一系列优化,还是不能很好的解决。之后,阿里巴巴专注于主流消息中间件kafka,但kafka无法满足他们的要求,尤其是在低延迟和高可靠性.
所以RocketMQ是站在巨人(卡夫卡)的肩膀上,经过优化,更符合互联网公司的特点。
作为一个非常流行的消息中间件,RabbitMQ具有非常丰富的特性和优势:高可靠性、路由灵活、集群扩张性高、高可用、支持多种协议、支持多种客户端和有着丰富的插件系统.
RocketMQ广泛应用于阿里集团的交易、充值、流计算、消息推送、日志流式处理、binglog分发等场景。
概念
RabbitMQ是Erlang语言开发的AMQP的开源实现。高级消息队列协议AMQP:高级消息队列.它是应用层协议的开放标准,是为面向消息的中间件设计的。基于该协议,客户端和消息中间件可以不受产品、开发语言等条件的限制进行消息传输。
RabbitMQ最初起源于金融系统,在分布式系统中用于存储和转发消息,在易用性、扩展性、高可用性等方面表现良好。
以我们经常谈论的订单系统,为例。一般情况下,订单系统调用库存系统的接口。如下所示:
这种解决方案会导致许多问题。当库存系统无法访问时,我们的订单系统的库存减少将会失败。
当我们使用消息队列,时,用户下单后,订单系统执行持久化处理,将消息写入消息队列,并返回用户下单成功;订阅订购的消息,通过拉/推获取订购信息。库存系统根据订购信息进行库存操作。
这样,即使下单时库存系统出现问题,也不会影响正常下单,因为下单后,订单系统已经写入消息队列,其他操作都不关心,实现了订单系统和库存系统之间的应用解耦。
使用场景
以我们的用户注册为例。注册后,用户需要发送注册邮件和注册消息。如下所示:串行模式:
并行模式:
当我们使用消息队列时,它不再是必要的业务逻辑,只是异步处理.如下:
应用解耦
以我们经常提到的秒杀,为例。想必大家都经历过天猫淘宝的双11。这个时候,每秒钟的需求会在某个时间突然增加,比如晚上0点。如果不升级系统结构,我们受不了这么多请求,系统会直接崩溃。当我们使用消息队列时,当我们在高峰期,时,许多用户进来。例如,每秒有5000个请求。我们只需要将这5000个请求放入消息队列中。系统每秒将处理2,000个请求,相应的数字将从消息队列中取出,每秒仅处理这2,000个请求。这样,在高峰持续的这段时间里,会有几十万甚至更多的请求都放在消息队列。因为毕竟尖峰只会持续很短的一段时间,过了之后,每秒钟可能只有几十个或者几百个请求进入消息队列。但是,系统仍将每秒处理2,000个请求。所以,在峰值之后,系统将把那些剩下的消息都消费掉.
异步处理
可靠性):RabbitMQ使用一些机制来保证可靠性,比如持久化、传输确认、发布确认.灵活路由
>(FlexibleRouting):在消息进入队列之前,通过Exchange来路由消息的。对于典型的路由功能,RabbitMQ已经提供了一些内置的Exchange来实现。针对更复杂的路由功能,可以将多个Exchange绑定在一起,也通过插件机制实现自己的Exchange。
消息集群(Clustering):多个RabbitMQ服务器可以组成一个集群,形成一个逻辑Broker。
高可用(HighlyAvailableQueues):队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列仍然可用。
多种协议(Multi-protocol):RabbitMQ支持多种消息队列协议,比如STOMP、MQTT等等。
多语言客户端(ManyClients):RabbitMQ几乎支持所有常用语言,比如Java、.NET、Ruby等等。
管理界面(ManagementUI):RabbitMQ提供了一个易用的用户界面,使得用户可以监控和管理消息Broker的许多方面。
跟踪机制(Tracing):如果消息异常,RabbitMQ提供了消息跟踪机制,使用者可以找出发生了什么。
插件机制(PluginSystem):RabbitMQ提供了许多插件,来从多方面进行扩展,也可以编写自己的插件。
架构模型
Message
消息,消息是不具名的,它由消息头和消息体组成。消息体是不透明的,而消息头则由一系列的可选属性组成,这些属性包括routing-key(路由键)、priority(相对于其他消息的优先权)、delivery-mode(指出该消息可能需要持久性存储)等。
Publisher
消息的生产者,也是一个向交换器发布消息的客户端应用程序。
Exchange
交换器,用来接收生产者发送的消息并将这些消息路由给服务器中的队列。
Binding
绑定,用于消息队列和交换器之间的关联。一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则,所以可以将交换器理解成一个由绑定构成的路由表。
Queue
队列,是RabbitMQ的内部对象,用于存储消息消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者连接到这个队列将其取走。
Connection
网络连接,比如一个TCP连接。
Channel
信道,多路复用连接中的一条独立的双向数据流通道。信道是建立在真实的TCP连接内地虚拟连接,AMQP命令都是通过信道发出去的,不管是发布消息、订阅队列还是接收消息,这些动作都是通过信道完成。因为对于操作系统来说建立和销毁TCP都是非常昂贵的开销,所以引入了信道的概念,以复用一条TCP连接。
Consumer
消息的消费者,表示一个从消息队列中取得消息的客户端应用程序。
VirtualHost
虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。
Broker
表示消息队列服务器实体。
Exchange类型
Exchange分发消息时根据类型的不同分发策略有区别,目前共四种类型:direct、fanout、topic、headers。headers匹配AMQP消息的header而不是路由键,此外headers交换器和direct交换器完全一致,但性能差很多,目前几乎用不到了,所以直接看另外三种类型:
Direct键分布
Direct:消息中的路由键(routingkey)如果和Binding中的bindingkey一致,交换器就将消息发到对应的队列中。它是完全匹配、单播的模式。
我们以routingKey=”error”发送消息到Exchange,则消息会路由到Queue1(amqp.gen-S9b…,这是由RabbitMQ自动生成的Queue名称)和Queue2(amqp.gen-Agl…);如果我们以routingKey=”info”或routingKey=”warning”来发送消息,则消息只会路由到Queue2。如果我们以其他routingKey发送消息,则消息不会路由到这两个Queue中。
Fanout
Fanout:每个发到fanout类型交换器的消息都会分到所有绑定的队列上去。很像子网广播,每台子网内的主机都获得了一份复制的消息。fanout类型转发消息是最快的。
生产者Publisher发送到Exchange的所有消息都会路由到图中的两个Queue,并最终被两个消费者(Consumer1与Comsumer2)消费。
topic交换器
topic交换器:topic交换器通过模式匹配分配消息的路由键属性,将路由键和某个模式进行匹配,此时队列需要绑定到一个模式上。它将路由键和绑定键的字符串切分成单词,这些单词之间用点隔开。它同样也会识别两个通配符:符号“#”和符号“”。#匹配0个或多个单词,匹配不多不少一个单词。
我们routingKey=”quick.orange.rabbit”的消息会同时路由到Q1与Q2,routingKey=”lazy.orange.fox”的消息会路由到Q1,routingKey=”lazy.brown.fox”的消息会路由到Q2,routingKey=”lazy.pink.rabbit”的消息会路由到Q2(只会投递给Q2一次,虽然这个routingKey与Q2的两个bindingKey都匹配);routingKey=”quick.brown.fox”、routingKey=”orange”、routingKey=”quick.orange.male.rabbit”的消息将会被丢弃,因为它们没有匹配任何bindingKey。
安装步骤
一般来说安装RabbitMQ之前要安装Erlang,可以去Erlang官网下载。接着去RabbitMQ官网下载安装包,之后解压缩即可。根据操作系统不同官网提供了相应的安装说明:Windows、Debian/Ubuntu、RPM-basedLinux、Mac
安装
tar-xvfrabbitmq-server-generic-unix-3.6.15.tar.xz
配置
vim/etc/profile
最后加上exportPATH=$PATH:/opt/rabbitmq/rabbitmq_server-3.6.15/sbin根据自己的安装路径来
使修改生效
source/etc/profile
修改hosts
vim/etc/hosts
启动
cd/opt/rabbitmq/rabbitmq_server-3.6.15/sbin/
./rabbitmq-server-detached注意需root用户启动
查看是否启动成功
./rabbitmqctlstatus
出现这个就成功了,如果想远程访问
./rabbitmq-pluginsenablerabbitmq_management
就可以访问了(非本机访问请关闭防火墙)
访问
Springboot项目演示
springboot集成RabbitMQ非常简单,如果只是简单的使用配置非常少,springboot提供了spring-boot-starter-amqp对消息各种支持。
配置pom文件,主要是添加spring-boot-starter-amqp的支持
代码演示:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
配置application.properties文件,配置rabbitmq的安装地址、端口以及账户信息
代码演示:
spring.application.name=spirng-boot-rabbitmq
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=admin
配置队列
代码演示:
packagecom.zpc.rabbitmq
importorg.springframework.amqp.core.Queue;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration
@Configuration
publicclassRabbitConfig{
@Bean
publicQueuequeue(){
returnnewQueue("q_hello");
}
}
发送者
代码演示:
packagecom.zpc.rabbitmq
importorg.springframework.amqp.core.AmqpTemplate;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Component
importjava.text.SimpleDateFormat;
importjava.util.Date
@Component
publicclassHelloSender{
@Autowired
privateAmqpTemplaterabbitTemplate
publicvoidsend(){
Stringdate=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss").format(newDate());//24小时制
Stringcontext="hello"+date;
System.out.println("Sender:"+context);
//简单对列的情况下routingKey即为Q名
this.rabbitTemplate.convertAndSend("q_hello",context);
}
}
接收者
代码演示:
packagecom.zpc.rabbitmq
importorg.springframework.amqp.rabbit.annotation.RabbitHandler;
importorg.springframework.amqp.rabbit.annotation.RabbitListener;
importorg.springframework.stereotype.Component
@Component
@RabbitListener(queues="q_hello")
publicclassHelloReceiver
@RabbitHandler
publicvoidprocess(Stringhello){
System.out.println("Receiver:"+hello);
}
}
测试
代码演示:
packagecom.zpc.rabbitmq
importorg.junit.Test;
importorg.junit.runner.RunWith;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.boot.test.context.SpringBootTest;
importorg.springframework.test.context.junit4.SpringRunner
@RunWith(SpringRunner.class)
@SpringBootTest
publicclassRabbitMqHelloTest
@Autowired
privateHelloSenderhelloSender
@Test
publicvoidhello()throwsException{
helloSender.send();
}
}
内建集群
RabbitMQ最为出色的功能之一就是内建集群,这个功能设计的目的是允许消费者和生产者在节点崩溃的情况下继续运行,以及通过添加更多的节点来线性扩展消息通信吞吐量。RabbitMQ内部利用Erlang提供的分布式通信框架OTP来满足上述需求,使客户端在失去一个RabbitMQ节点连接的情况下,还是能够重新连接到集群中的任何其他节点继续生产、消费消息。
RabbitMQ集群中常用概念:
队列元数据:包括队列名称和它们的属性,比如是否可持久化,是否自动删除
交换器元数据:交换器名称、类型、属性
绑定元数据:内部是一张表格记录如何将消息路由到队列
vhost元数据:为vhost内部的队列、交换器、绑定提供命名空间和安全属性
技术选型
在我们平时开发中对各种消息队列MQ选型的思考:
如果用户访问量在ActiveMQ的可承受范围内,而且确实主要是基于解耦和异步来用的,可以考虑ActiveMQ,也比较贴近Java工程师的使用习惯,但是ActiveMQ现在停止维护了,同时ActiveMQ并发不高,所以业务量一定的情况下可以考虑使用。
RabbitMQ作为一个纯正血统的消息中间件,有着高级消息协议AMQP的完美结合,在消息中间件中地位无可取代,但是erlang语言阻止了我们去深入研究和掌控,对公司而言,底层技术无法控制,但是确实是开源的,有比较稳定的支持,活跃度也高。
对自己公司技术实力有绝对自信的,可以用RocketMQ,但是RocketMQ诞生比较晚,并且更新迭代很快,这个意味着在使用过程中有可能会遇到很多坑,所以如果你们公司Java技术不是很强,不推荐使用。
中小型公司,技术实力较为一般,技术挑战不是特别高,用ActiveMQ、RabbitMQ是不错的选择;大型公司,基础架构研发实力较强,用RocketMQ是很好的选择
如果是大数据领域的实时计算、日志采集等场景,用Kafka是业内标准的,绝对没问题,社区活跃度很高,几乎是全世界这个领域的事实性规范。
从性能上来看,使用文件系统的消息中间件(Kafka、RokcetMq)性能是最好的,所以基于文件系统存储的消息中间件是发展趋势。(从存储方式和效率来看文件系统>KV存储>关系型数据库)
最后
消息队列呢,其实都大同小异,用法基本都是一样的,只是各个开源消息队列的侧重点稍有不同,我们应该根据我们自己的项目需求来决定我们应该选取什么样的消息队列来为我们的项目服务,这个项目选型的工作一般都是研发前期,组长就已经决定好了用哪个来做,一般是轮不到我们来做的,但是面试的时候可能会考察相关知识,所以这几种消息队列我们都应该对其了解并能灵活使用。
本文主要介绍了关于兔子是什么意思(附详细解释)的相关养殖或种植技术,综合百科栏目还介绍了该行业生产经营方式及经营管理,关注综合百科发展动向,注重系统性、科学性、实用性和先进性,内容全面新颖、重点突出、通俗易懂,全面给您讲解综合百科技术怎么管理的要点,是您综合百科致富的点金石。
以上文章来自互联网,不代表本人立场,如需删除,请注明该网址:http://23.234.50.4:8411/article/110159.html