0%

原文地址 动态代理是 Java 语言中非常经典的一种设计模式,也是所有设计模式中最难理解的一种。本文将通过一个简单的例子模拟 JDK 动态代理实现,让你彻底明白

又一年即将结束,时间过得真的很快,快到不敢静下来细细回忆。小时候觉得二十多岁的人年纪好大,再后来觉得三十岁应该离自己很远吧,没想到自己的三十

Rust 中字符串和 JavaGo 中的表示有很大的区别,刚开始接触的时候有点儿懵,今天花点时间总结备忘一下。

Rust 字符串有两种形式:strStringstr 是内置的原始数据类型,通常是以借用的形式(&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、判断取到的值落在那个区间

天气暖和了,19 年的跑步计划已经在心中盘算好久了,本打算昨天生日的时候去开始的,结果天公不作美,一直在下小雨。 关于跑步,一开始为了减肥,现在

提到分布式应用,就不得不考虑分布式事务。在分布式事务中,常见的有 CAPBASE 理论,解决方案也有很多种,比如:2PCTCC 、最终一致性等。

2PC(两阶段提交)比较适合单块应用,跨多个库的分布式事务。因为严重依赖于数据库层面来搞定复杂的事务,效率很低,绝对不适合高并发的场景,而且,对于微服务而言,不推荐一个服务出现跨多个数据库操作, 如果需要操作其它数据库数据,推荐通过调用别的服务接口来实现。

TCC 属于强一致性事务的方案,适用资金流转业务相关业务,比如:支付、交易等场景。根据 CAP 理论,这种实现需要牺牲可用性。

如果是一般的分布式事务场景,比如:订单插入之后要调用库存服务更新库存,库存数据没有资金那么的敏感,可以用可靠消息最终一致性方案。

下面是一种可靠消息最终一致性事务方案的实现流程:

通俗的理解,事务是一组原子操作单元。我们希望一些列的操作能够全部正确执行,如果这一组操作中的任意一个步骤发生错误,那么就需要回滚之前已经完成的操作。也就是同一个事务中的所有操作,要么全都正确执行,要么全都不要执行。

传统的单机应用系统一般使用一个关系型数据库,利用数据库事务来保证数据的一致性,下面先了解一下本地数据库事务的一些特性。

一、本地数据库事务

事务从数据库角度说,就是一组 SQL 指令,要么全部执行成功,若因为某个原因其中一条指令执行有错误,则撤销先前执行过的所有指令。

关系型数据库(例如:MySQLSQL ServerOracle 等)事务都有以下几个特性:原子性Atomicity)、一致性Consistency)、隔离性或独立性Isolation和持久性Durabilily),简称就是 ACID

  • 原子性:表示事务执行过程中的任何失败都将导致事务所做的任何修改失效。
  • 一致性:表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。
  • 隔离性:表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见。
  • 持久性:表示已提交的数据在事务执行失败时,数据的状态都应该正确。

再强大的内心,估计也抵抗不住岁月的流逝吧…那天和媳妇聊天,说起十年前,觉得十年好遥远,现在觉得十年前就想是在昨天。

今天是 2018 年的最后一天,像去年的今天一样,仿佛就像是在昨天,想着总结一下过去的一年,发现啥都写不出来。

今年为了西安房子的装修,从 6 月份后几乎每隔一月就在西安和北京奔波一回。装修房子的过程是痛苦的,什么都不懂,多花了不少冤枉钱,效果也不太满意,如果还会有第二套房子装修,我想应该会好很多吧!

工作上马马虎虎,个人能力感觉也没什么长进。又一波互联网大寒冬来袭,倒了一大批创业公司,各大公司也纷纷传出裁员的新闻,瑟瑟发抖,越来越焦虑了!

接着上次 JVM 中 GC 机制的总结,这次主要复习一下垃圾收集的常用算法和 Minor GC、Full GC 相关的一些知识点。

一、垃圾收集算法

1.1 标记 - 清除(Mark-Sweep)

算法分成 “标记”、“清除” 两个阶段:首先标记出所有需要回收的对象(两次标记),在标记完成后统一回收所有被标记的对象。如下图所示: