弹性伸缩
弹性伸缩
关于服务器弹性伸缩
弹性伸缩是指是指根据自业务需求和策略动调整计算能力(即服务器数量)的服务。通过配置服务器弹性伸缩策略,让服务器即能在流量突增时稳定运行,也可以在流量减少的时候降低运营成本。
目前 Func Stateful 支持以下两种弹性伸缩策略:
- 基于玩家人数弹弹性伸缩
- 基于性能指标横向扩缩
在后续篇章中,会详细地介绍如何在 UOS Func Stateful 的平台便捷地配置服务器的弹性伸缩规则及其注意事项。
缩容事件与服务器心跳检测
服务器的 缩容事件 和 扩容事件之间相互对应,分别应对计算资源冗余和计算资源紧缺的运行状况。启用服务器的弹性伸缩规则后,当计算资源冗余状况达到阈值时,Func Stateful 会对运行中的服务器的数目进行收缩,即触发缩容事件。缩容事件会对运行中的服务器进行回收和"数据清理"。因此,为了避免自动触发的 缩容事件 在回收服务器时造成资源或者数据的丢失,Func Stateful 会通过服务器心跳检测的返回值对 缩容事件(SCALE_DOWN_EVENT) 进行通知。
服务器在完成 缩容事件 的处理后,需要在下一次心跳请求中将 'readyToClose' 设置为 true,Func Stateful在收到心跳后会立刻对服务器进行回收。SCALE_DOWN_EVENT会有2分钟的超时时间,如果服务器没有 发送'readyToClose'的心跳,Func Stateful 会在2分钟后对服务器进行回收(参见 服务端API文档 )。
缩容事件 处理的代码示例
// GoLang 使用示例
const (
NoEvent = "NO_EVENT"
ScaleDownEvent = "SCALE_DOWN_EVENT"
)
func (s *Server) HandleScaleDown() {
// operation before server scale down
// processing ...
s.logger.Info("start process task before scale down")
// processing ...
s.logger.Info("finish handle ScaleDownEvent task")
}
// params:
// stateful: a server instance implement interface Func Stateful
func init(stateful Stateful) {
// ...
// do heartbeat
readyToClose := false
for {
switch event := sendHeartbeat(UOS_APP_ID, UOS_APP_SECRET, SERVER_ID, readyToClose); event {
case NoEvent:
logger.Info("[heartbeat] receive no event")
case ScaleDownEvent:
logger.Info("[heartbeat] receive scale down event")
stateful.HandleScaleDown()
readyToClose = true
default:
logger.Infof("[heartbeat] receive unknown event: %v", event)
}
time.Sleep(heartbeatInterval)
}
}
func sendHeartbeat(appId, appServiceSecret, serverId string) (string, error) {
url := fmt.Sprintf("https://func.unity.cn/v1/functions/%s/heartbeat", appId)
requestBody := map[string]string{
"serverId": serverId,
}
requestJson, err := json.Marshal(requestBody)
if err != nil {
return "", err
}
req, err := http.NewRequest("POST", url, bytes.NewBuffer(requestJSON))
if err != nil {
return "", err
}
auth := base64.StdEncoding.EncodeToString([]byte(appId + ":" + appServiceSecret))
req.Header.Set("Authorization", "Basic " + auth)
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return "", err
}
defer resp.Body.Close()
var responseMap map[string]string
decoder := json.NewDecoder(resp.Body)
if err := decoder.Decode(&responseMap); err != nil {
return "", err
}
event, ok := responseMap["event"]
if !ok {
return "", errors.New("response do not have 'event' field")
}
return event, nil
}完整实例代码:代码仓库
伸缩规则配置
可以在 Func Stateful 的服务器页面启用 服务器弹性伸缩 功能,并在策略窗口中对配置规则进行灵活地调整。
基于玩家人数
Func Stateful 支持 基于玩家人数 对游戏服务器进行弹性伸缩。只需要对 服务器单服务器容纳玩家上限 和 预留服务器数量 进行配置, Func Stateful就会基于服务器中的玩家数量进行弹性伸缩。
在正常运行情况下,Func Stateful会基于策略中的配置启用若干台服务器让其处于预备状态;当服务器达到策略中配置的容纳玩家上限时,Func Stateful会将预备服务器投入使用,并启用新的服务器来维持预备服务器的数目。
基于性能指标横向扩缩
Func Stateful 支持基于 CPU 和 内存 这两种性能指标对服务器进行横向扩缩。可以在策略窗口中选用基于性能指标横向扩缩 的策略后,灵活地调整相应的性能指标。

启用 基于性能指标横向扩缩 的策略后,如果服务器的平均运行性能指标达到缩容阈值,Func Stateful会对服务器进行回收,并向即将回收的服务器传递 缩容事件(SCALE_DOWN_EVENT),所以建议先启用 服务器心跳检测 并在服务端代码中加入 心跳检测 调用以及事件处理逻辑。
