现状简介
以阿里云的FC举例,业务在使用JAVA语言时,时常遇到一个问题,就是每个函数都需要一个独立的容器(docker)启动,有时候我们会将函数的粒度拆分的比较小。比如一个报表业务系统中,有三四十个QPS不到1的函数,这种情况会对FC的资源利用率造成比较大的挑战。
问题
- Java Runtime 资源利用率高,同一个项目,每个函数都占用一个docker,浪费大。
- 在优化资源利用率和性能的前提下如何保证安全性:一个函数的异常不影响其他函数的运行。
Java Runtime
目前基于二方包+冷启动的方式。启动慢,资源利用率低(一个函数对应一个jar包,一个jar包对应一个continer(docker))。需要升级。
升级需求(已有中间件能够支持的不考虑):
- 调度粒度更细(单continer内部多JAVA Func)
- 支持调度-将调度的过程拆分。 A进程将bundleA 终止,卸载。 B进程将bundleA拉取,启动。通过中心化的调度管理中心统一调度。
- 监控
- JVM内部管理
方式一:JAVA单进程运行时加载+完善的函数生命周期。
核心:指定classloader。
OSGI思想
Karaf:https://karaf.apache.org/manual/latest/#_prerequisites
karaf-docker run 命令记录 使用的是apache的官方docker镜像
1 | docker run -p 80:8090 -v /Users/kaiwang/karaf/deploy:/opt/apache-karaf/deplo apache/karaf |