获得徽章 0
#毕业考研还是工作?# nginx\n具体就是一个轻量级以及高性能的web服务软件。\n\nnginx特点\n1、稳定性高。(但不如apache)\n\n2、系统资源消耗比较低。(处理http请求的并发能力较高,单台处理器可以处理3w-5w的并发请求)\n\n注:一般在企业中,为了保存服务器稳定,并发量的设置一般在2w左右。\n\nnginx的主要功能\n1、静态文件服务。(nginx可以直接提供静态文件服务。能够高效处理并响应静态文件的请求。)\n\n2、反向代理。(nginx本身可以作为一个反向代理的服务器。可以把客户端的请求转发给后端多个服务器,实现负载均衡,高可用。可以提高整个集群的性能。)\n\n反向代理:客户端在请求时,沟通代理服务器,会把请求的流量按照轮询算法,转发到后台不同的服务器,实现高可用和负载均衡。\n3、处理动态内容。(nginx处理动态内容很差,但它可以代理请求,发送到后端的动态服务处理,动态服务处理完后,由nginx把动态请求响应给客户端。)\n\n4、可以实现SSL/TLS加密(https的加密方式数字证书验证机制)\n\n5、虚拟主机。(nginx可以在一台服务器上设置多个虚拟主机,同一台服务器上可以有多个域名和站点。)\n\n6、URL重定向。(可以实现灵活的URL重写和重定向。)\n\n7、缓存功能。\n\n8、日志功能。(可以详细的记录请求的信息,包括访问时间,请求路径,IP地址,响应状态。有助于故障排查。)
展开
评论
点赞
#2023年中总结# 消费者在消费消息的时候,需要知道从Broker的哪一个消息队列中去获取消息。所以,在消费者端必须要做负载均衡,即Broker端中多个消费队列分配给同一个消费者组中的哪些消费者消费。上篇文章讲解了负载均衡过程,这篇文章讲解消费者负载均衡的策略AllocateMessageQueueStrategy是负载均衡策略接口,有两个方法,分别是allocate和getName,allocate方法是为消费者分配消息队列,getName是获取负载均衡策略的名AllocateMessageQueueStrategy接口有六个子类实现。负载均衡策略说明它们具体说明如下:AllocateMessageQueueAveragely:平均负载策略,将消息队列平均分配给每一个消息者。假设一个topic有8个消息队列,有3个消息者A、B、C,那么采用该负载策略,那么A首先分配3个消息队列,然后B也分配3个消息队列,最后C分配2个消息队列。AllocateMessageQueueAveragelyByCircle:循环平均负载策略,跟平均负载策略不同的是。是将消息队列一个一个的分配给消息者。假设一个topic有8个消息队列,有3个消息者A、B、C。采用循环平均负载策略分配的方法是首先给A、B、C分别分配一个,然后再进行第二轮分配,也是给A、B、C分别再分配一个,这样子还剩下两个就分别分配给A、B。AllocateMessageQueueByConfig:配置负载策略,用户直接给消费者分配配置消息队列。AllocateMessageQueueConsistentHash:一致性哈希负载策略,为每一个消费者创建多个虚拟的节点,将虚拟节点连成一个环,这个环就是一致性哈希环,然后将消息队列进行哈希计算得到哈希值,通过哈希值找到距离一致性哈希环顺时针方向最近的那个虚拟节点,此时就可以通过虚拟节点获取到真实的消费者了,就将这个消息队列分配给这个消息者。
展开
评论
点赞
#与A-SOUL一起成为更好的自己# Mysql数据一致性与处理并发访问处理:隔离级别,锁策略与MVCC
莫念Program
2023-07-03 19:30
10
基础概念
脏读 一个事务中访问到了另外一个事务未提交的数据
不可重复读 一个事务内根据同一个条件对行记录进行多次查询,返回的结果不一致
幻读 同一个事务内多次查询返回的结果集不一样(增加了或者减少)
隔离级别
隔离级别 描述 锁
读未提交(read uncommit) 一个事务还没提交时,它做的变更就能被别的事务看到 任何操作都不会加锁
读提交(read commit) 一个事务提交之后,它做的变更才会被其他事务看到 在RC级别中,数据的读取都是不加锁的,但是数据的写入、修改和删除是需要加锁的
可重复读(repeatable read) 一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的 读操作不需要加锁,而写操作需要加锁。
串行化读(serializable): 当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。 “写”会加“写锁”,“读”会加“读锁”
隔离级别 脏读 不可重复读 幻读
读未提交(read uncommit) 可能 可能 可能
读提交(read commit) 不可能 可能 可能
可重复读(repeatable read) 不可能 不可能(MVCC实现) 不可能(用next-key lock 保证)
串行化读(serializable) 不可能 不可能 不可能
mysql隔离级别有两个作用域,一个是当前会话隔离级别,另一个是系统隔离级别。
读取数据时,数据库会创建视图,访问的时候以视图的逻辑结果为准
隔离级别 视图
读未提交(read uncommit) 直接返回记录上的最新值,没有视图概念
读提交(read commit) 视图是在每个 SQL 语句开始执行的时候创建的
可重复读(repeatable read) 视图是在事务启动时创建的,整个事务存在期间都用这个视图
串行化读(serializable) 直接用加锁的方式来避免并行访问。
莫念Program
2023-07-03 19:30
10
基础概念
脏读 一个事务中访问到了另外一个事务未提交的数据
不可重复读 一个事务内根据同一个条件对行记录进行多次查询,返回的结果不一致
幻读 同一个事务内多次查询返回的结果集不一样(增加了或者减少)
隔离级别
隔离级别 描述 锁
读未提交(read uncommit) 一个事务还没提交时,它做的变更就能被别的事务看到 任何操作都不会加锁
读提交(read commit) 一个事务提交之后,它做的变更才会被其他事务看到 在RC级别中,数据的读取都是不加锁的,但是数据的写入、修改和删除是需要加锁的
可重复读(repeatable read) 一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的 读操作不需要加锁,而写操作需要加锁。
串行化读(serializable): 当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。 “写”会加“写锁”,“读”会加“读锁”
隔离级别 脏读 不可重复读 幻读
读未提交(read uncommit) 可能 可能 可能
读提交(read commit) 不可能 可能 可能
可重复读(repeatable read) 不可能 不可能(MVCC实现) 不可能(用next-key lock 保证)
串行化读(serializable) 不可能 不可能 不可能
mysql隔离级别有两个作用域,一个是当前会话隔离级别,另一个是系统隔离级别。
读取数据时,数据库会创建视图,访问的时候以视图的逻辑结果为准
隔离级别 视图
读未提交(read uncommit) 直接返回记录上的最新值,没有视图概念
读提交(read commit) 视图是在每个 SQL 语句开始执行的时候创建的
可重复读(repeatable read) 视图是在事务启动时创建的,整个事务存在期间都用这个视图
串行化读(serializable) 直接用加锁的方式来避免并行访问。
展开
评论
点赞
#与A-SOUL一起成为更好的自己# ptime命令用于显示系统的负载情况和运行时间,要使用uptime命令查看系统的负载情况,只需在终端中输入uptime即可。
[root@svr01]$ uptime
21:27:44 up 207 days, 11:15, 1 user, load average: 26.45, 16.76, 7.50
在输出结果中,分别表示最近1分钟、5分钟和15分钟的平均负载。
系统负载是指在某个特定时间范围内正在使用或等待CPU资源的进程数量。下面是对不同负载范围的解释:
如果系统平均负载小于等于3,表示系统性能良好,可以正常运行。
如果系统平均负载小于等于4,表示系统性能还可以,可以接受一些额外的负载。
如果系统平均负载大于5,表示系统负载过重,可能会影响系统的性能并导致严重的问题,此时考虑扩容,例如增加CPU核心数量。
作者:洛神灬殇
链接:
juejin.cn
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
[root@svr01]$ uptime
21:27:44 up 207 days, 11:15, 1 user, load average: 26.45, 16.76, 7.50
在输出结果中,分别表示最近1分钟、5分钟和15分钟的平均负载。
系统负载是指在某个特定时间范围内正在使用或等待CPU资源的进程数量。下面是对不同负载范围的解释:
如果系统平均负载小于等于3,表示系统性能良好,可以正常运行。
如果系统平均负载小于等于4,表示系统性能还可以,可以接受一些额外的负载。
如果系统平均负载大于5,表示系统负载过重,可能会影响系统的性能并导致严重的问题,此时考虑扩容,例如增加CPU核心数量。
作者:洛神灬殇
链接:
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
展开
评论
点赞
#与A-SOUL一起成为更好的自己# BeanPostProcessor 的设计目标主要是提供一种扩展机制,让开发者可以在 Spring Bean 的初始化阶段进行自定义操作。这种设计理念主要体现了 Spring 的一种重要原则,即 “开放封闭原则”。开放封闭原则强调软件实体(类、模块、函数等等)应该对于扩展是开放的,对于修改是封闭的。在这里,Spring 容器对于 Bean 的创建、初始化、销毁等生命周期进行了管理,但同时开放了 BeanPostProcessor 这种扩展点,让开发者可以在不修改 Spring 源码的情况下,实现对 Spring Bean 生命周期的自定义操作,这种设计理念大大提升了 Spring 的灵活性和可扩展性。
BeanPostProcessor 不是 Spring Bean 生命周期的一部分,但它是在 Spring Bean 生命周期中起重要作用的组件。
BeanPostProcessor 不是 Spring Bean 生命周期的一部分,但它是在 Spring Bean 生命周期中起重要作用的组件。
展开
评论
点赞
#挑战每日一条沸点# 切片本质是一个数组片段的描述,包括了数组的指针,这个片段的长度和容量(不改变内存分配情况下的最大长度)
切片操作并不复制切片指向的元素,创建一个新的切片会复用原来切片的底层数组,因此切片操作是非常高效的
切片有三个属性,指针(ptr)、长度(len) 和容量(cap)。append 时有两种场景:
当 append 之后的长度小于等于 cap,将会直接利用原底层数组剩余的空间
当 append 后的长度大于 cap 时,则会分配一块更大的区域来容纳新的底层数组
因此,为了避免内存发生拷贝,如果能够知道最终的切片的大小,预先设置 cap 的值能够获得最好的性能
切片操作并不复制切片指向的元素,创建一个新的切片会复用原来切片的底层数组,因此切片操作是非常高效的
切片有三个属性,指针(ptr)、长度(len) 和容量(cap)。append 时有两种场景:
当 append 之后的长度小于等于 cap,将会直接利用原底层数组剩余的空间
当 append 后的长度大于 cap 时,则会分配一块更大的区域来容纳新的底层数组
因此,为了避免内存发生拷贝,如果能够知道最终的切片的大小,预先设置 cap 的值能够获得最好的性能
展开
评论
点赞
#高校食堂大赏# 几种常见错误设计。
1. 固定窗口
有人设计了一个在每分钟内只允许访问1000次的限流方案,如下图01:00s-02:00s之间只允许访问1000次,这种设计最大的问题在于,请求可能在01:59s-02:00s之间被请求1000次,02:00s-02:01s之间被请求了1000次,这种情况下01:59s-02:01s间隔0.02s之间被请求2000次,很显然这种设计是错误的。
jm36ts
2. 缓存时间更新错误
我在研究这个问题的时候,发现网上有一种很常见的方式来进行限流,思路是基于redis,每次有用户的request进来,就会去以用户的ip和request的url为key去判断访问次数是否超标,如果有就返回错误,否则就把redis中的key对应的value加1,并重新设置key的过期时间为用户指定的访问周期。
1. 固定窗口
有人设计了一个在每分钟内只允许访问1000次的限流方案,如下图01:00s-02:00s之间只允许访问1000次,这种设计最大的问题在于,请求可能在01:59s-02:00s之间被请求1000次,02:00s-02:01s之间被请求了1000次,这种情况下01:59s-02:01s间隔0.02s之间被请求2000次,很显然这种设计是错误的。
jm36ts
2. 缓存时间更新错误
我在研究这个问题的时候,发现网上有一种很常见的方式来进行限流,思路是基于redis,每次有用户的request进来,就会去以用户的ip和request的url为key去判断访问次数是否超标,如果有就返回错误,否则就把redis中的key对应的value加1,并重新设置key的过期时间为用户指定的访问周期。
展开
评论
点赞
#挑战每日一条沸点# 二十世纪六十年代之前,网络的概念主要用于电话通信,一次通话中双方之间需要建立一条线路(最初是一条物理线路,随着科技的发展,电话通信中的物理线路逐渐演变为电路交换网络。电路交换网络通过自动交换机实现电话之间的连接,从而避免了需要物理线路直接连接的限制),这条线路为用户提供一定的贷带宽或容量,以便传输信息。
二十世纪六十年代出现的一个重要概念——分组交换思想。分组交换中,包含一定字节数的数字信息“块”(分组)独立通过网络,在传输过程中可以在进行组合然后分解——(多路)复用。分组在到达目的地过程中会在交换设备之间传输,并且路径可变。这样做有两个优点:网络更有弹性;基于统计复用可以更好的利用网络链路和交换设备。
二十世纪六十年代出现的一个重要概念——分组交换思想。分组交换中,包含一定字节数的数字信息“块”(分组)独立通过网络,在传输过程中可以在进行组合然后分解——(多路)复用。分组在到达目的地过程中会在交换设备之间传输,并且路径可变。这样做有两个优点:网络更有弹性;基于统计复用可以更好的利用网络链路和交换设备。
展开
评论
点赞
#每日快讯# Spring Web MVC的核心思想是将应用程序的逻辑分为三个部分:模型(Model)、视图(View)和控制器(Controller)。模型负责处理数据,视图负责渲染数据并呈现给用户,控制器负责处理用户请求并将结果传递给视图进行呈现。这种分离使得应用程序的不同部分可以独立地进行开发和维护,提高了代码的可重用性和可维护性。
Spring Web MVC还提供了许多有用的功能,例如数据绑定、表单验证、文件上传和国际化支持等。这些功能可以帮助我们更加高效地开发Web应用程序,提高开发效率。
总之,Spring Web MVC是一种非常有用的Web框架,它能够帮助我们更加高效地开发Web应用程序,简化开发过程,提高代码的可重用性和可维护性。
Spring Web MVC还提供了许多有用的功能,例如数据绑定、表单验证、文件上传和国际化支持等。这些功能可以帮助我们更加高效地开发Web应用程序,提高开发效率。
总之,Spring Web MVC是一种非常有用的Web框架,它能够帮助我们更加高效地开发Web应用程序,简化开发过程,提高代码的可重用性和可维护性。
展开
评论
点赞
#挑战每日一条沸点# PowerShell获取当前目录文件夹路径path的方法
($pwd).Path
($pwd).Path
powershell复制代码($pwd).Path
(Get-Location).path
(Get-Location).path
powershell复制代码(Get-Location).path
(Resolve-Path .).path
(Resolve-Path .).path
powershell复制代码(Resolve-Path .).path
(gi .).FullName
(gi .).FullName
powershell复制代码(gi .).FullName
($pwd).Path
($pwd).Path
powershell复制代码($pwd).Path
(Get-Location).path
(Get-Location).path
powershell复制代码(Get-Location).path
(Resolve-Path .).path
(Resolve-Path .).path
powershell复制代码(Resolve-Path .).path
(gi .).FullName
(gi .).FullName
powershell复制代码(gi .).FullName
展开
评论
点赞
#2023年中总结#
利用漏桶算法对请求进行限流
ates:
- Path=/order/**
filters:
- name:RequestRateLimiter
args:
#使用SpEL从容器中获取对象
key-resolver:'#@pathKeyResolver}'
#令牌桶每秒填充平均速率
redis-rate-limiter.replenishRate:1
#令牌桶的上限
redis-rate-limiter.burstCapacity:3
key-resolver:定义限流对像(ip、路径、参数),需代码实现,使用 spel 表达式获取
redis-rate-limiter.replenishRate:令牌桶每秒填充平均速率
redis-rate-limiter.burstCapacity:令牌桶总容量。
利用漏桶算法对请求进行限流
ates:
- Path=/order/**
filters:
- name:RequestRateLimiter
args:
#使用SpEL从容器中获取对象
key-resolver:'#@pathKeyResolver}'
#令牌桶每秒填充平均速率
redis-rate-limiter.replenishRate:1
#令牌桶的上限
redis-rate-limiter.burstCapacity:3
key-resolver:定义限流对像(ip、路径、参数),需代码实现,使用 spel 表达式获取
redis-rate-limiter.replenishRate:令牌桶每秒填充平均速率
redis-rate-limiter.burstCapacity:令牌桶总容量。
展开
评论
点赞
#挑战每日一条沸点# 优化服务器负载对于确保运行在 Kubernetes 上的 Golang 应用程序的高性能和可扩展性至关重要。随着企业越来越多地采用容器化的方式和 Kubernetes 来部署和管理应用程序,采取减少服务器负载的最佳实践势在必行,进而达到最佳的资源利用效率、成本效益并改善用户体验。
运行 Golang 应用程序的多个容器可以放在一个 Kubernetes 集群内,并部署在多个节点上。每个容器可以使用 CPU、内存以及存储等系统资源。如果这些资源没有被高效地管理起来,可能会导致服务器负载不断增加,从而降低性能并增加支出。
因此,针对 Kubernetes 的 Golang 应用优化对于完成有效的资源利用、降低服务器负载以及保证应用在生产环境中顺利运行至关重要。
在本文中,我们将研究在 Kubernetes 上优化 Golang 应用的最佳方法,重点是降低服务器负载。我们会讨论一些方法,包括用 readiness 和 liveness 探针进行监控,利用弹性伸缩等功能来优化资源利用。
通过采取这些最佳实践,可以提高在 Kubernetes 上运行的 Golang 应用的性能和可扩展性,这将改善用户体验、节约成本,并提升运维效率。
运行 Golang 应用程序的多个容器可以放在一个 Kubernetes 集群内,并部署在多个节点上。每个容器可以使用 CPU、内存以及存储等系统资源。如果这些资源没有被高效地管理起来,可能会导致服务器负载不断增加,从而降低性能并增加支出。
因此,针对 Kubernetes 的 Golang 应用优化对于完成有效的资源利用、降低服务器负载以及保证应用在生产环境中顺利运行至关重要。
在本文中,我们将研究在 Kubernetes 上优化 Golang 应用的最佳方法,重点是降低服务器负载。我们会讨论一些方法,包括用 readiness 和 liveness 探针进行监控,利用弹性伸缩等功能来优化资源利用。
通过采取这些最佳实践,可以提高在 Kubernetes 上运行的 Golang 应用的性能和可扩展性,这将改善用户体验、节约成本,并提升运维效率。
展开
评论
点赞
#甜粽还是咸粽# 虽然写了很久的CRUD,但是依旧觉得写好CRUD是一件非常难且麻烦的事情,以下的情况在开发过程中应该都遇到过:
SQL的编写需要细心,写错了SQL字段或者表名称,修改完要重启(几分钟过去了)
SQL编写好后进行测试时,造数据也好麻烦,特别是还存在表关联的情况,数据内容不真实,还容易超出字段长度,让人抓狂
SQL好不容易能跑了,又会有以下的疑问
符不符合SQL开发规范?
是否能命中索引?又可能命中哪个索引?
日常环境数据太少,如何模拟SQL在生产环境下运行的真实情况?
性能怎么样,最大TPS可以达到多少?数量大时是否会存在慢SQL?
TP99/TP90、最大RT/平均RT、平均TPS是多少呢?
对于使用Mybatis的开发者还会存在这些问题:
Mapper接口方法和XML标签不对应,修改完要重启(又几分钟过去了)
XML中多写了一个逗号或者分号,又没有错误提示,接口测试调用时才发现,修改完又又要重启(好多个几分钟过去了)
这个Mapper接口对应的是哪个XML文件?找找十几秒过去了
这个XMl文件对应的是哪个Mapper接口?找找十几秒又过去了
这个项目中有多少个XML文件?有多少SQL语句?里面是否存在慢SQL?是否都符合开发规范?
SQL的编写需要细心,写错了SQL字段或者表名称,修改完要重启(几分钟过去了)
SQL编写好后进行测试时,造数据也好麻烦,特别是还存在表关联的情况,数据内容不真实,还容易超出字段长度,让人抓狂
SQL好不容易能跑了,又会有以下的疑问
符不符合SQL开发规范?
是否能命中索引?又可能命中哪个索引?
日常环境数据太少,如何模拟SQL在生产环境下运行的真实情况?
性能怎么样,最大TPS可以达到多少?数量大时是否会存在慢SQL?
TP99/TP90、最大RT/平均RT、平均TPS是多少呢?
对于使用Mybatis的开发者还会存在这些问题:
Mapper接口方法和XML标签不对应,修改完要重启(又几分钟过去了)
XML中多写了一个逗号或者分号,又没有错误提示,接口测试调用时才发现,修改完又又要重启(好多个几分钟过去了)
这个Mapper接口对应的是哪个XML文件?找找十几秒过去了
这个XMl文件对应的是哪个Mapper接口?找找十几秒又过去了
这个项目中有多少个XML文件?有多少SQL语句?里面是否存在慢SQL?是否都符合开发规范?
展开
评论
点赞
![[不失礼貌的微笑]](http://lf-web-assets.juejin.cn/obj/juejin-web/xitu_juejin_web/img/jj_emoji_16.9d17f6d.png)