KANG's BLOG

Let's have some fun

分布式数据库架构类别和主流方案

一、分布式场景下数据库架构方式 1. Share nothing 顾名思义,就是什么都不共享。 Mysql 的分库分表和大部分的Nosql都是这样的方案,底层实际上完全分离,节点之间单独计算,不共享数据。 好处很明显,设计简单,扩展灵活,并行度较高。 缺点也很明显,跨分片查询困难,数据一致性难以保证。 能够实现强一致的只有zookeeper这种轻量级的分布式存储框架,但是它是牺牲了可用性的前提来保证的一致性,这也是Kafka和Dubbo这种主流中间件在逐渐抛弃zookeeper的原因,详见Zab1.0。

Kafka高性能的原因

批量处理 生产者采用批量压缩后批量发送的方式,这一批消息会被当做一个"批消息"直接由broker处理包括分发、复制、刷盘,然后发送到消费者,由消费者去分解为一条条的数据再去处理。其中broker不需要对这一批消息进行拆解处理。这样不仅减轻了broker的压力,最关重要是减少了生产和消费的交互次数。 利用PageCache加速消息读写 我们的系统读取硬盘上的数据时,并不是直接与硬盘交互,而是操作系统会将数据缓存在内存中的PageCache里,基于内存和硬盘的性能差,能最大化读写性能,当应用程序读取PageCache中数据未命中时,会触发“缺页中断”,此时应用程序的读取线程会被阻塞,操作系统把数据从文件复制到PageCache中,然后应用程序再从PageCache中继续读取数据,这时由于触发了硬盘IO,所以性能较差。 但是,操作系统对于PageCache使用后并不会直接删除,只有在内存不够用时,才会基于LRU或其他变种算法清除。 Kafka的业务属性就是不断消费刚刚写入消息,而这些新的消息不会被LRU算法优先清除,所以读取时,命中PageCache几率会非常高。 顺序读写提升磁盘IO性能 kafka充分利用磁盘顺序读写性能较好的特性来设计存储结构,它把从Producer收到的消息,顺序写入对应的log文件中,一个文件写满了,就开启一个新的文件顺序写下去。消费的时候,也是从某个log的某个位置开始,顺序读出来。 零拷贝( zero-copy ) 发送数据,通常需要通过如下几步:

Bitmap的使用

1 操作命令 Bitmap在Redis中并不是一个单独的数据类型,而是由字符串类型(Redis内部称Simple Dynamic String,SDS)之上定义的与比特相关的操作实现的,此时SDS就被当做位数组了。 SETBIT key offset value getbit key offset 在redis中,借助Bitmap可实现布隆过滤器。

分布式限流算法及方案介绍

业务场景 现代互联网很多业务场景,比如秒杀、下单、查询商品详情,最大特点就是高并发,而往往我们的系统不能承受这么大的流量,继而产生了很多的应对措施:CDN、消息队列、多级缓存、异地多活。 但是无论如何优化,终究由硬件的物理特性决定了我们系统性能的上限,如果强行接收所有请求,往往造成雪崩。 这时候限流熔断就发挥作用了,限制请求数,快速失败,保证系统满负载又不超限。 极致的优化,就是将硬件使用率提高到100%,但永远不会超过100% 常用限流算法 计数器 直接计数,简单暴力,举个例子: 比如限流设定为1小时内10次,那么每次收到请求就计数加一,并判断这一小时内计数是否大于上限10,没超过上限就返回成功,否则返回失败。 这个算法的缺点就是在时间临界点会有较大瞬间流量。

HTTP协议的请求类型和状态码

HTTP协议的8种请求类型 1. OPTIONS 返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送'*'的请求来测试服务器的功能性。 2. HEAD 向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。 3. GET 向特定的资源发出请求。 4.

Filter Interceptor Aop区别

Filter、Interceptor、Aop实现与区别 执行顺序 过滤前 - 拦截前 - aspect 开始执行- controller逻辑处理 - - aspect 结束 - 拦截后 - 过滤后。

AQS原理浅述

1. 简介 AQS全名:AbstractQueuedSynchronizer,是并发容器J.U.C(java.util.concurrent)下locks包内的一个类。它实现了一个FIFO(FirstIn、FisrtOut先进先出)的队列。底层实现的数据结构是一个双向链表。 AQS核心思想是:如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态 AQS主要支持两个抽象能力: 共享:多个线程可以同时执行 独占:同一时刻只有一个线程可以执行 2. 概念 State:资源 内部提供了一个声明一个变量state,指代“资源”

Aware接口

Aware接口 aware adj. 知道; 意识到; 明白; 察觉到; 发觉; 发现; 对…有兴趣的; 有…意识的;

GC优化常用手段

1. 降低进入老年代的对象数量 除了可以在JDK 7及更高版本中使用的G1收集器以外,其他分代GC都是由Oracle JVM提供的。 关于分代GC,就是对象在Eden区被创建,随后被转移到Survivor区,在此之后剩余的对象会被转入老年代。也有一些对象由于占用内存过大,在Eden区被创建后会直接被传入老年代。 老年代GC相对来说会比新生代GC更耗时,因此,减少进入老年代的对象数量可以显著降低Full GC的频率。你可能会以为减少进入老年代的对象数量意味着把它们留在新生代,事实正好相反,新生代内存的大小是可以调节的。 2. 降低Full GC的时间 Full GC的执行时间比Minor GC要长很多,因此,如果在Full GC上花费过多的时间(超过1s),将可能出现超时错误。

Java中的new关键字

new关键字在生成对象时完成了三件事情: 为对象开辟内存空间。 调用类的构造方法。 将生成的对象的地址返回。 在并发环境下从堆中划分内存空间是非线程安全的 new是原子性操作 new运算符具有数据操作的原子性 也就是说创建一个Java对象分配内存,要么所有步骤都成功,返回对象的引用,要么回归到创建之前的内存状态,返回为NULL。