searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

提高CDN刷新性能的一种方法

2023-04-19 01:48:28
22
0

背景技术

  内容分发网络,其原理是利用CDN各个层级的节点,将远端源站的资源缓存到离用户更近的节点,用户可以就近获取资源,从而达到减少源站压力,提高访问速度的目的。

  在CDN系统中,刷新是内容管控的重要功能之一,当源站文件内容已改变,但CDN节点缓存的文件尚未过期时,用户需要通过刷新功能删除CDN缓存内容,确保重新回源的内容与源站的保持一致,如果CDN缓存内容与源站不一致,会影响用户业务的正常运行,严重时会导致用户服务故障。

  线上使用中,一天的刷新任务数量高达数亿条,高峰期的QPS超过40K,同时,客户对业务请求的业务指标(正确率、中断率等)及性能指标(首包时长、下载速度等)要求严格,需要优先保障业务请求能够正确的快速的响应,所以,对刷新业务的处理方法提出的要求是:1)能够应对高并发的刷新任务;2)优先保障业务请求,刷新业务尽量减少对业务请求造成影响。

原有的刷新逻辑,如图1所示,

  • 插入刷新任务列表:用户在提交刷新任务后,系统会将刷新任务下发到CDN系统中每一台缓存设备上,缓存设备在收到刷新任务后,需要将刷新任务保存在内存中一段时间;
  • 查找(读取)刷新任务列表:在这段时间内,刷新任务会源源不断的插入到该内存中,与此同时,接收到业务请求后,需要在该内存中查找是否有和业务请求匹配的刷新任务规则,如果匹配,就会触发执行真正的刷新操作,然后再执行正常的业务流程;
  • 删除刷新任务列表:随着刷新任务不断下发,内存中的刷新任务会越来越多,所以到了一定时间后,要将过期的刷新任务从内存中删除;

  从以上描述中可以看出,刷新任务到达时,要对刷新任务列表做插入操作;刷新任务过期时,要对刷新任务列表做删除操作;业务请求到达时,要对刷新任务列表做查找操作。在同一个任务列表中,也即是同一个内存块中,同时存在插入、查找和删除操作,为了保证内存使用安全,需要在读写内存操作前对该内存进行加锁,而这样的加锁操作,在刷新任务和业务请求同时处于高并发状态时,会显著增加锁的竞争,导致系统负载升高,降低刷新业务的处理能力,正常业务的执行效率也会受到影响。

 

优化方案

图2所示,具体步骤介绍如下:

  • 将原逻辑中的保存刷新任务列表的内存按照时间单位分为3块,分别是:当前时间单位接收并保存刷新任务的列表(记作Current-List)、上一个时间单位接收并保存刷新任务的列表(记作Pre-List)、下一个时间单位接收并保存刷新任务的列表(记作Next-List);
  • 在当前时间单位中,接收到新的刷新任务对Current-List做加锁插入,Current-List中保存的是当前时间单位的刷新任务,肯定是新鲜的,Pre-List中的部分刷新任务的过期时间还不足一个时间单位,该部分的刷新任务也是新鲜的,所以业务请求若要查找是否有匹配的且尚未过期的刷新任务,需要从Current-List和Pre-List中查找,而Next-List在下一个时间单位要用来插入新的刷新任务,对于当前时间单位来说,若其内部存储的是上上个时间单位接收并保存的刷新任务,经过了两个时间单位,已经处于过期状态,对其做加锁删除操作,清空内部数据;
  • 随着下一个时间单位到来,上述步骤中的Current-List作为这一时间单位的Pre-List使用,上述步骤中的Next-List已经被清空,作为这一时间单位的Current-List使用,而上述步骤中的Pre-List,作为这一时间单位的Next-List使用,其内部存储的刷新任务随着时间推移全部成为了过期任务,对其做加锁删除操作,清空内部数据,为再一个时间单位做好准备;
  • 随着时间推移,依次类推,三个刷新任务列表,角色会按照Current-ListàPre-ListàNext-ListàCurrent-List这样循环变换,但是不变的是,Current-List用于加锁插入,Next-List用于加锁删除,在Current-List和Pre-List中进行查找;

 

  主要思路是,将原有刷新任务列表一分为三,删除操作只会存在于Next-List中,插入操作只会存在于Current-List中,查找操作只会存在于Current-List和Pre-List中。

  插入操作只存在于Current-List中,删除操作只存在于Next-List中,可以使得两者之间不再相互影响,和原方法相比,可以有效提高刷新任务的处理性能;在Current-List中,同时存在查找和插入操作,也即是一写多读的场景中,在一定条件下(比如允许脏读),读操作可以无需加锁,和原方法相比,业务请求执行过程中的查找操作无需加锁,可以避免受到刷新业务的影响。

  综上可知,本方法可以避免查找操作时的加锁操作,规避插入操作和删除操作的相互影响,从而达到提高刷新任务处理性能,及减少刷新业务对正常业务请求造成影响的目的

0条评论
0 / 1000
乙己
5文章数
0粉丝数
乙己
5 文章 | 0 粉丝
原创

提高CDN刷新性能的一种方法

2023-04-19 01:48:28
22
0

背景技术

  内容分发网络,其原理是利用CDN各个层级的节点,将远端源站的资源缓存到离用户更近的节点,用户可以就近获取资源,从而达到减少源站压力,提高访问速度的目的。

  在CDN系统中,刷新是内容管控的重要功能之一,当源站文件内容已改变,但CDN节点缓存的文件尚未过期时,用户需要通过刷新功能删除CDN缓存内容,确保重新回源的内容与源站的保持一致,如果CDN缓存内容与源站不一致,会影响用户业务的正常运行,严重时会导致用户服务故障。

  线上使用中,一天的刷新任务数量高达数亿条,高峰期的QPS超过40K,同时,客户对业务请求的业务指标(正确率、中断率等)及性能指标(首包时长、下载速度等)要求严格,需要优先保障业务请求能够正确的快速的响应,所以,对刷新业务的处理方法提出的要求是:1)能够应对高并发的刷新任务;2)优先保障业务请求,刷新业务尽量减少对业务请求造成影响。

原有的刷新逻辑,如图1所示,

  • 插入刷新任务列表:用户在提交刷新任务后,系统会将刷新任务下发到CDN系统中每一台缓存设备上,缓存设备在收到刷新任务后,需要将刷新任务保存在内存中一段时间;
  • 查找(读取)刷新任务列表:在这段时间内,刷新任务会源源不断的插入到该内存中,与此同时,接收到业务请求后,需要在该内存中查找是否有和业务请求匹配的刷新任务规则,如果匹配,就会触发执行真正的刷新操作,然后再执行正常的业务流程;
  • 删除刷新任务列表:随着刷新任务不断下发,内存中的刷新任务会越来越多,所以到了一定时间后,要将过期的刷新任务从内存中删除;

  从以上描述中可以看出,刷新任务到达时,要对刷新任务列表做插入操作;刷新任务过期时,要对刷新任务列表做删除操作;业务请求到达时,要对刷新任务列表做查找操作。在同一个任务列表中,也即是同一个内存块中,同时存在插入、查找和删除操作,为了保证内存使用安全,需要在读写内存操作前对该内存进行加锁,而这样的加锁操作,在刷新任务和业务请求同时处于高并发状态时,会显著增加锁的竞争,导致系统负载升高,降低刷新业务的处理能力,正常业务的执行效率也会受到影响。

 

优化方案

图2所示,具体步骤介绍如下:

  • 将原逻辑中的保存刷新任务列表的内存按照时间单位分为3块,分别是:当前时间单位接收并保存刷新任务的列表(记作Current-List)、上一个时间单位接收并保存刷新任务的列表(记作Pre-List)、下一个时间单位接收并保存刷新任务的列表(记作Next-List);
  • 在当前时间单位中,接收到新的刷新任务对Current-List做加锁插入,Current-List中保存的是当前时间单位的刷新任务,肯定是新鲜的,Pre-List中的部分刷新任务的过期时间还不足一个时间单位,该部分的刷新任务也是新鲜的,所以业务请求若要查找是否有匹配的且尚未过期的刷新任务,需要从Current-List和Pre-List中查找,而Next-List在下一个时间单位要用来插入新的刷新任务,对于当前时间单位来说,若其内部存储的是上上个时间单位接收并保存的刷新任务,经过了两个时间单位,已经处于过期状态,对其做加锁删除操作,清空内部数据;
  • 随着下一个时间单位到来,上述步骤中的Current-List作为这一时间单位的Pre-List使用,上述步骤中的Next-List已经被清空,作为这一时间单位的Current-List使用,而上述步骤中的Pre-List,作为这一时间单位的Next-List使用,其内部存储的刷新任务随着时间推移全部成为了过期任务,对其做加锁删除操作,清空内部数据,为再一个时间单位做好准备;
  • 随着时间推移,依次类推,三个刷新任务列表,角色会按照Current-ListàPre-ListàNext-ListàCurrent-List这样循环变换,但是不变的是,Current-List用于加锁插入,Next-List用于加锁删除,在Current-List和Pre-List中进行查找;

 

  主要思路是,将原有刷新任务列表一分为三,删除操作只会存在于Next-List中,插入操作只会存在于Current-List中,查找操作只会存在于Current-List和Pre-List中。

  插入操作只存在于Current-List中,删除操作只存在于Next-List中,可以使得两者之间不再相互影响,和原方法相比,可以有效提高刷新任务的处理性能;在Current-List中,同时存在查找和插入操作,也即是一写多读的场景中,在一定条件下(比如允许脏读),读操作可以无需加锁,和原方法相比,业务请求执行过程中的查找操作无需加锁,可以避免受到刷新业务的影响。

  综上可知,本方法可以避免查找操作时的加锁操作,规避插入操作和删除操作的相互影响,从而达到提高刷新任务处理性能,及减少刷新业务对正常业务请求造成影响的目的

文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
2
2