最近在做在线架构的实现,在线架构和离线架构近线架构最大的区别是服务质量(SLA,Service Level Agreement,SLA 99.99代表10K的请求最多一次失败或者超时)和延时。而离线架构在意的是吞吐,SLA的不会那么严苛,比如99.9。离线架构一般要有流控,以控制用户发送请求的速度。以免多于服务端处理能力的请求造成大量的数据在buffer或者队列里堆积,造成大量的超时。在线架构不可能有流控了,你不能限制用户的请求。因此在线架构对于弹性扩容有很高的要求,在大量请求到来时自动扩展后台的服务能力。比如当前的请求已经占用了集群的70%的资源时,系统需要自动的扩容;相反,当前的请求仅仅占用了集群20%的资源时,有必要回收一部分资源了。要知道,公司机房的电费还是很贵的。
当然了在线和离线架构的相同和区别谈起来完全是一个大文章。本文主要关注在处理高并发请求的锁的使用上。几个原则吧:
- 不要使用全局锁。使用全局锁代表在需要请求锁时,其他为得到锁的线程都会等待,这将导致服务能力急剧下降。
- 一定要注意锁的作用范围,一定要保证锁作用于足够小的范围。一定不要在锁定区域有等待操作,比如IO调用。
- 尽量的考虑修改架构,避免加锁。
试想一个场景,为了服务质量,我们可能发送多个请求到后台,以达到:
- 高可用行,后台的某个节点挂了,有其他的backup request会被请求。如果节点的SLA是99%(很低了),那么发送2个请求到后台,SLA可以达到99.99%;如果单个节点的SLA是99.

本文探讨在线架构处理高并发请求时如何避免使用全局锁,强调锁的作用范围要尽可能小,建议通过修改架构来避免加锁。在实现高可用性和低延迟的场景下,提出使用一个线程池,根据特定请求ID调度工作线程,确保异步回调在同一线程中处理,从而消除锁的需求。此外,提及无锁编程可能涉及的CAS操作。
最低0.47元/天 解锁文章
2318

被折叠的 条评论
为什么被折叠?



