Python编码规范

前言: 为了让不同编码习惯的开发者更好的协作配合,并且形成良好的基础编码规范与风格,我们以 PEP8 为基础,修改了陈旧的规则,丰富了示例,并整理了工作中常见的不规范操作,最终形成此 Python 编码规范与风格。

你知道如何洞察 Go 程序的内在状态吗?(文末有彩蛋)

Golang 下的 expvar 和 expvarmon 介绍

Go 语言内置 expvar,基于 expvar 提供的对基础度量的支持能力,我们可以自定义各种度量(metrics)。

该包提供了一种标准化接口用于公共变量,例如针对 server 中的操作计数器。

expvarJSON 格式通过 HTTP/debug/vars 来暴露这些变量。

针对这些公共变量的 setmodify 操作具有原子性;

该包除了会添加 HTTP handler 以外,该包还会注册如下变量:

  • cmdline os.Args
  • memstats runtime.Memstats

当我们使用标准库 net/http 包开发 HTTP 服务时,我们可以使用如下方式进行暴露内部指标:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12

$ cat expvar.go
package main

import (
	_ "expvar"
	"net/http"
)

func main() {
	http.ListenAndServe(":8080", nil)
}

DevOps理念之持续集成

注意:持续集成是能够推动实现更出色的软件交付表现和组织绩效的一组功能之一。这些能力是由 DORA DevOps 现状研究项目发现的,这是一项针对提升绩效的做法和能力进行的具有学术意义的独立而严谨的调查。

软件系统非常复杂,对一个文件进行明显简单、独立的更改可能会对整个系统造成意外的影响。

当大量开发者处理相关系统时,协调代码更新是个难题,而且不同开发者所做的更改可能并不兼容。

持续集成 (CI) 这一做法就是为了解决这些问题。

持续集成可创建快速反馈环并确保开发者以小批量方式工作,能够让团队开发高质量的软件、降低软件开发和维护费用,并提高团队工作效率。

初识 WebSocket 以及 Golang 实现

初识 WebSocket 以及 Golang 实现

一、 WebSocket 介绍

1.1 WebSocket 的诞生背景

在网络冲浪中,我们接触到最多的协议必定是 HTTP/HTTPS 协议,这两种协议的工作原理可简述为:客户端通过浏览器发送一个请求,服务器在接受到请求后进行处理并将得到的结果返回给客户端,由客户端处理结果。可见其主要为一种 “拉取” 信息的形式。

随着时代的发展,出现了一些需要实时发送信息的场景,比如体育实况更新、金融证券的实时信息、实时数据监控等。而如何实现 “推送” 信息的形式呢?在 WebSocket 还未诞生的时候,采用的是轮询技术来实现信息的推送:每间隔一定的时间,浏览器自动发送一个 HTTP 请求,以此主动拉取服务器的最新消息。使用轮询技术,需要不停向服务器发送 HTTP 请求,这样会占用很多的带宽和服务器资源,并且还是不能实现服务器主动向客户端推送数据。

在上述背景下,一种全双工的通信协议 WebSocket 应运而生,它实现了服务端主动向客户端推送数据,使得客户端与服务器间的信息交互更为便捷。

CoreDNS loop 插件异常问题

关键技术:

  • Kubernetes: 分布式的容器编排与调度系统,当前公认的云原生技术基础设施
  • CoreDNS: DNS and Service Discovery ,当前公认的云原生基础设施之名字服务系统
  • CoreDNS-plugins-loop: CoreDNS loop 插件文档

背景

最近有遇到一个客户集群,发现集群中的 CoreDNS 老是异常(loop 插件检测到有回路后进行 panic),因此怀疑是 K8S 集群在交付或者初始化过程中做了一些额外的动作,为了查明真相我们对客户环境进行一次排查和状况模拟,顺便来一起学习一下在 CoreDNS 中 loop 插件的相关知识。

问题现象

在查看 coredns pod 启动日志时,发现有如下对应异常:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
$ kubectl  get pods -n kube-system | grep dns
coredns-bdbc5564-8qldp              0/1     CrashLoopBackOff   8          22m

$ kubectl  logs -n kube-system coredns-bdbc5564-8qldp
[INFO] plugin/kubernetes: Watching Endpoints instead of EndpointSlices in k8s versions < 1.19
.:53
[INFO] plugin/reload: Running configuration MD5 = 045400f7bc8c9f6aaf8ca5dade224266
CoreDNS-1.8.4
linux/amd64, go1.16.4, 053c4d5
[INFO] 127.0.0.1:34652 - 36041 "HINFO IN 2066162189351134310.8810881223121065474. udp 57 false 512" NOERROR - 0 6.002536937s
[ERROR] plugin/errors: 2 2066162189351134310.8810881223121065474. HINFO: read udp 127.0.0.1:48503->127.0.0.53:53: i/o timeout
[FATAL] plugin/loop: Loop (127.0.0.1:48066 -> :53) detected for zone ".", see https://coredns.io/plugins/loop#troubleshooting. Query: "HINFO 2066162189351134310.8810881223121065474."