学习日报 0822 项目+场景

学习社区项目:

配置jenkins自动部署,访问8080端口一直失败,发现8080端口没打开。

jenkins构建时遇到很多问题,提交了三十多次才全解决好。

1、git权限问题

可以把仓库设置成public,不用账号密码直接拉

2、git Failed to connect to github.com port 443 after 21117 ms: Couldn‘t connect to server

每次git push之后都会出现这个问题,具体原因不太清楚,通过

git config --global --unset http.proxy

git config --global --unset https.proxy

有时可以解决,也有可能是push之后需要等一段时间才能连接上,每次等待大概三四分钟就好了

3、GnuTLS recv error (-110): The TLS connection was non-properly terminated.

同2

4、maven项目运行时报错compilation failure - 不再支持源选项 5。请使用 7 或更高版本

在报错的包pom文件中添加配置,指定对应的版本号

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

    <!--指定编译器版本号8-->
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>

</properties>

5、cannot access class com.sun.tools.javac.processing

lombok版本过低导致的

<!--Lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.16</version>
</dependency>

改为1.18.24

<!--Lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.24</version>
</dependency>

docker拉minio代替oss

场景问题:

  • 如何设计一个高并发系统:

设计一个能够支持高并发的系统需要考虑多方面的因素,包括架构、性能优化、容错和可伸缩性等。

1、分布式架构: 将系统分解成多个模块,采用分布式架构来降低单点故障的风险,并提高系统的可伸缩性和性能。

2、集群部署: 将一个服务通过集群进行部署,来提升系统整体的吞吐量及响应速度,并使用负载均衡技术将请求2均衡分配给多个服务器,以提高系统的性能和可用性。

分布式系统和集群:

分布式就是把一个集中式系统拆分成多个系统,每一个系统单独对外提供部分功能,整个分布式系统对外提供一整套服务。对于访问分布式系统的用户来说,感知上就像访问一台计算机一样。

分布式系统中的多台计算机之间在空间位置上可以随意分布,系统中的多台计算机之间没有主从之分,既没有控制整个系统的主机,也没有受控的从机。

集群是指在多台不同的服务器中部署相同的应用或服务模块,构成一个集群,通过负载均衡设备对外提供服务。

1.利用缓存: 使用缓存、NoSQL等技术,以提高数据读写的性能和可靠性。

2.异步处理: 采用异步处理机制,如使用消息队列、事件驱动等技术,以降低请求响应时间和提高系统吞吐量

3.消息队列:解耦、异步、削峰

4.预加载: 使用预加载技术来提前加载需要的资源,以减少用户等待时间。

5.代码优化和调优: 对系统代码进行优化和调优,如采用异步I/0、避免锁(减小锁的粒度)、减少循环和递归、避免长事务等,以提高系统性能。

6.数据库优化: 合理的数据库设计和优化,包括合理的索引设计、分库分表、读写分离、缓存优化等,可以有效提高系统的并发度和响应速度。

7.分库分表: 将一个大型的数据库拆分成多个小型的数据库(分库),然后将每个小型数据库中的表再进行拆分(分表),从而减轻单个数据库或表的读写压力,通过分库分表,可以将大量的读写操作分散到多个数据库或表中,从而提高系统的并发度和响应速度。

8.读写分离: 读写分离是一种常用的数据库优化技术,它将读操作和写操作分配到不同的数据库实例上处理。通过读写分离,主库主要负责写操作,从库则负责读操作,从而提高了系统的并发度和可扩展性。同时,读写分离还可以提高系统的可用性和容错能力,因为即使主库出现故障,从库仍然可以提供读服务。

9.防止雪崩: 通过使用限流、熔断、降级等技术,可以防止系统因为某个组件出现故障而导致整个系统崩溃的雪崩效应。

限流、熔断、降级

10.容错和监控: 实现容错机制,如备份、容灾、负载降级等,以保障系统的可用性。同时,使用监控工具来实时监测系统的运行状况和性能瓶颈,及时做出调整和优化。

异地多活:

是一种分布式系统架构模式,可以让多个数据中心在不同地理位置提供相同的服务,并且能够实现数据的实时同步和故障切换。通常用于需要在全球范围内提供高可用性和低延迟的应用程序,例如在线游戏、社交媒体、金融交易。

在异地多活架构中,多个数据中心之间通过高速网络连接进行数据同步和负载均衡,每个数据中心都具有完整的应用程席和数据副本,可以同时提供服务并处理客户端请求。当一个数据中心发生故障时,可以通过自动切换和故障专移机制将流量转移到其他健康的数据中心,从而保证系统的可用性和可靠性。

同城容灾:

同城容灾架构相比于异地多活架构来说,更加适用于数据中心距离较近的情况。它可以通过使用复制、镜像和数据同步等技术来实现数据的备份和容灾,从而提高系统的可用性和可靠性。同时,同城容灾架构还可以提供低延迟和高带宽的网络连接,以支持高吞吐量的应用程序。

11.测试和评估: 进行全面的性能测试和评估,包括压力测试、负载测试、安全测试等,以发现并解决系统的性能瓶颈和安全隐患。

不用redis分布式锁,如何防止用户重复点击?

  • 前端设置按钮置灰操作,当用户点击一次后按钮禁用,但是有些情况可能来不及置灰,或者被用户绕过置灰操作。
  • 可以通过token的机制避免重复提交,当用户访问页面的时候,请求后端服务拿到一个token,然后下一次接口点击的时候把token带过来,服务端对token进行验证,验证该token是否被使用过,如果没有被使用过才可以进行点击。验证的逻辑可以放在数据库中,通过数据库的悲观锁或者乐观锁都可以实现。

例如:

  1. 滑动窗口限流:可以限制用户在一分钟或一秒钟内只能发起一次请求。
  2. 布隆过滤器:可以快速判断某个元素是否存在于集合中。可以在服务端使用布隆过滤器记录某个操作是否已经被执行过,从而防止重复执行。
  3. 参考ruoyi框架中的防重复提交的实现方案,其实就是把表单信息做校验并保存在redis中,下次再提交的时候做校验,如果和上次提交的内容一样,并且时间小于一定的时间间隔,则拒绝请求。

扩展:

滑动窗口限流:

首先需要把时间划分成多个连续的时间片段,然后定义一个时间窗口,比如10s,随着时间推移,窗口不断右移,通常有一个计数器去统计时间窗口内的请求。

当时间窗口移动时,不断减掉上一个时间片段的请求数,当有新的请求时,系统会检查窗口内计数是否已满,如果计数未满则允许执行,如果计数已满,拒绝请求或进入等待队列或执行其他限流操作。

优点是相比设置固定的请求数或速率,滑动窗口限流更加平滑,可以灵活应对突发流量或峰值流量,而不会因为固定速率的限制而浪费资源或降低系统性能。

Redis实现滑动窗口限流:

在Redis中,我们可以基于zset实现这个功能,假如我们限定login接口一分钟只能调用100次,那么,我们可以把login接口这个需要做限流的资源名作为key,在redis中进行存储。value是zset结构,把他的score设置为当前请求的时间戳,member用请求的详情的hash进行存储(或者UUID、MD5),避免在并发时时间戳一致导致幂等问题。

主要步骤:

1.定义滑动窗口的时间范围,例如,窗口大小为60秒。

2.每次收到一个请求时,我们就定义出一个zset然后存储到redis中。

3.然后再通过ZREMRANGEBYSCORE命令来删除分值小于窗口起始时间戳(当前时间戳-60s)的数据

4.最后,再使用ZCARD命令来获取有序集合中的成员数量,即在窗口内的请求量。

高并发情况下用lua脚本或者事务来保证原子性

Redission中已经给我们提供了一个限流器,不过并不是滑动窗口,而是一个令牌桶的算法

布隆过滤器:布隆过滤器是一种数据结构,用于快速检索一个元素是否可能存在于一个集合中,他的基本原理是利用多个哈希函数,将一个元素映射成多个位,然后将这些位设置为1.当查询一个元素时,如果这些位都被设置为1,则认为元素可能存在,否则肯定不存在。

所以,布隆过滤器可以准确的判断一个元素是否一定不存在,但是因为哈希冲突的存在,他没法判断一个元素一定存在,只能判断可能存在。

出现哈希冲突可能误判为存在。

布隆过滤器无法删除元素,因为删除一个元素需要将其对应的多个位设置为0,但这些位可能被其他元素共享。

有很多第三方库可以实现布隆过滤器,常见的有Google Guava、Apache Commons、以及Redis中的Redisson 或者 Jedis

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值