Runit - 监管服务的应用

查看原文

Runit 的好处:监管服务,管理状态,日志,可移植,容易打包,代码少。

  • 每个服务都和一个服务目录相关联。
  • 监管进程是 runsv,服务 daemon 作为 runsv 的子进程运行。
  • runsv 可通过各种信号通知子进程
  • sv 用于发送命令给 runsv,以及获取服务信息
  • 默认服务状态是 up,如果死了,会重新 restart
  • runit 确保服务运行的进程状态,包括环境,资源,文件描述符等等
    • init.d 存在一个问题,那就是环境变量会污染进程;但系统重启时配置的服务可能会和上次的不一样。runit 解决方法是清空,完全重设。
  • runsv 配置日志后,会通过管道将标准输出和标准错误取走写入配置的地方。
  • runit 有个日志 daemon:svlogd
  • 仅有数百行源代码
read more

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 …
read more

Python 高阶函数的一种写法

查看原文

Python 中函数的嵌套调用写长了容易不太易读,毕竟我们习惯从左到右读: a(b(c(d()))) 可以换种写法: comp(d, c, b, a)()。 我们可以通过一个小函数定义这个链式组合的高阶函数:def comp(*fns): return functools.reduce(lambda f, g: lambda x: f(g(x)), fns, lambda x: x

read more

使用 SO_REUSEPORT 可以重用端口

查看原文

Linux 在 3.9 以后可以使用 SO_REUSEPORT 重用端口。这个选项可以在新建 socket 时候用 setsocketopt 设定。设定之后,多个进程可以一起监听同一个端口。不设定的话,会抛出端口 Conflict 的错误。这个功能特别适合用于处理滚动升级:版本1监听端口,上线版本2也监听这个端口,停掉版本1,完成上线。

read more

Python 打包 - entry_points

查看原文

在 Python 中提供 bin 程序的一个好方法是为项目的 setup.py 提供 entrypoint。具体方法是提供一个 main 方法,然后在 setup.py 的 setup 中加入 entry_points={'console_scripts': ['your-cli=path.to.module:main']}。特别的,如果开发的是 GUI 程序,相应的改为 gui_scripts。

read more

提高网站的可访问性

查看原文

网站可访问性专注于使网站的内容的可以被所有人访问到,特别是残障人士。

  • 人口里面残障的比例其实非常高。
  • 要考虑交互,认知,视觉。
  • 要考虑缺少单肢,双肢时的使用体验。
  • 能否只用键盘就能交互?
  • 页标题和 H1 有么?
  • 有没有定期维护和检查可访问性?

更好地可用性:

  • 非文本内容有文本提示
  • 多媒体有 caption
  • 内容连续且有意义
  • 有页标题
  • 有 heading & labels 描述内容主题

可以用 w3 提供的可访问性工具检查:https://www.w3.org/WAI/ER/tools/

read more

使用 Tox 测试

查看原文

Tox 可以用来运行应用程序在 Python 多个版本下的测试。用法是添置 tox.ini,设定要测试的版本,和测试语句即可。原理是自动创建 virtualenv,用特定语言版本运行测试。 * 可以用 {posargs:} 当作命令,这样可以在运行的时候替换运行的命令。 例如tox -e py34 -- python, tox -e py27 -- django-admin runserver。 * 可以用 conditional settings 为每个 env 定制多条命令。多条命令可以共享一个 env.

read more

Find -ok

查看原文

一个 find 删除文件的保险:加上 -ok 命令,这样批量删除文件的时候会 prompt 出提示回答完才能删除。

read more

GitHub 数据中心网络设计

查看原文

最近一次 Github 数据中心升级的设计目标是提高冗余和全球可用性。

他们的基础设施要承载 PB 级别的用户存储数据,以及 100G 级别的网络流量。在 Seattle 和 Northern Virginia 的入网点提供光纤来保证延迟和带宽。入网点 (POP) 就是一组网络设备,用途是接入区域互联网。每个入网点连接一个数据中心。两个独立的数据中心还使用 metro waves 传递 DWDM 数据。

新项目启动,需要考虑容量和计算量,一般要么用已经配置好的机柜,要么设计一个新的。网络配置一般也是预先生成设置好的,机柜层级需要的 rack 单元等等数据从 gPanel 导入。整套初始化的部署流程都是高度可重复操作的,应该节省了不少人力。

read more

Python 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。 生成器给我们带来的最大的好处是简化代码,让一小块代码专注于怎么生成数据;另外一个好处是性能提升 - 不用把大把数据塞入内存 …

read more

« Page 48 / 54 »