Rust 中字符串总结
Rust
中字符串和 Java
和 Go
中的表示有很大的区别,刚开始接触的时候有点儿懵,今天花点时间总结备忘一下。
Rust
字符串有两种形式:str
和 String
,str
是内置的原始数据类型,通常是以借用的形式(&str
字符串 slice
)使用,而 String
是标准库提供的一种结构体,内部存储一个 u8
类型的 Vec
:
pub struct String {
vec: Vec<u8>,
}
按比例控制流量的一种实现
网关做灰度的时候,要控制流量的比例,比如 3:7 的分发流量到两个不同版本的服务上去。刚开始的想法是每次流量过来生成 100 以内的随机数,随机数落在那个区间就转到那个版本的服务上去,但是发现这样无法较精准的保证 3:7 的比例,因为有可能某段时间内生成的随机数大范围的落在某个区间内,比如请求了 100 次,每次生成的随机数都是大于 30 的,这样 70% 比例的服务就承受了 100% 的流量。
接下来想到了第二种解决方案,能够保证 10(基数) 倍的流量比例正好是 3:7,思路如下:
1、生成 0 - 99 的数组(集合) 2、打乱数组(集合)的顺序,为了防止出现某比例的流量集中出现 3、全局的计数器,要考虑原子性 4、从数组(集合)中取出计数器和 100 取余后位置的值 5、判断取到的值落在那个区间
有人把生活过成了诗,有人却在彷徨挣扎…
可靠消息最终一致性分布式事务实现方案
提到分布式应用,就不得不考虑分布式事务。在分布式事务中,常见的有 CAP
,BASE
理论,解决方案也有很多种,比如:2PC
、TCC
、最终一致性等。
2PC
(两阶段提交)比较适合单块应用,跨多个库的分布式事务。因为严重依赖于数据库层面来搞定复杂的事务,效率很低,绝对不适合高并发的场景,而且,对于微服务而言,不推荐一个服务出现跨多个数据库操作, 如果需要操作其它数据库数据,推荐通过调用别的服务接口来实现。
TCC
属于强一致性事务的方案,适用资金流转业务相关业务,比如:支付、交易等场景。根据 CAP
理论,这种实现需要牺牲可用性。
如果是一般的分布式事务场景,比如:订单插入之后要调用库存服务更新库存,库存数据没有资金那么的敏感,可以用可靠消息最终一致性方案。
下面是一种可靠消息最终一致性事务方案的实现流程:
浅谈分布式事务
通俗的理解,事务是一组原子操作单元。我们希望一些列的操作能够全部正确执行,如果这一组操作中的任意一个步骤发生错误,那么就需要回滚之前已经完成的操作。也就是同一个事务中的所有操作,要么全都正确执行,要么全都不要执行。
传统的单机应用系统一般使用一个关系型数据库,利用数据库事务来保证数据的一致性,下面先了解一下本地数据库事务的一些特性。
一、本地数据库事务
事务从数据库角度说,就是一组 SQL
指令,要么全部执行成功,若因为某个原因其中一条指令执行有错误,则撤销先前执行过的所有指令。
关系型数据库(例如:MySQL
、SQL Server
、Oracle
等)事务都有以下几个特性:原子性(Atomicity
)、一致性(Consistency
)、隔离性或独立性(Isolation
)和持久性(Durabilily
),简称就是 ACID。
- 原子性:表示事务执行过程中的任何失败都将导致事务所做的任何修改失效。
- 一致性:表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。
- 隔离性:表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见。
- 持久性:表示已提交的数据在事务执行失败时,数据的状态都应该正确。
恍恍惚惚又一年
再强大的内心,估计也抵抗不住岁月的流逝吧…那天和媳妇聊天,说起十年前,觉得十年好遥远,现在觉得十年前就想是在昨天。
今天是 2018 年的最后一天,像去年的今天一样,仿佛就像是在昨天,想着总结一下过去的一年,发现啥都写不出来。
今年为了西安房子的装修,从 6 月份后几乎每隔一月就在西安和北京奔波一回。装修房子的过程是痛苦的,什么都不懂,多花了不少冤枉钱,效果也不太满意,如果还会有第二套房子装修,我想应该会好很多吧!
工作上马马虎虎,个人能力感觉也没什么长进。又一波互联网大寒冬来袭,倒了一大批创业公司,各大公司也纷纷传出裁员的新闻,瑟瑟发抖,越来越焦虑了!
JVM-垃圾回收(二)
接着上次 JVM 中 GC 机制的总结,这次主要复习一下垃圾收集的常用算法和 Minor GC、Full GC 相关的一些知识点。
一、垃圾收集算法
1.1 标记 - 清除(Mark-Sweep)
算法分成 “标记”、“清除” 两个阶段:首先标记出所有需要回收的对象(两次标记),在标记完成后统一回收所有被标记的对象。如下图所示: