惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
L
LINUX DO - 最新话题
罗磊的独立博客
IT之家
IT之家
阮一峰的网络日志
阮一峰的网络日志
WordPress大学
WordPress大学
Security Archives - TechRepublic
Security Archives - TechRepublic
H
Hacker News: Front Page
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
The Hacker News
The Hacker News
Recent Commits to openclaw:main
Recent Commits to openclaw:main
大猫的无限游戏
大猫的无限游戏
PCI Perspectives
PCI Perspectives
Hugging Face - Blog
Hugging Face - Blog
博客园 - 【当耐特】
Application and Cybersecurity Blog
Application and Cybersecurity Blog
P
Proofpoint News Feed
NISL@THU
NISL@THU
小众软件
小众软件
S
Security Affairs
腾讯CDC
人人都是产品经理
人人都是产品经理
C
Check Point Blog
The GitHub Blog
The GitHub Blog
有赞技术团队
有赞技术团队
Forbes - Security
Forbes - Security
Project Zero
Project Zero
G
Google Developers Blog
博客园 - 三生石上(FineUI控件)
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
博客园_首页
Jina AI
Jina AI
The Cloudflare Blog
C
Cisco Blogs
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
L
Lohrmann on Cybersecurity
Y
Y Combinator Blog
W
WeLiveSecurity
V
Visual Studio Blog
Scott Helme
Scott Helme
N
News | PayPal Newsroom
I
Intezer
C
CXSECURITY Database RSS Feed - CXSecurity.com
Attack and Defense Labs
Attack and Defense Labs
Spread Privacy
Spread Privacy
Webroot Blog
Webroot Blog
T
Threatpost
雷峰网
雷峰网
MongoDB | Blog
MongoDB | Blog
N
News and Events Feed by Topic

祈雨的笔记

安全多方计算MPC spark原理解析 kueue执行源码分析 spark on k8s执行源码分析 spark-operator源码解析 系统压测遇到的缓存击穿问题 我的世界PC与安卓联机 蚂蚁金服流量投放平台的AIG改造 G1大对象致Old区占用率高 日志打印导致接口响应率下跌分析 Groovy加载类导致OOM分析 ERROR日志打印导致CPU满载 记OceanBase死锁超时 应用发版期间服务响应超时 系统优化复盘一二三 The user specified as a definer does not exist Kong网关初探 API网关选型调研 CPU火焰图常用工具 配置中心选型调研 root操作Nginx导致用户组错误 基于Proxifier使用代理 FastJSON字段智能匹配踩坑 Nacos初探 记一次Nginx服务器CPU满荷载故障 基于券系统分库分表的思考 limit不参与SQL成本计算致索引失效 Linux常用性能监控命令 golang低版本http2偶现400 hostname in certificate didn't match 常见对称加密原理以及应用 tcp_tw_recycle引起的TCP握手失败 记一次mysql执行DDL导致锁表 mysql磁盘占用查看 mysql对text字段update致磁盘增长 elasticsearch报错index read-only TIME_WAIT与Http的Keep-Alive 记一次TIME_WAIT导致连接数报警 记一次生产事故OOM问题排查 redis分布式锁RedissonLock的实现细节 webservice复杂加密签名(2)java调用 webservice复杂加密签名(1)SoapUI mysql延时关联 利用中间人拦截实现APP内H5窜改 MySQL表字符集不同导致关联查询索引失效 通过SSH隧道远程办公 数据落盘方案 BeanDefinitionRegistryPostProcessor扩展 mysql空间索引 HTTPS攻击 spring循环依赖过程解析 elasticsearch性能优化 mysql IS NULL 使用索引 mysql字符集utf8mb4失效踩坑 常用加密算法 xml与javaBean转换 初探InnoDB MVCC源码实现 mysql索引原理 redis之list源码分析 redis之key过期源码分析 redis之string源码分析 redis之hash源码分析 线程池之ThreadPoolExecutor mysql数据页结构 Using temporary与Using filesort mysql回表致索引失效 springboot(28)HTTP连接池 定时任务之ScheduledThreadPoolExecutor elasticsearch常用script聚合 elasticsearch实现like查询 elasticsearch实现乐观锁 elasticsearch准实时原理 springboot(27)自定义缓存读写机制CachingConfigurerSupport optimizer tracing arthas常用命令 HTTP和HTTPS详解 redis集群选举机制 kafka消息重试 一点压力测试的经验 kafka架构概念 explain分析sql语句字段的解释 JVM问题分析处理手册 logstash过滤器(2)date logstash过滤器(3)dissect logstash编码器(1)json logstash编码器(2)multiline logstash表达式 logstash输入(1)通用选项 logstash输入(3)file logstash过滤器(1)通用选项 logstash输入(2)stdin logstash安装 记一次前端vConsole导致JSON序列化错误排查 解决多个异步操作嵌套问题 fastjson反序列化失败autoType is not support RTMP串流服务 POI自动调整列宽错误 Nginx+Lua实现动态黑名单 使用curl命令模拟POST和GET请求 ResponseEntity下载文件
Ark Serverless初探
祈雨的笔记 · 2021-06-27 · via 祈雨的笔记

Ark Serverless

前几年流行大中台小前台概念,将业务中通用的基础业务服务例如会员、商品、交易等功能服务收敛统一,将这些通用业务合并成一个中台服务,业务前台通过调用中台提供的统一服务实现自己的需求功能。通过业务中台化让业务数据汇总在中台系统,避免以前各个系统的数据隔离,可以实现各业务系统的数据汇总以及沉淀,更好地为前台服务提供支持。

但大中台意味着中台系统的服务接口多、系统庞大,导致需求迭代成本越来越高。系统迭代需要提前很久进行需求规划,将多个团队多个需求变更合并在同一个版本迭代中上线,这导致需求迭代不灵活以及效率低下,并且如果某个迭代需求出现延误无法在预定的版本迭代时间点上线,只能推延到下一个迭代版本上线。

为了解决这个痛点出现了Ark Serverless,通过Ark Serverless可以将一个中台系统拆分成一个Master Biz模块和若干个普通Biz模块。进行需求迭代时只需要负责的团队独立开发迭代上线对应的Biz模块,如同插件一般只对指定的Biz模块进行热部署,大大提高了需求迭代的灵活性,也降低了不同团队之间的协作开发约束。

image

当然这种模式看上去反微服务架构,但随着业务增长系统越来越庞大,全部拆分成微服务会导致应用数量暴增,服务调用链路过长性能下降,另外数量庞大的微服务架构也会造成运维复杂和资源性能浪费的问题。典型的就是与Golang应用做对比,一个相同业务能力的JVM应用动辄需要上G的内存,而Golang只需要区区几十M的内存,相比之下数量庞大的JVM微服务应用会造成资源利用率低问题。

SOFAArk

介绍

SOFAArk是基于JAVA实现的轻量类隔离容器,可以类比外面开源的Tomcat,在容器中可以同时运行多个应用。不过相比Tomcat,SOFAArk除了提供容器运行环境以及运行模块间的类隔离,还提供了运行模块之间的服务交互,允许不同模块之间通过SofaService/SofaReferenceJVM服务进行交互。另外为了模块热插拔的能力,还实现了动态合并部署,SOFAArk对接配置中心,运维可以以此动态控制容器中的模块热部署和卸载。

image

实现

SOFAArk默认为单容器模式,每个Biz模块之间只有classloader隔离,该模式的实现机制见https://www.sofastack.tech/projects/sofa-boot/sofa-ark-classloader/

1
com.alipay.sofa.ark.container.service.classloader.BizClassLoader
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
@Override
protected Class<?> loadClassInternal(String name, boolean resolve) throws ArkLoaderException {
Class<?> clazz = null;

if (classloaderService.isSunReflectClass(name)) {
throw new ArkLoaderException(
String
.format(
"[ArkBiz Loader] %s : can not load class: %s, this class can only be loaded by sun.reflect.DelegatingClassLoader",
bizIdentity, name));
}

if (clazz == null) {
clazz = findLoadedClass(name);
}

if (clazz == null) {
clazz = resolveJDKClass(name);
}

if (clazz == null) {
clazz = resolveArkClass(name);
}

if (clazz == null) {
clazz = preLoadClass(name);
}

if (clazz == null) {
clazz = resolveExportClass(name);
}

if (clazz == null) {
clazz = resolveLocalClass(name);
}

if (clazz == null) {
clazz = resolveJavaAgentClass(name);
}

if (clazz == null) {
clazz = postLoadClass(name);
}
if (clazz != null) {
if (resolve) {
super.resolveClass(clazz);
}
return clazz;
}
throw new ArkLoaderException(String.format("[ArkBiz Loader] %s : can not load class: %s",
bizIdentity, name));
}

image

资源隔离问题

SOFAArk默认所有的Biz运行在同一个容器上,同一个进程内服务调用只需要通过JVM内部通信即可,但也意味着所有的Biz都运行在同一个进程中,物理资源的隔离就成了问题,例如物理机的CPU、磁盘容量等资源无法做到很好的隔离,从而出现因为资源竞争导致的种种问题。

因而SOFAArk为了解决资源隔离的问题,还提供了另一种运行模式:Pod内多容器模式,即每个Biz单独部署在一个容器中,并和基座部署在同一个Pod里。这种模式下每个Biz分配一个进程执行,并且可以实现更加严格的资源隔离,但也因此Biz之间的服务调动无法通过JVM直接通信,需要将JVM服务转成RPC服务来实现服务调用。

image

JVM转RPC方案如下,将mosn作为注册中心,Biz将自己注册到mosn中。如下图,BizB服务调用BizA,在多容器部署模式下,BizA将自己注册到mosn中,BizB通过mosn获取本Pod内可调用的服务端,然后以PRC的形式与BizA进行通信。该方案流程比单容器模式链路更长更复杂,模块间的服务调用通过RPC导致效率不如JVM调用。因此如果不是对资源隔离有严格的要求,建议使用单容器部署模式。

image