LLLeon
LLLeon
TIME_WAIT 是主动关闭 TCP 连接一方在发出最后一个 ACK 后需要等待的状态,时长为 2MSL。TIME_WAIT 状态的存在主要有以下原因。(因为 TCP 连接的断开一般是由客户端发起关闭连接的操作,所以为了方便描述,后文把主动关闭方称为 C 端(Client),被动关闭方称为 S 端(Server)。) ## 1. C 端要确认 S 端是否有收到此 ACK 因为 TCP 连接是全双工的,因此断开连接需要双方连接都关闭。整个断开连接的过程简要描述如下: > 1. 过程一:C 端发送 FIN,S 端收到后发送该...
这段时间学操作系统,好奇计算机是怎么从通电到成功加载操作系统的,看了一些文章顺便做下总结。 第 0、1 小节介绍了一些地址和寄存器的基本概念,后面介绍了 80386 从通电后,怎么把操作系统加载到内存中来运行的过程。 ## 0. 几个地址的概念 先来理解这几个地址的概念:物理地址、虚拟地址(线性地址)、逻辑地址。 任何时候,计算机上都存在一个程序能够产生的地址集合,我们称之为地址范围。这个范围的大小由 CPU 的位数决定,例如一个 32 位的 CPU,它的地址范围是 `0~0xFFFFFFFF`(4G), 而对于一个 64 位的 CPU,它的地址范围为 `0~0xFFFFFFFFFFFFFFFF`(64T)。 这个范围就是程序能够产生的地址范围,我们把这个地址范围称为**虚拟地址空间**,该空间中的某一个地址我们称之为**虚拟地址**。与虚拟地址空间和虚拟地址相对应的则是物理地址空间和物理地址,大多数时候我们的系统所具备的物理地址空间只是虚拟地址空间的一个子集。 > 举一个最简单的例子直观地说明这两者:对于一台内存为 256M 的 32bit X86 主机来说,它的虚拟地址空间范围是...
本文基于 go1.11 版本。 ## Mutex 使用 在深入源码之前,要先搞清楚一点,对 Golang 中互斥锁 `sync.Mutex` 的操作是程序员的主动行为,可以看作是是一种协议,而不是强制在操作前必须先获取锁。 这样说可能有点抽象,看下面这段代码: ```go package main import ( "fmt" "sync" "time" ) type People struct { mux sync.Mutex Name string Age...
[这篇文章](https://medium.com/tech-tajawal/modern-backend-developer-in-2018-6b3f7b5f8b9) 由浅入深系统的介绍了后端开发者进行 Web 开发的学习路线。原文对每条内容都有解释,建议看原文。这里是为了看着方便,便于对自己学习内容进行查漏补缺,对关键内容简单进行了翻译整理。  1. **语言**:学习一门编程语言,如 Python、Ruby、Golang、Rust 等等等等。 2. **练习**:用这门语言练习做一些小工具,比如实现一些命令、读取目录并以 JSON 展示啦等等。 3. **包管理**:学习对应语言的包管理工具,如 Node.js 的 NPM 或 Yarn。 4. **最佳实践**:遵循该语言的标准进行最佳实践。 5. **安全**:学习安全方面的知识,阅读 [OWASP](https://www.owasp.org/index.php/Main_Page) 教程。理解不同的安全问题,以及怎样避免它们。 6. **练习**:运用以上技能进行练习,可以在 GitHub 上找一些开源库,试着用你学到的最佳实践来重构、解决别人提出的问题,或者增加一些新功能,进行...
今天编译代码时遇到了这个问题,记录一下。 在一个函数中,给返回的 error 定义了名称。这个函数定义类似下面这样: ```go func foo(a string) (err error) { res, err := bar(a) if err != nil { return } // do anything else return } ``` 编译时会报这样的错误:...
# Tendermint 节点启动源码分析 本文以官方示例公链 Basecoin 的 `basecoind start` 命令为入口,结合日志与源码分析 Tendermint 节点创建、启动及生成区块等过程。 文中代码细节较多,但限于篇幅没有太深入某些细节,比如共识过程。如只想快速了解整体过程,可只阅读有 `basecoind start` **日志**部分的内容。 ## start 命令入口 执行 `basecoind init` 命令初始化 genesis 配置、priv-validator 文件及 p2p-node 文件后,在命令行执行 `basecoind start` 启动节点。在不带有任何参数时,Tendermint...
**Tendermint abci** [项目主页](https://github.com/tendermint/abci) 这篇文章以 ABCI 示例 `KVStore` 应用及默认的 `socket` 连接为例说明 ABCI 应用的启动及 abci-cli 客户端与其交互的过程,以加深开发 ABCI 应用的模式及源码组织方式的理解。 ## 整体流程说明 1. **ABCI 应用服务端**:在命令行执行 `abci-cli kvstore` 启动应用后,它会在 46658 端口等待客户端的 TCP 连接。 2. **abci-cli...
这里简单介绍使用 Docker Compose 来运行 Redis 服务,并通过挂载卷进行数据持久化。关于 Docker Compose,建议看[官方文档](https://docs.docker.com/compose/overview/)。 ## 安装 Docker Compose 这一部分的前提是已经安装好了 Docker。 先安装 EPEL 库: ```bash yum install epel-release ``` 然后安装 python-pip: ```bash yum install -y python-pip ```...
## 1. 副本集概述 某些情况下,副本可以提供更高的读取容量,就像客户端可以发送读操作到不同的服务器。在不同数据中心维护数据副本可以增加分布式应用的数据局部性和可用性。还可以因为其它目的保存额外的副本,比如灾难恢复、报告或备份。 ### MongoDB 中的副本 1. 一个副本集就是一组维护相同数据集的 mongod 实例。 2. 一个数据集包含一些数据承载节点和一个可选的仲裁节点。数据承载节点中,有且只能有一个被认为是主承载节点,而其它节点被认为是次要节点。主节点接收所有写入操作。主节点将对其数据集所做的所有更改记录到其 oplog。 3. 次要节点复制主节点的 oplog 并将操作应用到其数据集,就跟次要数据集反映了主数据集一样。如果主节点不可用,一个合格的次要节点将被选为新的主节点。 4. 可以添加一个额外的 mongod 实例到副本集中来作为仲裁节点。仲裁节点不维护数据集。仲裁节点通过响应副本集其它成员的心跳和选举请求来达到维护副本集中法定成员数量的目的。因为它不需要存储数据集,比带有数据集的全功能副本集成员消耗更少的资源,所以它是一种提供副本集仲裁功能比较好的方式。如果你的副本集有偶数个成员,添加一个仲裁节点在主节点选举中来获得一个主节点的选票。仲裁节点不需要专用硬件。 5. 仲裁节点将永远是仲裁节点,但主节点可能变为次要节点,次要节点也可能通过选举成为主要节点。 ### 异步复制 1. 次要节点异步的应用来自主节点的操作。通过在主节点之后应用操作,副本集可以不管一个或多个成员的失败而继续实现其功能。 ### 自动故障切换...
关于这部分内容,在写代码时一直都是用指针类型的 receiver,但没有系统整理过规则,这里进行总结。 首先是官方 [FAQ](https://golang.org/doc/faq#methods_on_values_or_pointers) 中说的那三条: - 第一条也是最重要的一条,方法是否要修改 receiver? - 其次是效率的考虑,如果 receiver 非常大,比如说一个大 `struct`,使用指针将非常合适。 - 接下来是一致性,如果该类型的某些方法必须使用指针 receiver,剩下的也要使用指针。不论使用什么类型的 receiver,方法集要一致。 还有一些其它的规则: - 实例和实例指针可以调用值类型和指针类型 receiver 的方法。 - 如果通过 `method express` 方式,struct 值只能调用值类型 receiver 的方法,而...