写点什么

ARTS 打卡第三周

作者:请务必优秀
  • 2023-09-03
    湖北
  • 本文字数:1765 字

    阅读完需:约 6 分钟

1. Algorithm

蓄水池算法

假设有一个源源吐出不同球的机器,只有装下 10 个球的袋子,每一个吐出的球,要么放入袋子,要么永远扔掉,如何做到机器吐出每一个球之后,所有吐出的球都等概率被放进袋子里?


思路:第 k 个球到来的时候,以 10/k 的概率放入袋子,扔的时候 10 个里面随机选一个


public class RandomBox {
private int[] bag; private int N; private int count;
public RandomBox(int capacity) { bag = new int[capacity]; N = capacity; count = 0; }
private int rand(int max) { return (int) (Math.random() * max) + 1; }
public void add(int num) { count++; if (count <= N) { bag[count - 1] = num; } else { if (rand(count) <= N) { bag[rand(N) - 1] = num; } } }}
复制代码

2. Review

最近阅读了 serverless 相关文献,文献链接Serverless in the Wild: Characterizing and Optimizing the Serverless Workload at a Large Cloud Provider | USENIX


核心贡献:


  • 对大型云提供商(Azure)的生产环境中 FaaS 负载的特征的详细分析

  • 提出了一个降低冷启动次数的策略

  • 公开了本论文所基于的数据集的 trace

  • 评估和实现


In Azure Functions, functions are logically grouped in applications, i.e. an application may encompass multiple functions. The application concept helps organize the software and in packaging. The application, not the function, is the unit of scheduling and resource allocation.


在 Azure Functions 中,功能在逻辑上分组为应用程序,即一个应用程序可能包含多个功能。应用程序概念有助于组织软件和打包。应用程序而非功能是调度和资源分配的单位。


通常的冷启动是包括两种情况的,第一种是 function 第一次被调用,此时系统中不存在一个可用实例,需要创建新的实例;第二种是 function 被大量调用,此时现有的实例不足以处理如此之多的请求,从而需要水平扩展更多的是来处理请求。


第一种情况为大部分情况。


所以论文通过使用 ARIMA 进行时序建模,通过预热窗口和保活窗口两个设计来消除冷启动。


通过实时统计每个 Application 的 IT 直方图来确定两个窗口。通过 IT 预测,将预热窗口设置为在下一次调用之前结束,并设置一个短暂的保持活动窗口。 它自动搜索产生最佳拟合的 ARIMA 参数 (p,d,q)。 由于使用 ARIMA 的应用程序很少被调用,因此在每次调用后更新每个应用程序的模型。 为了给预测留出更多不准确的空间,设置包括 15% 的(可配置的)余量。 例如,如果预测的 IT 为 5 小时,将预热窗口设置为 4.25 小时(5 小时减去 15%),将保活窗口设置为 1.5 小时(IT 预测每侧 5 小时的 15%) )。

3. Technique/Tips

推荐一个写 k8s 的 yaml 文件的小技巧,


**help:**有时候,可能会忘记具体的命令用法或参数选项。在这种情况下,"help"命令将成为你的得力助手,为你提供清晰的指导。


kubectl helpkubectl create deployment --help
复制代码


**dry-run:**在真正执行命令之前,通过使用 "dry-run" 选项,可以预先验证命令的效果。这种模拟执行命令不会对集群产生实际影响,再搭配上 -o 选项以将结果输出为 YAML 格式,能够快速地获得所需的 YAML 文件。


kubectl create deployment webapp --image=nginx --port=80 -r 2 -n default --dry-run=client -o yaml
复制代码


**explain:**在编写 YAML 文件时,了解资源类型的结构和属性至关重要。通过 "explain" 命令,可以轻松掌握资源的所有字段、默认值以及示例的详细信息,帮助你更好地构建配置文件。

4. Share

《人月神话》其中提到两个非常重要的概念:本质复杂度(Essential Complexity)和偶然复杂度(Accident Complexity)。 本质复杂度是因为这份任务确实工作量大,具有挑战性,有一定难度。 偶然复杂度是因为我们在处理任务的时候选错了方向,或者使用了错误的方法。


  • 本质复杂度不可避免,偶然复杂度却可以通过科学的手段进行规避。

  • 任务处理时也应尽可能专注本质复杂度,而不应花费大量时间和精力在偶然复杂度上。然而现实工作中刚好与之相反,偶然复杂度占用太多时间和精力,不能专注本质复杂度对自我提升无意义。

  • 专注本质复杂度,减少偶然复杂度是一门学问。


软件开发最佳实践原则:


  • 以终为始;

  • 任务分解;

  • 沟通反馈;

  • 自动化。


看起来四点很简单,但能做到的没有几个!大家一起加油~

用户头像

还未添加个人签名 2020-05-29 加入

还未添加个人简介

评论

发布
暂无评论
ARTS打卡第三周_请务必优秀_InfoQ写作社区