![PCM](https://www.gitlink.org.cn/images/avatars/Organization/123822?t=1689062058)
<p align="center">
  <a href="https://www.gitlink.org.cn/JointCloud/pcm-coordinator/tree/master/docs">文档</a> |
  <a href="https://www.gitlink.org.cn/JointCloud/pcm-coordinator#readme">English</a> | 
  <a href="https://www.gitlink.org.cn/JointCloud/pcm-coordinator/milestones">里程碑</a>
</p>

## 什么是Jointcloud和PCM
&emsp;&emsp;云际协作环境 (JointCloud cooperation environment, JCCE), JCCE 包括分布云交易、分布云社区、分布云监管以及基于区块链的分布记账系统， JCCE 中与信息交换尤其是价值交换相关的支撑技术, 利于打破云际协作参与方之间的信息不对称， 为参与各方创造多赢机会, 实现对云际计算商业模式创新的强有力支撑。

&emsp;&emsp;对等协作机制(peer cooperation mechanism, PCM)的愿景是在云际环境中构建一套所有服务提供方和需求方能够自主参与协作，实现对等交易，以非侵入的方式实现各利益主体间便捷高效的连接和调用，并在构建云际生态的同时形成行业标准，吸引更多云际服务商加入贡献。PCM站在云上视角，叠加于云之上，关注云之间协作多于云自身。

&emsp;&emsp;对等协作机制建立在一个标准的软件定义框架之上，按照这个标准框架，拥有物理云资源的云服务提供者可以自主定义PCM规则框架，其他遵循该规则框架的实体云即可参与协作交易，并进而面向领域应用定制虚拟专用云，满足各类云际参与者如中心侧、边缘侧和终端侧等异构基础设施资源直接自主参与协作和交易的需求。


## PCM力求解决的现实问题：

-   **效能提升**: 

&emsp;&emsp;云际开发者加入PCM框架后，可以通过描述性语言生成框架内部功能结构的代码和大部分规格定义，专注于业务逻辑开发，无需关心底层管理功能。框架提供微服务管理、多语言代码生成和模型桥接功能，可降低编码工作量和入门难度，提高能效。
    
-   **解决平台锁定问题**:

&emsp;&emsp;对等协作机制通过多云适配、标准化接口和抽象层等手段，有效解决平台锁定问题，实现跨平台运行、部署和交互。标准化接口简化开发人员工作，降低平台锁定风险。
    
-   **降低代码开发难度**:

&emsp;&emsp;对等协作开发框架降低了开发难度，提供了结构化开发模式、现成组件和文档支持，不同级别开发人员能更公平地协同工作。框架可节省约50%的开发时间，初级程序员用约15人天完成原需1人月的任务。自动生成工具、代码模板和组件复用等功能让开发者更专注于业务逻辑实现。无需再培训高级开发人员，可节省时间和人力资源成本，提高投入产出比。
    
-   **减少代码开发工作量**:

&emsp;&emsp;PCM框架提供自动化功能和代码生成工具，减少手动编写代码，提高开发速度和代码质量。使用框架的自动生成工具后，整体代码量超过一半由工具生成，低代码率达到约63%。开发者主要工作是编写描述语言文件生成基础结构，然后调整和编写逻辑功能的开发。这使团队能更快速敏捷地交付产品并进行业务优化和用户反馈迭代。


## 设计架构


&emsp;&emsp;Coordinator是框架的核心组件，实现了对不同Participant端技术栈的异构屏蔽。框架面向用户侧主要分为资源变更（任务提交）和集约展示两大功能。在任务提交后，PCM通过架设在云算云、智算云、超算云之上的调度中心来实现任务的动态流转。在集约展示部分，PCM主要通过Tracker以及P端主动上报的方式对多个Participant服务的资源、任务等信息进行收集和汇聚，向用户提供标准化的统一接口。用户可以在前端页面上查看PCM提供的信息，也可以通过接口直接获取数据。

![PCM架构](images/arch-ch.png)
## 服务部署



&emsp;&emsp;PCM的开发环境需要安装golang 1.18以上版本，参考下文内容将会在本地启动coordinator的相关服务。


&emsp;&emsp;拉取项目的命令如下
```
 git clone https://gitlink.org.cn/JointCloud/pcm-coordinator.git 
```
#### coordinator-rpc


&emsp;&emsp;rpc服务的配置内容模板如下

```
Name: pcm.core.rpc
ListenOn: 0.0.0.0:2004

DB:
  DataSource: username:password@(x.x.x.x:3306)/pcm?parseTime=true
  
SnowflakeConf:
  MachineId: 1
```

&emsp;&emsp;运行以下命令后将会在本地启动coordinator-rpc服务，其具体功能可参考上文架构设计中的描述。

```
# get required packages
go mod tidy

# run rpc service
go run pcm-coordinator/rpc/pcmcore.go
```

#### coordinator-api

&emsp;&emsp;api服务的配置内容模板如下，其中各P端的config信息可以根据实际情况按需配置。
```
Name: pcm.core.api
Host: 0.0.0.0
Port: 8999

DB:
  DataSource: username:password@(x.x.x.x:3306)/pcm?parseTime=true
  
Redis:
  Host: x.x.x.x:portnumber
  Pass: password


# k8s rpc
K8sNativeConf:
  Endpoints:
    - 127.0.0.1:2003
  NonBlock: true

#slurm rpc
THRpcConf:
  Endpoints:
    - 127.0.0.1:2007
NonBlock: true

#modelarts rpc
ModelArtsRpcConf:
  Endpoints:
    - 127.0.0.1:2002
NonBlock: true
```
&emsp;&emsp;运行以下命令后将会在本地启动coordinator-api服务，服务启动后用户将可以通过http请求其接口进行各类功能调用。
```
# get required packages
go mod tidy

# run rpc service
go run pcm-coordinator/api/pcm.go
```

## 接下来的计划

 - 调度算法的插件化以及基础资源模板的定义
 - 资源操作类型的基础定义 
 - 快捷的开发模式 
 - 一级调度的实现

## 加入＆贡献
&emsp;&emsp;我们期待您的意见和贡献，欢迎所有的朋友对项目进行指正和改进，共同打造一套高效稳定的云际协作机制。