Runit - 监管服务的应用
Runit 的好处:监管服务,管理状态,日志,可移植,容易打包,代码少。
- 每个服务都和一个服务目录相关联。
- 监管进程是 runsv,服务 daemon 作为 runsv 的子进程运行。
- runsv 可通过各种信号通知子进程
- sv 用于发送命令给 runsv,以及获取服务信息
- 默认服务状态是 up,如果死了,会重新 restart
- runit 确保服务运行的进程状态,包括环境,资源,文件描述符等等
- init.d 存在一个问题,那就是环境变量会污染进程;但系统重启时配置的服务可能会和上次的不一样。runit 解决方法是清空,完全重设。
- runsv 配置日志后,会通过管道将标准输出和标准错误取走写入配置的地方。
- runit 有个日志 daemon:svlogd
- 仅有数百行源代码
Runit 应用于 Ruby 程序的开发
Runit 是一个进程监管程序,附带了一系列监管有关的工具集。它可以作为 sysvinit 的替代品,也可以和 init 并行运行维护监管程序层级。
- 可以通过
sv s /service/*
($SVDIR) 查看所有的服务,以及其日志。 /service/*
的服务被链接到/etc/sv/
目录,服务只需含有一个 run 文件即可。- run 可执行文件应该将程序 exec 到前台,stderr 转到 stdout:
exec 2>&1; exec yourapp
. 这也是 Runit 对你的应用程序的唯一要求:前台,日志 - Runit 将各种功能封装进 c 写的小工具集里面。
/etc/sv/xxx/log …
提高网站的可访问性
网站可访问性专注于使网站的内容的可以被所有人访问到,特别是残障人士。
- 人口里面残障的比例其实非常高。
- 要考虑交互,认知,视觉。
- 要考虑缺少单肢,双肢时的使用体验。
- 能否只用键盘就能交互?
- 页标题和 H1 有么?
- 有没有定期维护和检查可访问性?
更好地可用性:
- 非文本内容有文本提示
- 多媒体有 caption
- 内容连续且有意义
- 有页标题
- 有 heading & labels 描述内容主题
可以用 w3 提供的可访问性工具检查:https://www.w3.org/WAI/ER/tools/
read moreGitHub 数据中心网络设计
最近一次 Github 数据中心升级的设计目标是提高冗余和全球可用性。
他们的基础设施要承载 PB 级别的用户存储数据,以及 100G 级别的网络流量。在 Seattle 和 Northern Virginia 的入网点提供光纤来保证延迟和带宽。入网点 (POP) 就是一组网络设备,用途是接入区域互联网。每个入网点连接一个数据中心。两个独立的数据中心还使用 metro waves 传递 DWDM 数据。
新项目启动,需要考虑容量和计算量,一般要么用已经配置好的机柜,要么设计一个新的。网络配置一般也是预先生成设置好的,机柜层级需要的 rack 单元等等数据从 gPanel 导入。整套初始化的部署流程都是高度可重复操作的,应该节省了不少人力。
read morePython yield v/s return
Python yield 和 return 最大的区别在于栈的保留与否。
在 yield 切出控制权后,解释器依然保留函数的栈,直到下次 next() 调用重新换入控制权。在有 yield 的函数中结束执行需要用 return
:这个关键词不带返回值时表示我执行结束了,并且不关心任何返回值(PEP 255)。PEP 289 中引入了列表推导,形如 (x for x in xs),它返回的就是 generator。另外可以知道的小窍门是 gen.send() 方法将数据传入 yield;以及 Python3 中 yield from 可以将 yield 委托给另外一个 generator。
生成器给我们带来的最大的好处是简化代码,让一小块代码专注于怎么生成数据;另外一个好处是性能提升 - 不用把大把数据塞入内存 …