分布式系统(distributed system)是创建在网络之上的软件系统。正是由于软件的特性,因此分布式系统具备高度的内聚性和透明性。所以,网络和分布式系统之间的区别更多的在于高层软件(特别是操做系统),而不是硬件。前端
为何使用 MQ?java
如何保证 MQ 的高可用?node
MQ 的常见问题有:算法
消息的顺序问题sql
消息有序指的是能够按照消息的发送顺序来消费。数据库
假如生产者产生了 2 条消息:M一、M2,假定 M1 发送到 S1,M2 发送到 S2,若是要保证 M1 先于 M2 被消费,怎么作?json
(1)保证生产者 - MQServer - 消费者是一对一对一的关系缓存
并行度就会成为消息系统的瓶颈(吞吐量不够)安全
更多的异常处理,好比:只要消费端出现问题,就会致使整个处理流程阻塞,咱们不得不花费更多的精力来解决阻塞的问题。 (2)经过合理的设计或者将问题分解来规避。bash
不关注乱序的应用实际大量存在
队列无序并不意味着消息无序 因此从业务层面来保证消息的顺序而不只仅是依赖于消息系统,是一种更合理的方式。
消息的重复问题
形成消息重复的根本缘由是:网络不可达。
因此解决这个问题的办法就是绕过这个问题。那么问题就变成了:若是消费端收到两条同样的消息,应该怎样处理?
消费端处理消息的业务逻辑保持幂等性。只要保持幂等性,无论来多少条重复消息,最后处理的结果都同样。保证每条消息都有惟一编号且保证消息处理成功与去重表的日志同时出现。利用一张日志表来记录已经处理成功的消息的 ID,若是新到的消息 ID 已经在日志表中,那么就再也不处理这条消息。
Kafka, ActiveMQ, RabbitMQ, RocketMQ 各有什么优缺点?
若是您对java技术很感兴趣能够加入个人粉丝学习交流群java架构交流群:571617441通过一段时间整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、Jvm性能调优、Spring,MyBatis,Nginx源码分析,Redis,ActiveMQ、、Mycat、Netty、Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、Nginx等多个知识点高级进阶干货,但愿对大家的技术提高有必定的参考和帮助
Dubbo 的实现过程?
节点角色:
调用关系:
Dubbo 负载均衡策略有哪些?
Random
RoundRobin
LeastActive
ConsistentHash
Dubbo 集群容错策略 ?
动态代理策略?
Dubbo 做为 RPC 框架,首先要完成的就是跨系统,跨网络的服务调用。消费方与提供方遵循统一的接口定义,消费方调用接口时,Dubbo 将其转换成统一格式的数据结构,经过网络传输,提供方根据规则找到接口实现,经过反射完成调用。也就是说,消费方获取的是对远程服务的一个代理(Proxy),而提供方由于要支持不一样的接口实现,须要一个包装层(Wrapper)。调用的过程大概是这样:
@SPI("javassist")
public interface ProxyFactory {
@Adaptive({Constants.PROXY_KEY})
<T> T getProxy(Invoker<T> invoker) throws RpcException;
@Adaptive({Constants.PROXY_KEY})
<T> Invoker<T> getInvoker(T proxy, Class<T> type, URL url) throws RpcException;
}
复制代码
ProxyFactory 有两种实现方式,一种是基于 JDK 的代理实现,一种是基于 javassist 的实现。ProxyFactory 接口上定义了@SPI("javassist"),默认为 javassist 的实现。
Dubbo 支持哪些序列化协议?Hessian?Hessian 的数据结构?
Hessian 序列化与 Java 默认的序列化区别?
Hessian 是一个轻量级的 remoting on http 工具,采用的是 Binary RPC 协议,因此它很适合于发送二进制数据,同时又具备防火墙穿透能力。
Protocol Buffer 是 Google 出品的一种轻量 & 高效的结构化数据存储格式,性能比 Json、XML 真的强!太!多!
Protocol Buffer 的序列化 & 反序列化简单 & 速度快的缘由是:
Protocol Buffer 的数据压缩效果好(即序列化后的数据量体积小)的缘由是:
注册中心挂了能够继续通讯吗?
能够。Dubbo 消费者在应用启动时会从注册中心拉取已注册的生产者的地址接口,并缓存在本地。每次调用时,按照本地存储的地址进行调用。
ZooKeeper 原理是什么?ZooKeeper 有什么用?
ZooKeeper 是一个分布式应用协调系统,已经用到了许多分布式项目中,用来完成统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等工做。
Netty 有什么用?NIO/BIO/AIO 有什么用?有什么区别?
Netty 是一个“网络通信框架”。
Netty 进行事件处理的流程。Channel是链接的通道,是 ChannelEvent 的产生者,而ChannelPipeline能够理解为 ChannelHandler 的集合。
IO 的方式一般分为几种:
NIO 基于 Reactor,当 socket 有流可读或可写入 socket 时,操做系统会相应的通知引用程序进行处理,应用再将流读取到缓冲区或写入操做系统。也就是说,这个时候,已经不是一个链接就要对应一个处理线程了,而是有效的请求,对应一个线程,当链接没有数据时,是没有工做线程来处理的。
与 NIO 不一样,当进行读写操做时,只须直接调用 API 的 read 或 write 方法便可。这两种方法均为异步的,对于读操做而言,当有流可读取时,操做系统会将可读的流传入 read 方法的缓冲区,并通知应用程序;对于写操做而言,当操做系统将 write 方法传递的流写入完毕时,操做系统主动通知应用程序。便可以理解为,read/write 方法都是异步的,完成后会主动调用回调函数。
为何要进行系统拆分?拆分不用 Dubbo 能够吗?
系统拆分从资源角度分为:应用拆分和数据库拆分。
从采用的前后顺序可分为:水平扩展、垂直拆分、业务拆分、水平拆分。
当垂直应用愈来愈多,应用之间交互不可避免,将核心业务抽取出来,做为独立的服务,逐渐造成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提升业务复用及整合的分布式服务框架(RPC)是关键。
当服务愈来愈多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增长一个调度中心基于访问压力实时管理集群容量,提升集群利用率。此时,用于提升机器利用率的资源调度和治理中心(SOA)是关键。
Dubbo 和 Thrift 有什么区别?
若是您对java技术很感兴趣能够加入个人粉丝学习交流群java架构交流群 :571617441通过一段时间整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、Jvm性能调优、Spring,MyBatis,Nginx源码分析,Redis,ActiveMQ、、Mycat、Netty、Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、Nginx等多个知识点高级进阶干货,但愿对大家的技术提高有必定的参考和帮助