java输出结果保留两位小数,经典好文

java输出结果保留两位小数,经典好文前言面试技巧另外开篇再说,先上面试干货吧。面试的题目并不一定有严格的顺序关系,有的是从前一个问题延伸而来,(探究的是一个知识的深度),有的是考察面试者的知识广度、有的纯粹是我想到哪里写到哪里的啦。。不要太在意哈,最近工作有点忙。基础知识RabbitMQ是一个开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据,它是使用Erlang语言来编写的,并且是基于AMQP协议的;RabbitMQ高性能的原因Erlang语言在交换机的交互方面性能优秀的(Erlang语言最初在于交换机领域

大家好,又见面了,我是你们的朋友全栈君。

前言

面试技巧另外开篇再说,先上面试干货吧。面试的题目并不一定有严格的顺序关系,有的是从前一个问题延伸而来,(探究的是一个知识的深度),有的是考察面试者的知识广度、有的纯粹是我想到哪里写到哪里的啦。。不要太在意哈,最近工作有点忙。

基础知识

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

RabbitMQ高性能的原因

  • Erlang语言在交换机的交互方面性能优秀的(Erlang语言最初在于交换机领域的架构模式,这样使得RabbitMQ在Broker之间进行数据交互的性能是非常优秀的)
  • Erlang有着和原生Socket一样的延迟

AMQP协议

什么是AMQP高级消息队列协议

AMQP(Advanced Message Queueing Protocol)定义:具有现代特征的二进制协议。是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计

AMQP协议模型:

java输出结果保留两位小数,经典好文

Publisher 推送消息前先与Server建立连接,找到Virtual host,然后将消息推送至Exchange交换机。而交换机与Message Queue有绑定关系(一个交换机相当于一个独立的虚拟机,而这个虚拟机内的各种独立的应用就相当于一个Queue,这个Queue与交换机绑定),Consumer通过绑定的对队列,而交换机也绑定了队列。发送者将消息发送给交换机,这样就能完成消息的推送了

整体架构图

java输出结果保留两位小数,经典好文

基本概念

Broker

消息队列服务进程,接收客户端的连接,实现AMQP实体服务。

Connection

连接,应用程序与Broker的网络连接。

Producer

消息生产者,即生产方客户端,生产方客户端将消息发送到MQ。

Consumer

消息消费者,即消费方客户端,接收MQ转发的消息。

Channel

网络信道,几乎所有的操作都在Channel中进行,Channel是进行消息读写的通道。客户端可建立多个Channel,每个Channel代表一个会话任务

Message

消息,服务器和应用程序之间传送的数据,由Properties和Body组成。Properties可以对消息进行修饰,比如消息的优先级、延迟等高级特性;Body则就是消息体内容。

Virtual Host

虚拟地址,用于进行逻辑隔离,最上层的消息路由。一个Virtual Host里面可以有若干个Exchange和Queue,同一个Virtual Host里面不能有相同名称的Exchange或Queue

Exchange

交换机,接收消息,根据路由键转发消息到绑定的队列。

java输出结果保留两位小数,经典好文

常见的有4种不同的交换机类型:

  • 直连交换机:Direct exchange
  • 扇形交换机:Fanout exchange
  • 主题交换机:Topic exchange
  • 首部交换机:Headers exchange

扇形交换机

扇形交换机是最基本的交换机类型,扇形交换机会把能接收到的消息全部发送给绑定在自己身上的队列。因为广播不需要思考,所以扇形交换机处理消息的速度也是所有的交换机类型里面最快的

java输出结果保留两位小数,经典好文

直连交换机

直连交换机是一种带路由功能的交换机,一个队列会和一个交换机绑定,除此之外再绑定一个routing_key,当消息被发送的时候,需要指定一个binding_key,这个消息被送达交换机的时候,就会被这个交换机送到指定的队列里面去。同样的一个binding_key也是支持应用到多个队列中的

这样当一个交换机绑定多个队列,就会被送到对应的队列去处理
java输出结果保留两位小数,经典好文

适用场景:有优先级的任务,根据任务的优先级把消息发送到对应的队列,这样可以指派更多的资源去处理高优先级的队列

主题交换机

直连交换机的routing_key方案非常简单,如果我们希望一条消息发送给多个队列,那么这个交换机需要绑定上非常多的routing_key,假设每个交换机上都绑定一堆的routing_key连接到各个队列上。那么消息的管理就会异常地困难。

所以RabbitMQ提供了一种主题交换机,发送到主题交换机上的消息需要携带指定规则的routing_key,主题交换机会根据这个规则将数据发送到对应的(多个)队列上。

主题交换机的routing_key需要有一定的规则,交换机和队列的binding_key需要采用*.#.*.....的格式,每个部分用.分开,其中:

  • *表示一个单词
  • #表示任意数量(零个或多个)单词

当一个队列的绑定键为#的时候,这个队列将会无视消息的路由键,接收所有的消息
java输出结果保留两位小数,经典好文

首部交换机

首部交换机是忽略routing_key的一种路由方式。路由器和交换机路由的规则是通过Headers信息来交换的,这个有点像HTTPHeaders

将一个交换机声明成首部交换机,绑定一个队列的时候,定义一个Hash的数据结构,消息发送的时候,会携带一组hash数据结构的信息,当Hash的内容匹配上的时候,消息就会被写入队列。

绑定交换机和队列的时候,Hash结构中要求携带一个键x-match,这个键的Value可以是any或者all,这代表消息携带的Hash是需要全部匹配(all),还是仅匹配一个键(any)就可以了

相比直连交换机,首部交换机的优势是匹配的规则不被限定为字符串

  • any: 只要在发布消息时携带的有一对键值对headers满足队列定义的多个参数arguments的其中一个就能匹配上,注意这里是键值对的完全匹配,只匹配到键了,值却不一样是不行的;
  • all:在发布消息时携带的所有Entry必须和绑定在队列上的所有Entry完全匹配

java输出结果保留两位小数,经典好文

Binding

Exchange和Queue之间的虚拟连接,Exchange在与多个Message Queue发生Binding后会生成一张路由表,路由表中存储着Message Queue所需消息的限制条件即Binding Key。当Exchange收到Message时会解析其Header得到Routing Key,Exchange根据Routing Key与Exchange Type将Message路由到Message Queue。Binding Key由Consumer在Binding Exchange与Message Queue时指定,而Routing Key由Producer发送Message时指定,两者的匹配方式由Exchange Type决定

Routing Key

一个路由规则,虚拟机可用它来确定如何路由一个特定消息。

Queue

也称为Message Queue,消息队列,保存消息并将它们转发给消费者。

消息发布流程:

  1. 生产者和Broker建立TCP连接。
  2. 生产者和Broker建立通道。
  3. 生产者通过通道消息发送给Broker,由Exchange将消息进行转发。
  4. Exchange将消息转发到指定的Queue(队列)

消息接收流程:

  1. 消费者和Broker建立TCP连接 。
  2. 消费者和Broker建立通道。
  3. 消费者监听指定的Queue(队列)
  4. 当有消息到达Queue时Broker默认将消息推送给消费者。
  5. 消费者接收到消息。

消息流转过程

生产者生产出Message并投递到Exchange

一个Exchange可以绑定多个Message Queue,它根据路由策略(routing key)路由到指定的队列,最后由消费端去监听队列

工作模式

队列模式:

对于任务过重或任务较多情况使用工作队列可以提高任务处理的速度。

1、一条消息只会被一个消费者接收;

2、rabbitmq采用轮询的方式将消息是平均发送给消费者的;

3、消费者在处理完某条消息后,才会收到下一条消息。

发布订阅模式:

1、每个消费者监听自己的队列。

2、生产者将消息发给broker,由交换机将消息转发到绑定此交换机的每个队列,每个绑定交换机的队列都将接收到消息

对应交换机中的fanout类型

路由模式:

1、每个消费者监听自己的队列,并且设置routingkey。

2、生产者将消息发给交换机,由交换机根据routingkey来转发消息到指定的队列。

对应交换机中的direct类型

通配符模式:

对应交换机中的topics类型

Header转发器模式:

对应交换机中的header类型

远程过程调用模式:

RPC即客户端远程调用服务端的方法,使用MQ可以实现RPC的异步调用,基于Direct交换机实现,流程如下:

  1. 客户端即是生产者就是消费者,向RPC请求队列发送RPC调用消息,同时监听RPC响应队列。
  2. 服务端监听RPC请求队列的消息,收到消息后执行服务端的方法,得到方法返回的结果。
  3. 服务端将RPC方法的结果发送到RPC响应队列。
  4. 客户端(RPC调用方)监听RPC响应队列,接收到RPC调用结果。

本次面试答案,以及收集到的大厂必问面试题分享:

字节跳动超高难度三面java程序员面经,大厂的面试都这么变态吗?

同时监听RPC响应队列。
2. 服务端监听RPC请求队列的消息,收到消息后执行服务端的方法,得到方法返回的结果。
3. 服务端将RPC方法的结果发送到RPC响应队列。
4. 客户端(RPC调用方)监听RPC响应队列,接收到RPC调用结果。

本次面试答案,以及收集到的大厂必问面试题分享:

[外链图片转存中…(img-3dyuxkIp-1623233429821)]

资料领取方式:戳这里即可免费下载

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/157151.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java的下载与安装简易教程

    Java的下载与安装简易教程分享一下windows10系统下安装Java的教程一.Java的下载与安装要想学习Java语言,第一个条件就是要让电脑上具备有Java环境,那么怎么让电脑具备Java环境呢?1.首先下载Java的安装包。点击Java下载地址:https://www.oracle.com/technetwork/java/javase/downloads/index.html(官网地址)如下图:2.点击上图红色方框的Download,跳转到另一个页面,如下图:…

    2022年7月9日
    16
  • spring boot 系列之二:spring boot 如何修改默认端口号和contextpath「建议收藏」

    上一篇文件我们通过一个实例进行了springboot入门,我们发现tomcat端口号和上下文(contextpath)都是默认的,如果我们对于这两个值有特殊需要的话,需要自己制定的时候怎么办呢

    2022年2月16日
    29
  • Oracle基础 各种语句的定义格式

    Oracle内建数据类型一、 字符数据1、 char(size)2、 varchar2(size) 最常用,最大长度4000字节3、 nvhar(size)、nvarchar(size)4、 varc

    2021年12月20日
    43
  • double转BigDecimal精度丢失[通俗易懂]

    double转BigDecimal精度丢失[通俗易懂]很多人在double或float转BigDecimal时习惯使用BigDecimal的构造方法newBigDecimal(33.33),此种写法会存在精度丢失问题,下面就具体实例带大家体会:一、使用//使用BigDecimal的构造方法doubled=33.33;BigDecimalbigDecimal=newBigDecimal(d);System.out.println(bigDecimal);…

    2022年6月4日
    73
  • 论文DepthTrack: Unveiling the Power of RGBD Tracking阅读及代码讲解[通俗易懂]

    论文DepthTrack: Unveiling the Power of RGBD Tracking阅读及代码讲解[通俗易懂]最近终于有了一篇的顶会像样的RGBDtracking的论文了:ICCV2021:DepthTrack:UnveilingthePowerofRGBDTrackingGithub:https://github.com/xiaozai/DeT数据集简介这边看完就随手记录一下关键的部分:主要是创建了个大规模的RGBDtrackingbenchmark:DepthTrack(有数据集之后才能促进算法的研究),当然随之也搞了个baselinetracker—DeT,这也是现在搞d

    2022年9月14日
    0
  • Mysql事务隔离级别_数据库默认的事务隔离级别

    Mysql事务隔离级别_数据库默认的事务隔离级别前言提到事务,你肯定不会陌生,最经典的例子就是转账,甲转账给乙100块,当乙的账户中到账100块的时候,甲的账户就应该减去100块,事务可以有效的做到这一点。在MySQL中,事务支持实在引擎层实现的,MySQL是一个支持多引擎的系统,但并不是所有引擎都支持事务。比如MySQL原生的MyISAM引擎就不支持事务,这也是MyISAM被取代的原因之一。隔离性事务的四大特性AC…

    2022年10月14日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号