分布式系统的介绍(1)--分布式系统&中间件从入门到精通(一)

简介: 分布式系统的介绍(1)--分布式系统&中间件从入门到精通(一)

分布式系统是由多个节点组成的系统,每个节点就是个计算机机器,用户访问网站感知不到是多个机器组成的系统。当用户访问某个网站的时候,给浏览器发出一个请求,背后是一个大型分布式系统为我们提供服务,有的提供存储数据,有的提供计算,有的负责处理请求,最终他们相互调节把数据返回给浏览器。


分布式系统的意义


随着业务需求越来越大,系统越来越繁杂,这时候处理业务,或者用户信息可能就会单独放在一个独立的服务器上,因为单个计算机有上线瓶颈,另外出于稳定性和可用性的考虑,分布式系统是优选。


分布式系统基础知识


前面我们说了分布式系统是由单个节点组成,而单个节点就是单个计算机,我们看一下计算机的组成要素。

计算机主要分为五大组件:内存,外存,输入设备,输出设备,CPU。

输入设备和输出设备很好理解,就是鼠标键盘和显示器。在计算器断电时候,计算器,内存里的数据重启会消息,而外存里的数据会持久化。CPU则负责两个主要功能运算器和控制器。


对计算机有了基础的了解之后,我们可以看看计算机是如何工作的,我们写的代码是在计算机进程里的线程运行的,在我们刚接触写代码时,都是在单线程下运行代码,当时对这些也不是很了解,就是写一段代码执行就完事。相对于单线程,多线程就复杂的多。这里的多线程指的是单个进程下的多线程。


线程模式

如果多线程之间互相不通信,也就是不会访问共有的对象进行修改,每个线程之间互不干扰独立运行,这样是没有什么问题的。


但如果多线程之间修改同一个共有对象,为了保证我们同一份数据访问的正确性,我们可以通过加互斥锁来解决,如果对于频繁访问读写的数据,互斥锁太影响效率,我们也可用读写锁来解决。当然,我们可以用很多线程安全的容器,对于这些线程安全的容器与简单的互斥锁相比较,效果更好。


还会存在通过事件协同的多线程模式,这种是当两个线程之间需要相互协调,比如A、B两个线程,当A线程继续运行下去,必须等到B线程里面吧某个状态改变才可以继续让A运行,那么这个场景下就需要线程之间完成协调。

当T1代码:A.lock();B.lock()。T2代码B.lock();A.lock()。

这种情况下就有机会发生死锁,当A获取锁之后,获取B的锁失败,一直未吧A的锁释放,导致T2获取的B锁也一直因为获取不到A锁也释放不了,最终形成死锁。这时候其实可以改成:

当T1代码:A.lock();B.lock()。T2代码A.lock();B.lock()。

这时候就不会发生死锁了,因为获取锁的顺序发生了变化,他们都必须先获取到A锁才可以运行。


进程模式

多线程和进程有很多相似之处,也有不同。进程里面是包含线程的,多个进程之间的内存空间是独立的,而进程里面的线程内存是共享的,因此进程之间共享数据有所不同。此外,进程间通信协调互,以及通过一些事件通知等待互斥的释放方面,也会和线程不一样。这些在不同的平台所支持的方式不同。


多进程对于单进程线多线程方式来说,资源控制会更容易实现,此外,多进程中的单个进程如果出了问题,不会造成整体不可用。这两点应该数据多进程的特点。当然多进程之间也可以共享对象数据,这时候也会比多线程复杂点,会有序列化和反序列化的开销。


而我们分布式系统可以看做把单机的多进程变成了多机的多进程。单机到多机的变化就是,原来单机OS上支持的功能需要另外去实现。当然也有好处,就是一个单机宕机不会造成整体不可用。


单线程和单进程多线程程序遇到机器故障、OS问题会造成整个功能不可用。对于多进程系统,如果遇到机器故障或者OS问题也会造成整体不可用,但如果是多进程中某个进程问题,那么可能保持一部分功能正常使用。


而如果在分布式多进程的情况下,也就是多系统,遇到某些机故障、OS问题,我们都有机会保证整体功能正常使用。


网络通信基础知识


我们处在高速发展的网络时代,无论有限网络还是无线网络,无论是LAN、MAN还是WAN等众多节点联系在一起的方式,都是需要通过通信来解决。


我们常用的则是TCP/IP模式,那么我们使用Socket套接字进行网络通信开发的时候,有哪些方法实现呢?三种实现方法:BIO、NIO、AIO。


BIO

全称是BlockingIO,采用阻塞方式来实现通信。也就是一个socket用一个线程来处理。在建立连接、读数据、写数据的操作时,都会阻塞。这样做的好处就是简单,但主要问题就是只有一个线程能处理一个socket,如果是server端,在支持高并发时,就要更多的线程来完成工作。


NIO

全称NonblockingIO,基于事件驱动思想,顾名思义也就是没有阻塞的方式来实现通信。采用Reactor模式,这也是java服务端采用较多的一种方式。这个好处最大就是不需要一个socket分配一个线程,一个线程可以处理多个socket套接字工作。

Reactor会管理所有的event handler,并把出现的时间交给handler去处理。


AIO

全称AsynchronousIO,也就是异步IO。采用Proactor模式,AIO在进行读写操作时候,只需要调用read、write方法,并把需要的传入到completionHandler处理器中,在动作完成后,会调用completion处理器。

AIO是在java7中引入的饿,与NIO最大的区别就是NIO在通知时可以进行相关操作,而AIO在通知时候表示相关操作已完成。

BIO/NIO/AIO这几种模式并不需要客户端与服务端保持一致。此外,在实践中有些场景也会使用UDP,但还是TCP使用的更广泛。

相关文章
|
4月前
|
关系型数据库 Apache 微服务
《聊聊分布式》分布式系统基石:深入理解CAP理论及其工程实践
CAP理论指出分布式系统中一致性、可用性、分区容错性三者不可兼得,必须根据业务需求进行权衡。实际应用中,不同场景选择不同策略:金融系统重一致(CP),社交应用重可用(AP),内网系统可选CA。现代架构更趋向动态调整与混合策略,灵活应对复杂需求。
|
9月前
|
消息中间件 存储 Kafka
分布式消息中间件设计与实现
本文深入探讨了消息中间件的核心功能实现与高并发、高可用设计。在生产者设计中,涵盖消息构造、序列化、路由策略及可靠性保障(如ACK机制)。消费者部分分析了拉取/推送模式、分区分配与消息确认机制。同时,Broker作为核心组件,负责消息路由、存储和投递,并通过索引技术实现快速检索。 高并发设计方面,重点讨论了文件存储(顺序写入、分段存储)、日志结构存储及负载均衡策略(如哈希分区、轮询分区)。为确保高可用性,文章详细解析了主从复制、故障转移机制以及同城/异地多活容灾方案。
|
4月前
|
消息中间件 运维 监控
《聊聊分布式》BASE理论 分布式系统可用性与一致性的工程平衡艺术
BASE理论是对CAP定理中可用性与分区容错性的实践延伸,通过“基本可用、软状态、最终一致性”三大核心,解决分布式系统中ACID模型的性能瓶颈。它以业务为导向,在保证系统高可用的同时,合理放宽强一致性要求,并借助补偿机制、消息队列等技术实现数据最终一致,广泛应用于电商、社交、外卖等大规模互联网场景。
|
4月前
|
算法 NoSQL 关系型数据库
《聊聊分布式》分布式系统核心概念
分布式系统由多节点协同工作,突破单机瓶颈,提升可用性与扩展性。CAP定理指出一致性、可用性、分区容错性三者不可兼得,BASE理论通过基本可用、软状态、最终一致性实现工程平衡,共识算法如Raft保障数据一致与系统可靠。
|
5月前
|
存储 算法 安全
“卧槽,系统又崩了!”——别慌,这也许是你看过最通俗易懂的分布式入门
本文深入解析分布式系统核心机制:数据分片与冗余副本实现扩展与高可用,租约、多数派及Gossip协议保障一致性与容错。探讨节点故障、网络延迟等挑战,揭示CFT/BFT容错原理,剖析规模与性能关系,为构建可靠分布式系统提供理论支撑。
289 2
|
5月前
|
消息中间件 缓存 监控
中间件架构设计与实践:构建高性能分布式系统的核心基石
摘要 本文系统探讨了中间件技术及其在分布式系统中的核心价值。作者首先定义了中间件作为连接系统组件的"神经网络",强调其在数据传输、系统稳定性和扩展性中的关键作用。随后详细分类了中间件体系,包括通信中间件(如RabbitMQ/Kafka)、数据中间件(如Redis/MyCAT)等类型。文章重点剖析了消息中间件的实现机制,通过Spring Boot代码示例展示了消息生产者的完整实现,涵盖消息ID生成、持久化、批量发送及重试机制等关键技术点。最后,作者指出中间件架构设计对系统性能的决定性影响,
|
9月前
|
消息中间件 存储 中间件
分布式消息中间件基础
消息中间件是一种基于异步消息传递的分布式系统通信工具,核心功能包括消息传输、存储、路由与投递,能够实现系统解耦、异步处理和流量削峰。其主要组件包括生产者、消费者、Broker、主题/队列等,支持点对点和发布-订阅两种消息模型。主流中间件如Kafka(高吞吐)、RabbitMQ(灵活路由)、RocketMQ(事务支持)各有特色,适用于不同场景。此外,中间件还涉及多种协议(AMQP、MQTT等)、可靠性传输机制(持久化、确认机制)、顺序性与重复性问题解决以及事务支持(两阶段提交、本地消息表等)。选择中间件需根据业务需求权衡性能、功能和运维成本。
|
消息中间件 算法 调度
分布式系统学习10:分布式事务
本文是小卷关于分布式系统架构学习系列的第13篇,重点探讨了分布式事务的相关知识。随着业务增长,单体架构拆分为微服务后,传统的本地事务无法满足需求,因此需要引入分布式事务来保证数据一致性。文中详细介绍了分布式事务的必要性、实现方案及其优缺点,包括刚性事务(如2PC、3PC)和柔性事务(如TCC、Saga、本地消息表、MQ事务、最大努力通知)。同时,还介绍了Seata框架作为开源的分布式事务解决方案,提供了多种事务模式,简化了分布式事务的实现。
572 5
|
NoSQL 关系型数据库 MySQL
分布式系统学习9:分布式锁
本文介绍了分布式系统中分布式锁的概念、实现方式及其应用场景。分布式锁用于在多个独立的JVM进程间确保资源的互斥访问,具备互斥、高可用、可重入和超时机制等特点。文章详细讲解了三种常见的分布式锁实现方式:基于Redis、Zookeeper和关系型数据库(如MySQL)。其中,Redis适合高性能场景,推荐使用Redisson库;Zookeeper适用于对一致性要求较高的场景,建议基于Curator框架实现;而基于数据库的方式性能较低,实际开发中较少使用。此外,还探讨了乐观锁和悲观锁的区别及适用场景,并介绍了如何通过Lua脚本和Redis的`SET`命令实现原子操作,以及Redisson的自动续期机
1182 7