· ☕ 1 分钟
https://accedian.com/blog/diagnose-tcp-connection-setup-issues/ A TCP connection, also called 3-way Handshake is achieved with SYN, SYN+ACK and ACK packets. From this handshake, we can extract a performance metric called Connection Time (CT), which summarizes how fast session a can be set up between a client and a server over a network. For more details, see this excellent article on Wikipedia.

· ☕ 1 分钟
从linux源码看socket(tcp)的timeout

· ☕ 1 分钟
https://danielw.cn/cache-consistency-with-database https://www.sciencedirect.com/topics/computer-science/cache-consistency

· ☕ 1 分钟
raft http://thesecretlivesofdata.com/raft/ https://raft.github.io/

· ☕ 1 分钟
CAP BASE BASE 是 Basically Available(基本可用)、Soft state(软状态)和 Eventually consistent(最终一致性)三个短语的简写 复制状态机 https://zhuanlan.zhihu.com/p/86999794 复制状态机的思想是一个分布式的复制状态机系统由多个复制单元组成,每个复制单元均是一个状态机,它的状态保存在一组状态变量中。状态机的状态能够并且只能通过外部命令来改变。 上文提到的“一组状态变量”通常是基于操作日志来实现的。每一个复制单元存储一个包含一系列指令的日志,并且严格按照顺序逐条执行日志上的指令。因为每个状态机都是确定的,所以每个外部命令都将产生相同的操作序列 (日志)。又因为每一个日志都是按照相同的顺序包含相同的指令,所以每一个服务器都将执行相同的指令序列,并且最终到达相同的状态。 综上所述,在复制状态机模型下,一致性算法的主要工作就变成了如何保证操作日志的一致性。 服务器上的一致性模块负责接收外部命令,然后追加到自己的操作日志中。它与其他服务器上的一致性模块进行通信以保证每一个服务器上的操作日志最终都以相同的顺序包含相同的指令。一旦指令被正确复制,那么每一个服务器的状态机都将按照操作日志的顺序来处理它们,然后将输出结果返回给客户端。 复制状态机之所以能够工作是基于下面这样的假设:如果一些状态机具有相同的初始状态,并且它们接收到的命令也相同,处理这些命令的顺序也相同,那么它们处理完这些命令后的状态也应该相同。因为所有的复制节点都具有相同的状态,它们都能独立地从自己的本地日志中读取信息作为输人命令,所以即使其中一些服务器发生故障,也不会影响整个集群的可用性。不论服务器集群包含多少个节点,从外部看起来都只像是单个高可用的状态机一样。 复制状态机在分布式系统中常被用于解决各种容错相关的问题,例如,GFS、HDFS、Chubby、ZooKeeper和etcd等分布式系统都是基于复制状态机模型实现的。 FLP不可能性 No completely asynchronous consensus protocol can tolerate even a single unannounced process death. 在异步通信场景下,任何一致性协议都不能保证:只有一个进程失败,其他非失败进程能达成一致。这里的"unannounced process death" 指的是一个进程发生了故障,但其他节点并不知道,继续认为这个进程还没有处理完成或发生消息延迟了。 举个例子来说,甲、乙、丙三个人各自分开进行投票(投票结果是0或1)。他们彼此可以通过电话进行沟通,但有人会睡着。 例如:甲投票0,乙投票 1,这时候甲和乙打平,丙的选票就很关键。然而丙睡着了,在他醒来之前甲和乙都将无法达成最终的结果。即使重新投票,也有可能陷入无尽的循环之中。 根据FLP定理,实际的一致性协议(Paxos、 Raft等)在理论上都是有缺陷的,最大的问题是理论上存在不可终止性!至于 Paxos 和 Raft协议在工程的实现上都做了哪些调整(例如,Paxos 和 Raft都通过随机的方式显著降低了发生算法无法终止的概率),从而规避了理论上存在的问题,下文将会有详细的解释。

· ☕ 1 分钟
分布式一致性 Paxos Multi-Paxos Raft EPaxos 对比分析 https://developer.aliyun.com/article/768655 1 可理解性 众所周知,Paxos是出了名的晦涩难懂,不仅难以理解,更难以实现。而Raft则以可理解性和易于实现为目标,Raft的提出大大降低了使用分布式一致性的门槛,将分布式一致性变的大众化、平民化,因此当Raft提出之后,迅速得到青睐,极大地推动了分布式一致性的工程应用。 EPaxos的提出比Raft还早,但却长期无人问津,很大一个原因就是EPaxos实在是难以理解。EPaxos基于Paxos,但却比Paxos更难以理解,大大地阻碍了EPaxos的工程应用。不过,是金子总会发光的,EPaxos因着它独特的优势,终于被人们发现,具有广阔的前景。 2 效率 从Paxos到Raft再到EPaxos,效率有没有提升呢?我们主要从负载均衡、消息复杂度、Pipeline以及并发处理几个方面来对比Multi-Paxos、Raft和EPaxos。 负载均衡 Multi-Paxos和Raft的Leader负载更高,各副本之间负载不均衡,Leader容易成为瓶颈,而EPaxos无需Leader,各副本之间负载完全均衡。 消息复杂度 Multi-Paxos和Raft选举出Leader之后,正常只需要一次网络来回就可以提交一条日志,但Multi-Paxos需要额外的异步Commit消息提交,Raft只需要推进本地的commit index,不使用额外的消息,EPaxos根据日志冲突情况需要一次或两次网络来回。因此消息复杂度,Raft最低,Paxos其次,EPaxos最高。 Pipeline 我们将Pipeline分为顺序Pipeline和乱序Pipeline。Multi-Paxos和EPaxos支持乱序Pipeline,Raft因为日志连续性假设,只支持顺序Pipeline。但Raft也可以实现乱序Pipeline,只需要在Leader上给每个Follower维护一个类似于TCP的滑动窗口,对应每个Follower上维护一个接收窗口,允许窗口里面的日志不连续,窗口外面是已经连续的日志,日志一旦连续则向前滑动窗口,窗口里面可乱序Pipeline。 并发处理 Multi-Paxos沿用Paxos的策略,一旦发现并发冲突则回退重试,直到成功;Raft则使用强Leader来避免并发冲突,Follwer不与Leader竞争,避免了并发冲突;EPaxos则直面并发冲突问题,将冲突依赖也做为一致性问题对待,解决并发冲突。Paxos是冲突回退,Raft是冲突避免,EPaxos是冲突解决。Paxos和Raft的日志都是线性的,而EPaxos的日志是图状的,因此EPaxos的并行性更好,吞吐量也更高。 3 可用性 EPaxos任意副本均可提供服务,某个副本不可用了可立即切换到其它副本,副本失效对可用性的影响微乎其微;而Multi-Paxos和Raft均依赖Leader,Leader不可用了需要重新选举Leader,在新Leader未选举出来之前服务不可用。显然EPaxos的可用性比Multi-Paxos和Raft更好,但Multi-Paxos和Raft比谁的可用性更好呢。 Raft是强Leader,Follower必须等旧Leader的Lease到期后才能发起选举,Multi-Paxos是弱Leader,Follwer可以随时竞选Leader,虽然会对效率造成一定影响,但在Leader失效的时候能更快的恢复服务,因此Multi-Paxos比Raft可用性更好。 4 适用场景 EPaxos更适用于跨AZ跨地域场景,对可用性要求极高的场景,Leader容易形成瓶颈的场景。Multi-Paxos和Raft本身非常相似,适用场景也类似,适用于内网场景,一般的高可用场景,Leader不容易形成瓶颈的场景。

· ☕ 1 分钟
架构设计之「服务限流」 二、服务限流应该怎么做? 对系统服务进行限流,一般有如下几个模式: 熔断: 这个模式是需要系统在设计之初,就要把熔断措施考虑进去。当系统出现问题时,如果短时间内无法修复,系统要自动做出判断,开启熔断开关,拒绝流量访问,避免大流量对后端的过载请求。系统也应该能够动态监测后端程序的修复情况,当程序已恢复稳定时,可以关闭熔断开关,恢复正常服务。 服务降级: 将系统的所有功能服务进行一个分级,当系统出现问题,需要紧急限流时,可将不是那么重要的功能进行降级处理,停止服务,这样可以释放出更多的资源供给核心功能的去用。 例如在电商平台中,如果突发流量激增,可临时将商品评论、积分等非核心功能进行降级,停止这些服务,释放出机器和CPU等资源来保障用户正常下单,而这些降级的功能服务可以等整个系统恢复正常后,再来启动,进行补单/补偿处理。 除了功能降级以外,还可以采用不直接操作数据库,而全部读缓存、写缓存的方式作为临时降级方案。 延迟处理: 这个模式需要在系统的前端设置一个流量缓冲池,将所有的请求全部缓冲进这个池子,不立即处理。然后后端真正的业务处理程序从这个池子中取出请求依次处理,常见的可以用队列模式来实现。这就相当于用异步的方式去减少了后端的处理压力,但是当流量较大时,后端的处理能力有限,缓冲池里的请求可能处理不及时,会有一定程度延迟。 特权处理: 这个模式需要将用户进行分类,通过预设的分类,让系统优先处理需要高保障的用户群体,其它用户群的请求就会延迟处理或者直接不处理。 那在实际项目中,对访问流量的限制,可采用如下几种技术方法: 熔断技术 熔断的技术可以重点参考Netflix的开源组件hystrix的做法,主要有三个模块:熔断请求判断算法、熔断恢复机制、熔断报警。 计数器方法 系统维护一个计数器,来一个请求就加1,请求处理完成就减1,当计数器大于指定的阈值,就拒绝新的请求。 基于这个简单的方法,可以再延伸出一些高级功能,比如阈值可以不是固定值,是动态调整的。另外,还可以有多组计数器分别管理不同的服务,以保证互不影响等。 队列方法 就是基于FIFO队列,所有请求都进入队列,后端程序从队列中取出待处理的请求依次处理。 基于队列的方法,也可以延伸出更多的玩法来,比如可以设置多个队列以配置不同的优先级。 令牌桶方法 首先还是要基于一个队列,请求放到队列里面。但除了队列以外,还要设置一个令牌桶,另外有一个脚本以持续恒定的速度往令牌桶里面放令牌,后端处理程序每处理一个请求就必须从桶里拿出一个令牌,如果令牌拿完了,那就不能处理请求了。我们可以控制脚本放令牌的速度来达到控制后端处理的速度,以实现动态流控。 分布式服务限流 https://www.infoq.cn/article/qg2tx8fyw5vt-f3hh673 本文介绍几种最常用的限流算法: 固定窗口计数器; 滑动窗口计数器; 漏桶; 令牌桶。 固定窗口计数器 滑动窗口计数器算法 滑动窗口计数器是通过将窗口再细分,并且按照时间"滑动",这种算法避免了固定窗口计数器带来的双倍突发请求,但时间区间的精度越高,算法所需的空间容量就越大。 漏桶算法 漏桶算法的缺陷也很明显,当短时间内有大量的突发请求时,即便此时服务器没有任何负载,每个请求也都得在队列中等待一段时间才能被响应。 令牌桶算法 令牌桶算法既能够将所有的请求平均分布到时间区间内,又能接受服务器能够承受范围内的突发请求,因此是目前使用较为广泛的一种限流算法。 优先令牌桶: https://www.cnblogs.com/Courage129/p/14423707.html 令牌桶好处就是,如果某一瞬间访问量剧增或者有突发情况,可以通过改变桶中令牌数量来改变连接数,就好比那个食堂排队吃饭的问题,如果现在不是直接去窗口排队,而是先来楼外拿饭票然后再去排队,那么有高三的学生时可以将增加饭票数量或者优先将令牌给高三的学生,这样比漏桶算法更加灵活。 并发限流 就拿Tomcat来说,很多参数就是出于这个考虑,例如 配置的acceptCount 设置响应连接数, maxConnections设置瞬时最大连接数, maxThreads 设置最大线程数. 代码实现 作为如此重要的功能,在 Java 中自然有很多实现限流的类库,例如 Google 的开源项目 guava 提供了 RateLimiter 类,实现了单点的令牌桶限流。

· ☕ 2 分钟
shed some light on To reveal information or details about something; to clarify or help people understand something. We’ve hired a private investigator to help shed light on the clandestine dealings of the organization. E.g https://iximiuz.com/en/posts/prometheus-vector-matching/ The following diagram tries to shed some light on: … Bread crumbs 面包屑 Monitoring is a means, not an end 监控是手段,不是目的 https://www.robustperception.io/monitoring-is-a-means-not-an-end Monitoring is a means, not an end Does it really have to be perfect?

· ☕ 0 分钟

· ☕ 1 分钟
Streams, messages, and frames https://developers.google.com/web/fundamentals/performance/http2 The introduction of the new binary framing mechanism changes how the data is exchanged between the client and server. To describe this process, let’s familiarize ourselves with the HTTP/2 terminology: Stream: A bidirectional flow of bytes within an established connection, which may carry one or more messages. Message: A complete sequence of frames that map to a logical request or response message. Frame: The smallest unit of communication in HTTP/2, each containing a frame header, which at a minimum identifies the stream to which the frame belongs.

· ☕ 2 分钟
curl http2 https://http2-explained.haxx.se/en/part11 11.1. HTTP 1.x look-alike Internally, curl will convert incoming http2 headers to HTTP 1.x style headers and provide them to the user, so that they will appear very similar to existing HTTP. This allows for an easier transition for whatever is using curl and HTTP today. Similarly curl will convert outgoing headers in the same style. Give them to curl in HTTP 1.x style and it will convert them on the fly when talking to http2 servers.

· ☕ 1 分钟
https://pi3g.com/2019/01/17/envoy-as-http-2-front-proxy-enabling-http-2-for-envoy-aka-h2/ envoy as http 2 front proxy – enabling http 2 for envoy (aka h2) By Maximilian Batz | 2019-01-17 Out of the box envoy is not configured to set up connections with clients connecting to it with the new HTTP/2. HTTP/2 is optimized for the modern web, with binary headers, etc. – higher speed. Since envoy is capable of speaking HTTP/2 to clients, it is a no-brainer to set it up.

· ☕ 1 分钟
Header case https://datatracker.ietf.org/doc/html/rfc7540#section-8.1.2 8.1.2. HTTP Header Fields HTTP header fields carry information as a series of key-value pairs. For a listing of registered HTTP headers, see the “Message Header Field” registry maintained at <https://www.iana.org/assignments/ message-headers>. Just as in HTTP/1.x, header field names are strings of ASCII characters that are compared in a case-insensitive fashion. However, header field names MUST be converted to lowercase prior to their encoding in HTTP/2. A request or response containing uppercase header field names MUST be treated as malformed (Section 8.