您的当前位置:首页正文

你好offer之---中间件以及消息队列

来源:华佗健康网

中间件以及消息队列

dubbo

是一款高性能、轻量级的开源 RPC 框架,客户端和服务端共用一个接口。客户端面向接口写调用,服务端面向接口写实现。dubbo一般使用 Zookeeper 作为注册中心

dubbo为何而生:

随着流量的增大,常规的垂直应用架构已无法应对。服务间依赖关系变得错踪复杂,负载均衡器的单点压力也越来越大

dubbo的核心组成

  • Provider 暴露服务的服务提供方
  • Consumer 调用远程服务的服务消费方
  • Registry 服务注册与发现的注册中心
  • Monitor 统计服务的调用次数和调用时间的监控中心
  • Container 服务运行容器

服务器注册与发现的流程:

  • 服务容器Container负责启动,加载,运行服务提供者
  • 服务提供者Provider在启动时,向注册中心注册自己提供的服务
  • 服务消费者Consumer在启动时,向注册中心订阅自己所需的服务
  • 注册中心Registry返回服务提供者地址列表给消费者,
  • Consumer和provider定时每分钟发送一次统计数据到监控中心Monitor

Spring Cloud和dubbo的区别

Spring Cloud是一个微服务框架,相比Dubbo等RPC框架, Spring Cloud提供的全套的分布式系统解决方案
Spring Cloud 抛弃了 Dubbo 的 RPC 通信,采用的是基于 HTTP 的 REST 方式

Dubbo集群提供了哪些负载均衡策略

随机负载均衡
轮询负载均衡

zookeeper

  • zookeeper通过心跳机制可以检测挂掉的机器并将挂掉机器的ip和服务对应关系从列表中删除

  • 在dubbo中的流程就是provider将自己的服务注册到zk中心上,注册中心将可用的提供者列表给consumer

MQ

消息队列的作用:消息通讯、异步处理、应用解耦、流量削锋
消息队列最常见的问题就是消息的先后顺序和重复问题(根本原因是网络不可达,可以在消费者处进行设置日志保存唯一编号)

RabbitMQ

RabbitMQ 是一个比较成熟的消息中间价,用Erlang编写的,基于AMQP协议的消息中间件,使用信道的方式来传输数据。而且支持集群模式下开发。

  • RabbitMQ支持消息确认ack。消费者从RabbitMQ收到信息,并处理完成后反馈给RabbitMQ,RabbitMQ收到反馈后将此消息从队列中删除。如果一个消费者处理消息是挂掉,那么就不会有ack反馈,MQ就会认为消息没有正常被消费,会立即将消息传给其他消费者。这种机制保障有故障情况下也能保证
    不丢失消息和任务

  • RabbitMQ也支持消息持久化,服务器挂掉可能会丢失任务,通过持久化就能找回任务

  • Rabbit MQ也支持负载均衡

RabbitMQ通过交换器来进行发布消息

生产者直接将消息给交换器,交换器再细分给各个队列。生产者不直接将消息发送到队列,将消息发送至交换器中,消费由交换器统一进行分配

交换器有三种规则:
  • fanout分发:将所有的消息分发给所有绑定的队列
  • direct直接:满足绑定的key才给发送
  • topic主题:更细化的分发
RabbitMQ运转流程:

生产者发送消息:

  • 生产者连接到RabbitMQ的Broker建立连接开启信道(channel),
  • 声明一个交换器并设置相关属性(比如交换器类型、是否持久化)
  • 生产者将通过路由键将交换器和队列绑定起来
  • 生产者将信息发送至RabbitMQ Broker(包含路由键以及交换器等信息)交换器根据收到的路由键查找匹配的队列。将生产者发来消息存入相应队列中

消费者发送消息:

  • 消费者连接到RabbitMQ的Broker建立连接开启信道(channel),
  • 消费者向RabbitMQ Broker请求消费者对应的队列的信息
  • 等待RabbitMQ Broker回应消息
  • 消费者确认(ack)接收到消息
  • RabbitMq收到确认后删除相应被确认的消息

当然生产者消费者和队列不必部署在同一台机器上

RabbitMQ和Broker建立连接是一个TCP连接,连接后客户端创建一个信道(channel),每个信道都会被指派一个唯一id,很多个channel通过一个Connection和RabbitMQ Broker进行连接

AMQP协议:

生产者将消息发送给交换器,交换器与队列绑定,生产者发送消息时携带的路由键和绑定时的BindingKey匹配时,匹配成功给则消息被存入相应的队列,消费者可以订阅对应的队列来获取消息

AMQP协议包括三层

模型层:定义了一些供客户端调用的命令,客户端通过这些命令实现自己的业务逻辑
会话层:客户端的命令发送给服务器,再将服务端的应答返回给客户端
传输层:传输二进制数据流,提供信道复用等功能

因篇幅问题不能全部显示,请点此查看更多更全内容