阿里巴巴的主要业务包括在线交易,支付和其他业务,下图中列出阿里巴巴中采用的一些开源项目。
阿里巴巴基于服务进行开发系统,服务间通过 RPC 进行通讯。要应对高并发,对于阿里的挑战。
多租户的看起来是不是有点像微服务,在淘宝的个人推荐上应该多租户
每一个 java 的线程对应一个native 线程。我们通过control group 来分配线程。
我们汇总一下阿里对
1.Multi-tenant 有关多租户之前我们已经介绍过。那么多租户具体采用那种技术来实现的呢。在每个租户的线程也是如何分配和隔离的。
多租户,可以为每个租户分配一定内存和CPU资源。G1 是才用分代算法,按年轻代和老年代来划分内存。G1 的特点是讲内存等分为若干小的区域 region , 包括 Eden survivor old。通过改造我们让每一个租户都被分配到一定内存。G1 会安租户来管理堆内存,进行垃圾回收。所以每一个租户是独立的GC。好了,我们看一下每个租户是如何获取自己的 CPU 资源。概述一下,每一个 java 线程都会对应到 native 线程。然后用 control group 管理 native 线程来控制如何分配资源给租户。
2.GCIH :通过 GCIH 划分出来部分内存,自主管理,这些这部分内存对于 GC 是不可见的。管理堆内存,让一些内存自主管理对 GC 是不可见的。这样来实现缓存数据机制。
3.Wisp :专注于异步编程。每一次用户请求都是,都是一次等待,都是一次线程阻塞。
异步编程是通过线程间切换来实现的,其实线程间交互数据,在底层是一种很费资源的解决方案,因为线程间的通讯是需要切换上下文,早在 Linux 中就不提倡使用线程池来实现异步编程。阿里采用协程代替线程来进行异步编程。通过协程来做一些阻塞的操作。有关于协程的概念。
如果你有 Python js es6的背景,尤其是你要是有 golang 的经验就跟不难理解,go 语言是处理高并发的高手,Go语言从语言层面上就支持了并发,这与其他语言大不一样,不像以前我们要用Thread库 来新建线程,还要用线程安全的队列库来共享数据。强大武器就是 goroutine和channel
。在新贵的 kotlin 中也对协程有良好的支持,协程相对于线程开销要小的多。java 也是也有自己的并发解决的方案。但是通过线程来解决高并发的问题,不仅是开销的问题,而且是有瓶颈的,当分配线程达到一定数量,即是再分配更多的线程也不会有明显的效果。
网友评论