Day11 配对品质评估 Evaluator

由於 Open-Match 在架构上,允许使用同一张 ticket,对不同的配对池进行搜寻与配对,这便是先前提到的 overlapping MatchProfiles,但如何使这些具有重叠性的匹配,最後只产生出一个最适合的匹配结果,则需要 Evaluator 介入参与。

设计思维

基於配对方式的设计,可以决定我们的 Evaluator 如何参与我们的配对流程,可以简单地分成三种使用方式:

  • 无重叠:将 MatchProfiles 使用的条件完全不重叠,使你的配对永远不会发生重叠冲突,如此一来可以仅靠 default evaluator 处理配对
  • 有重叠(单一指标):MatchProfiles 使用含有重叠的条件范围,但有计算出分数指标,并且放入 Extensions["evaluation_input"] 中,default evaluator 可以依据此指标进行匹配判断,避免配对冲突
  • 有重叠(多指标):MatchProfiles 使用含有重叠的条件范围,且计算出多个评分指标,在这样的情况下,需要重新建立客制化的 Evaluator,针对计算出来的多个指标做评分与指派

Default Evaluator

这边看了一下 source code,粗浅的解析一下预设的 Evaluator 是怎麽运作的。

func evaluate(ctx context.Context, in <-chan *pb.Match, out chan<- string) error {
	matches := make([]*matchInp, 0)
	nilEvaluationInputs := 0

	for m := range in {
		//如同范例使用的 DefaultEvaluationCriteria 将计算分数放 Score
		inp := &pb.DefaultEvaluationCriteria{
			Score: math.Inf(-1),
		}

		//指定 Extensions key "evaluation_input"
		if a, ok := m.Extensions["evaluation_input"]; ok {
			err := ptypes.UnmarshalAny(a, inp)
			if err != nil {
				logger.WithFields(logrus.Fields{
					"match_id": m.MatchId,
					"error":    err,
				}).Error("Failed to unmarshal match's DefaultEvaluationCriteria.  Rejecting match.")
				continue
			}
		} else {
			nilEvaluationInputs++
		}
		matches = append(matches, &matchInp{
			match: m,
			inp:   inp,
		})
	}

	if nilEvaluationInputs > 0 {
		logger.WithFields(logrus.Fields{
			"count": nilEvaluationInputs,
		}).Info("Some matches don't have the optional field evaluation_input set.")
	}

	//分数排序
	sort.Sort(byScore(matches))

	//避免冲突
	d := decollider{
		ticketsUsed:   make(map[string]*collidingMatch),
		backfillsUsed: make(map[string]*collidingMatch),
	}

	for _, m := range matches {
		d.maybeAdd(m)
	}

	stats.Record(context.Background(), collidedMatchesPerEvaluate.M(int64(len(matches)-len(d.resultIDs))))

	//结果
	for _, id := range d.resultIDs {
		out <- id
	}

	return nil
}

<<:  某航空裁员後被骇

>>:  day 4 I'm your father, coroutine父子继承关系

[iT铁人赛Day5]JAVA的优先顺序

上次优先顺序还没讲,今天就来讲解一下 数学的运算符号有优先顺序的差别,JAVA也有 数学符号无疑是加...

30天学习笔记 介绍-day 25-View Animation

View Animation可以对view做透明度、缩放、平移、旋转等动画。 xml动画文件需再re...

Day2:进入新手村前先让我复习一下QQ-CSS-clear 清除浮动

clear 清除浮动 浮动元素顾名思义就是浮动在版面之上,所以如果接着顺序往下写的程序码没有使用cl...

D11-(9/11)-力成(6239)-有转型有并购的封装

注:发文日和截图的日期不一定是同一天,所以价格计算上和当日不同,是很正常的。 声明:这一系列文章并无...

自动化测试,让你上班拥有一杯咖啡的时间 | Day 3 - 开始写第一个测试

此系列文章会同步发文到个人部落格,有兴趣的读者可以前往观看喔。 今天要带大家完成第一个测试脚本,这...