物理内存也称为主存,大多数计算机用的主存都是动态随机访问内存(DRAM)。只有内核才可以直接访问物理内存。那么,进程要访问内存时,该怎么办呢?Linux 内核给每个进程都提供...
物理内存也称为主存,大多数计算机用的主存都是动态随机访问内存(DRAM)。只有内核才可以直接访问物理内存。那么,进程要访问内存时,该怎么办呢?Linux 内核给每个进程都提供...
CS架构Android 平台第一个想到的就是 ContentProvider:一个单独进程管理数据,数据同步不易出错,简单好用易上手。然而它的问题也很明显,就是一个字慢:启动...
1.读写形式通过 mmap 内存映射文件,提供一段可供随时写入的内存块,App 只管往里面写数据,由操作系统负责将内存回写到文件,不必担心 crash 导致数据丢失。 2.存...
当评估利弊时,架构师必须保证联系上下文来做决策。不然,外部因素会不合时宜地影响到分析。经常,一个解决方案有很多有利的地方,但缺乏致胜的能力,以致无法成功。架构师必须确保他们权...
用一句简单的话来说就是:Netty封装了JDK的NIO,让你用得更方便,不用再写一大堆复杂的代码了。 Netty作为一个高性能的 NIO通信框架,涉及的知识点包括网络通信、多...
我们根据分布式架构中组件的不同交互模式定义了3个维度的耦合约束:通信方式、一致性要求和协调方式 Saga这个概念的出现早于微服务,最初是用来描述早期分布式系统中数据库锁的作用...
Kafka中存在大量的延时操作,比如延时生产、延时拉取和延时删除等。Kafka并没有使用JDK自带的Timer或DelayQueue来实现延时的功能,而是基于时间轮的概念自定...
说到缓存,你应该不陌生。相对于磁盘操作,基于内存的缓存对耗时敏感的高并发应用来说,在性能方面的提升是非常明显的。同样是 1MB 的数据读取,从磁盘读取的耗时,比从内存读取的耗...
HMAC验签(带密钥的Hash摘要算法) 虽然简单的哈希计算可以有效防止令牌失窃,但不能防止写访问权限的攻击者插入伪造令牌。大多数的数据库在设计上并没有考虑提供恒定时间比较措...
UUID(Universally Unique Identifier,通用唯一标识码)不依赖于任何第三方系统,所以在性能和可用性上都比较好,我一般会使用它生成 Request...
在比较两个流式处理系统时,要着重考虑使用场景是什么。以下是一些需要考虑的应用类别。 摄取 摄取的目的是将数据从一个系统移动到另一个系统,并在传输过程中对数据进行一些修改,使其...
微服务并不是很多人认为的那样又简单又轻量级。要做好微服务,这些基础设施都是必不可少的,否则微服务就会变成一个焦油坑,让业务和团队在里面不断挣扎且无法自拔。因此也可以说,微服务...
既要考虑发生分区时需要保证的是CP还是还是AP,还需要考虑在没有发生分区时,如何保证CA的问题。我们可以在分区故障解决时,让系统重新恢复CA状态。 以用户系统为例,假如我们选...
两阶段提交第一,2PC 是一个阻塞式协议。当 2PC 的一个参与者,在阶段 1 做出了“是”的回复后,参与者将不能单方面放弃,它必须等待协调者的决定,也就意味着参与者所有占用...
Raft算法Raft 把这个一致性的算法分解成了几个部分,一个是领导选举(Leader Selection),一个是日志复制(Log Replication),一个是安全性(...
1.主从分片我们上面讨论的主从复制模型,是基于每一个副本都有全量的数据集的,如果我们将这个主从复制的粒度变小一点,比如可以指定每一个副本最大为 128 M,对于全量数据集按 ...
分布式锁的本质是在独立集群外的一个存储系统,设置一个值,并标记所有权,表明这个资源我占用了。 在分布式锁的场景中,部分失败和异步网络这两个问题是同时存在的。如果一个进程获得了...
学了那么多基础理论和代码,这里来看看实际使用过程中会使用的一些常用实践: 一.异步转同步。异步转同步,需要把回调转为等待。因此可以通过前面提到的锁的阻塞的方式来实现。可以通过...
Actor 使用单线程处理消息,所以不会出现并发问题。你可以把 Actor 内部的工作模式想象成只有一个消费者线程的生产者 - 消费者模式。所以,在 Actor 模型里,发送...
ThreadLocal顾名思义,就是每个线程保存一份只有自己能访问的对象,避免了不同线程对同一个线程的竞争。所以核心在于如何隐藏一个对象的可见性,来保证只有指定的线程能访问到...