不会飞的章鱼

熟能生巧,勤能补拙;念念不忘,必有回响。

缓存选型

memcache

memcache 提供简单的 kv cache 存储,value 大小不超过1mb。

我使用 memcache 作为大文本或者简单的 kv结构使用。

memcache 使用了slab 方式做内存管理,存在一定的浪费,如果大量接近的 item,建议调整 memcache 参数来优化每一个 slab 增长的 ratio、可以通过设置 slab_automove & slab_reassign 开启memcache 的动态/手动 move slab,防止某些 slab 热点导致内存足够的情况下引发 LRU。

阅读全文 »

网络通信协议

互联网的核心是一系列协议,总称为”互联网协议”(Internet Protocol Suite),正是这一些协议规定了电脑如何连接和组网。

主要协议分为:

  • Socket:接口抽象层
  • TCP / UDP:面向连接(可靠) / 无连接(不可靠)
  • HTTP1.1 / HTTP2 / QUIC(HTTP3):超文本传输协议

Socket 抽象层

阅读全文 »

功能模块

为了大部分用户的基本功能体验,满足用户需求,例如播放历史查看、播放进度同步等。离线型用户,app 本地保留历史记录数据。
同样的,也要考虑平台化,视频、文章、漫画等业务扩展接入。

  • 变更功能:添加记录、删除记录、清空历史。
  • 读取功能:按照 timeline 返回 top N,点查获取进度信息。
  • 其他功能:暂停/恢复记录,首次观察增加经验等。

历史记录类型的业务,是一个极高 tps 写入,高 qps 读取的业务服务。分析清楚系统的 hot path,投入优化,而不是哪哪都去优化。

架构设计

阅读全文 »

隔离

隔离,本质上是对系统或资源进行分割,从而实现当系统发生故障时能限定传播范围和影响范围,即发生故障后只有出问题的服务不可用,保证其他服务仍然可用。

服务隔离:动静分离、读写分离
轻重隔离:核心、快慢、热点
物理隔离:线程、进程、集群、机房

服务隔离

动静隔离:

阅读全文 »

架构设计最重要的就是理解整个产品体系在系统中的定位。搞清楚系统背后的背景,才能做出最佳的设计和抽象。不要做需求的翻译机,先理解业务背后的本质,事情的初衷。

功能模块

评论系统,我们往小里做就是视频评论系统,往大里做就是评论平台,可以接入各种业务形态。

  • 发布评论: 支持回复楼层、楼中楼。
  • 读取评论: 按照时间、热度排序。
  • 删除评论: 用户删除、作者删除。
  • 管理评论: 作者置顶、后台运营管理(搜索、删除、审核等)。

架构设计

阅读全文 »

工程项目结构

Standard Go Project Layout

/cmd

本项目的主干。
每个应用程序的目录名应该与你想要的可执行文件的名称相匹配(例如,/cmd/myapp)。
不要在这个目录中放置太多代码。如果你认为代码可以导入并在其他项目中使用,那么它应该位于 /pkg 目录中。如果代码不是可重用的,或者你不希望其他人重用它,请将该代码放到 /internal 目录中。

/internal

阅读全文 »

Goroutine

Processes and Threads

操作系统会为该应用程序创建一个进程。作为一个应用程序,它像一个为所有资源而运行的容器。这些资源包括内存地址空间、文件句柄、设备和线程。
线程是操作系统调度的一种执行路径,用于在处理器执行我们在函数中编写的代码。一个进程从一个线程开始,即主线程,当该线程终止时,进程终止。这是因为主线程是应用程序的原点。然后,主线程可以依次启动更多的线程,而这些线程可以启动更多的线程。

无论线程属于哪个进程,操作系统都会安排线程在可用处理器上运行。每个操作系统都有自己的算法来做出这些决定。

Goroutines and Parallelism

阅读全文 »

Error

Golang的error就是普通的一个接口

1
2
3
type error interface{
Error() string
}

Error vs Exception

C

阅读全文 »

题目描述

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

题目解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//Go
func trap(height []int) int {
var left, right, leftMax, rightMax, res int
right = len(height) - 1
for left < right {
if height[left] < height[right] {
if height[left] >= leftMax {
//设置左边最高柱子
leftMax = height[left]
} else {
//右边必定有柱子挡水,所以,遇到所有值小于等于leftMax的,全部加入水池
res += leftMax - height[left]
}
left++
} else {
if height[right] > rightMax {
//设置右边最高柱子
rightMax = height[right]
} else {
//左边必定有柱子挡水,所以,遇到所有值小于等于rightMax的,全部加入水池
res += rightMax - height[right]
}
right--
}
}
return res
}

题目描述

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

题目同leetcode 70.word-search

题解

阅读全文 »