知识点总结--day11(常用组件1/3)
目录一、nginx相关1.1、什么是正向代理1.2、什么是反向代理1.3、什么是CDN服务1.4、Nginx的负载均衡1.5、Nginx限流怎么做二、分布式事务2.1、CAP定理2.2、BASE理论2.3、二阶段提交2.4、SEATA模式2.5、Seata是强一致性事务吗2.6、柔性事务与刚性事务的区三、分布式锁3.1、什么场景下要使用分布式锁3.2、分布式锁的实现方案有哪些3.3、如何选择分布式锁方案3.4、redisson分布式锁如何应用3.5、如何实现分布式锁的可重入3.6、如何提升分布式锁性能末尾页一、nginx相关1.1、什么是正向代理正向代理是一种网络代理服务器的运作模式它充当客户端与外部服务器之间的中间人代理客户端发起的请求并将这些请求转发给外部服务器。在正向代理的架构中客户端无法直接访问目标服务器而是通过正向代理服务器来代为发起连接。以下是正向代理的基本工作原理客户端发送请求客户端向正向代理服务器发起请求请求中包含了要访问的目标服务器的信息。代理服务器转发请求正向代理服务器接收到客户端的请求后会代表客户端向目标服务器发起实际的连接请求。目标服务器响应目标服务器接收到代理服务器发起的连接请求后会向代理服务器返回响应数据。代理服务器响应客户端代理服务器再将目标服务器的响应数据返回给客户端客户端则认为这些数据是直接从代理服务器获取的。常见使用场景访问受限资源、保护客户端隐私、访问跨境内容总的来说正向代理充当客户端的代理代替客户端发起连接和获取数据为客户端提供了更多的灵活性和隐私保护。1.2、什么是反向代理反向代理Reverse Proxy是一种代理服务器的部署方式它代表服务器接收客户端的请求并将这些请求转发给内部的服务器。与正向代理不同反向代理是对外隐藏了真实的服务器并充当了客户端与内部服务器之间的中间人。客户端认为它们直接与反向代理通信而不知道实际处理请求的是内部的服务器。反向代理的工作流程如下客户端发送请求客户端向反向代理服务器发送请求通常是访问某个网站或服务。反向代理处理请求反向代理服务器接收到客户端的请求后根据配置的规则和负载均衡策略将请求转发给内部的一个或多个服务器。内部服务器响应内部服务器接收到来自反向代理的请求后处理请求并生成响应数据。反向代理返回响应反向代理服务器将内部服务器的响应数据返回给客户端客户端认为这些数据是直接从反向代理获取的。反向代理的主要作用包括负载均衡、安全防护、缓存加速等。通过反向代理可以提高服务器的性能、可靠性和安全性同时隐藏了内部服务器的实际地址增强了系统的安全性。总的来说反向代理充当服务器的代理代替服务器处理客户端的请求和响应为服务器提供了更好的性能和安全保护。1.3、什么是CDN服务CDN内容分发网络是指一组分布在全球各地的服务器网络用于加速互联网上静态和动态内容的传输。CDN 服务通过将内容缓存到离用户更近的服务器上以提高用户访问这些内容的速度和性能。CDN 的基本原理是利用就近性原则让用户能够从距离更近、网络质量更好的服务器获取所需的内容而不必直接访问原始服务器。CDN 服务的主要特点包括加速访问速度通过在全球各地部署服务器CDN 可以使用户能够从距离更近的服务器获取内容减少网络延迟提高访问速度。负载均衡CDN 可以根据用户的位置和网络状况自动将请求分发到最优的服务器从而实现负载均衡提高服务的稳定性和可靠性。减轻源服务器压力CDN 可以缓存大量的静态资源并在用户请求时直接返回减轻了源服务器的负担提高了源服务器的处理能力。安全防护CDN 可以提供一定程度的安全防护例如防御 DDoS 攻击、恶意请求等保护源服务器免受攻击。CDN 服务通常用于加速网站的访问速度提高用户体验同时也可以用于视频直播、软件分发等领域。许多大型的互联网公司和网站都会使用 CDN 服务来优化其内容的传输和分发。总的来说CDN 服务通过在全球范围内部署服务器提高了内容的传输速度、稳定性和安全性为用户和网站提供了更好的体验和保护。1.4、Nginx的负载均衡Nginx 是一个常用的高性能的 Web 服务器和反向代理服务器它也可以用作负载均衡器。通过 Nginx 的负载均衡功能可以将客户端的请求分发到多台后端服务器上从而提高系统的性能、可靠性和可扩展性。Nginx 实现负载均衡的方式通常有两种基于轮询的负载均衡和基于权重的负载均衡。基于轮询的负载均衡Nginx 默认的负载均衡方式是基于轮询的。当有新的请求到达时Nginx 会按照事先配置好的后端服务器列表顺序依次将请求转发给这些服务器。这样可以实现比较简单的负载均衡但无法根据后端服务器的负载情况进行动态调整。基于权重的负载均衡除了默认的轮询方式外Nginx 还支持基于权重的负载均衡。通过设置不同后端服务器的权重可以让 Nginx 按照这些权重比例来分配请求从而实现更灵活的负载均衡策略。另外Nginx 也支持其他负载均衡算法如 IP 哈希、最小连接数等。这些算法可以根据具体的业务需求和场景选择合适的负载均衡策略。1.5、Nginx限流怎么做Nginx 限流主要有两种控制并发数连接数限流、控制速率流量限流常用模块是ngx_http_limit_conn_module限制连接数ngx_http_limit_req_module限制请求速率二、分布式事务2.1、CAP定理分布式系统有三个指标Consistency一致性Availability可用性Partition tolerance 分区容错性它们的第一个字母分别是C、A、P。Eric Brewer认为任何分布式系统架构方案都不可能同时满足这3个目标这个结论就叫做 CAP 定理。2.2、BASE理论既然分布式系统要遵循CAP定理那么问题来了我到底是该牺牲一致性还是可用性呢如果牺牲了一致性出现数据不一致该怎么处理人们在总结系统设计经验时最终得到了一些心得BasicallyAvailable基本可用分布式系统在出现故障时允许损失部分可用性即保证核心可用。Soft State软状态在一定时间内允许出现中间状态比如临时的不一致状态。Eventually Consistent最终一致性虽然无法保证强一致性但是在软状态结束后最终达到数据一致。以上就是BASE理论。2.3、二阶段提交在分布式系统中二阶段提交Two-Phase Commit简称 2PC是一种经典的协议用于保证多个参与方在分布式事务中的一致性。2PC 协议由两个阶段组成准备阶段Prepare Phase协调者通常是事务管理器向所有参与方发送准备请求并等待它们的响应。参与方执行本地事务并将事务的执行结果和准备状态返回给协调者。提交阶段Commit Phase如果所有参与方的准备请求都成功并且没有发生错误协调者则发送提交请求给所有参与方。参与方接收到提交请求后将正式提交事务并释放相关资源。如果在任何一个参与方的准备阶段出现错误、超时或者拒绝提交的情况协调者将发送回滚请求给所有参与方要求它们撤销之前的操作并回滚事务。2.4、SEATA模式Seata 是一个开源的分布式事务解决方案它提供了多种模式来支持不同场景下的分布式事务处理。主要的 Seata 分布式事务模式包括 AT 模式TCC 模式、TCC 模式、SAGA 模式和XA 模式。AT 模式TCC 模式AT 模式是 Seata 最基础的分布式事务模式也称为 TCCTry-Confirm-Cancel模式。在 AT 模式中事务分为三个阶段尝试Try、确认Confirm和取消Cancel。应用程序需要实现这三个阶段的方法来保证事务的一致性。TCC 模式TCC 模式和 AT 模式类似也是基于 Try-Confirm-Cancel 的思想但相比于 AT 模式更加灵活允许业务逻辑更细粒度地控制事务的各个阶段。SAGA 模式SAGA 模式是一种基于状态的分布式事务模式在每个微服务内部处理自身的事务并通过事件机制跨服务通信从而实现全局事务的一致性。XA 模式XA 模式是传统的两阶段提交协议通过 XA接口来协调多个数据库事务。Seata 通过支持 XA 模式来实现分布式事务的一致性。2.5、Seata是强一致性事务吗一般使用的是SEATA的AT模式而AT模式是每个分支事务独立提交事务所以是非强一致性事务。2.6、柔性事务与刚性事务的区柔性事务满足BASE理论基本可用最终一致Basically Available基本可用Soft-state 软状态/柔性事务Eventual Consistency 最终一致性刚性事务满足ACID理论Atomic(原子性):要么都成功要么都失败Consistent(一致性):数据应该不被破坏Isolate(隔离性):用户间操作不相混淆Durable(持久性):永久保存三、分布式锁3.1、什么场景下要使用分布式锁分布式锁在以下场景中非常有用共享资源的互斥访问当多个分布式节点需要同时访问某个共享资源例如数据库、文件系统时为了保证数据的一致性和避免冲突可以使用分布式锁来确保同一时间只有一个节点能够访问该资源。避免重复操作在某些情况下需要防止重复操作即同一个任务在分布式环境中只能被执行一次。使用分布式锁可以确保只有一个节点能够成功获取锁并执行任务其他节点则被阻塞或放弃执行。控制并发流量在高并发环境下为了避免系统资源耗尽可以使用分布式锁来控制并发流量。只有获取到锁的节点才能执行某个操作其他节点需要等待锁释放后才能继续执行。避免竞态条件当多个节点同时进行某个操作时可能会产生竞态条件Race Condition导致数据不一致或者错误的结果。通过使用分布式锁可以在关键的操作中保持原子性避免竞态条件的发生。任务调度与协调在分布式任务调度中可以使用分布式锁来协调任务的执行顺序和避免重复执行。只有获取到锁的节点才能执行任务其他节点需要等待或者跳过。更常见的场景是防止超卖问题3.2、分布式锁的实现方案有哪些基于数据库的分布式锁可以利用数据库的唯一性约束或者悲观锁来实现分布式锁。通过在数据库中创建一个表或者记录利用事务的特性来确保锁的唯一性。基于 Redis 的分布式锁使用 Redis 的 SETNXSET if Not eXists指令来实现简单的分布式锁。通过在 Redis 中设置一个键值对表示锁利用原子操作来确保锁的互斥性。或者直接采用 redisson 客户端基于 ZooKeeper 的分布式锁利用 ZooKeeper 的临时顺序节点和Watch 机制来实现分布式锁。通过创建临时顺序节点来竞争锁同时利用 Watch 机制监听节点变化来实现分布式锁的释放和获取。补充:ZooKeeper 是一个分布式协调服务用来给分布式系统做统一管理、协调、配置管理和服务注册发现。3.3、如何选择分布式锁方案1、redisson可以使用在并发高性能要求高的场景2、zookeeper采用cp模式保证高可靠性对于更高要求绝对可靠的场景3.4、redisson分布式锁如何应用在 Redisson 中使用分布式锁通常包括以下步骤创建 Redisson 客户端连接到 Redis 服务器。通过Redisson API获取分布式锁对象。在关键代码段中使用分布式锁的加锁和解锁方法来控制对共享资源的访问。例如在 Redisson 中获取分布式锁的代码示例可能如下所示Config config new Config(); config.useSingleServer().setAddress(redis://127.0.0.1:6379); RedissonClient redisson Redisson.create(config); RLock lock redisson.getLock(myLock); try { // 尝试加锁最多等待100秒并且锁的自动过期时间为30秒 boolean isLocked lock.tryLock(100, 30, TimeUnit.SECONDS); if (isLocked) { // 成功获取到锁执行关键代码段 // ... } else { // 获取锁失败做相应处理 // ... } } finally { // 释放锁 lock.unlock(); }3.5、如何实现分布式锁的可重入可重入锁意思是对于同一线程可以多次获取锁那不同线程之间同一把锁不能重复获取怎么保证线程可重入获取锁呢?解决我们可以通过维护当前持有锁的计数来实现可重入功能。加锁的时候因为保存了锁的线程标识后续再次获取锁先看是否是同一个线程如果是的话只对锁计数进行递增解锁时对锁计数进行递减同时刷新锁的过期时间。如果计数为 0最终才释放锁3.6、如何提升分布式锁性能1、锁定的代码块尽量的少和尽早的释放锁2、redis集群有助于redis的处理效率3、库存数据不一定使用分布式锁而是可将库存放入redis中然后递减方式来实现扣减4、复杂一点的实现也可以采用分段分布式锁将库存分成好几个数据然后锁这几个数据也能提高性能末尾页