Kafka原理和实践

Kafka部署方案选择 * 操作系统 * I/O模型的选择:I/O模型:阻塞IO、非阻塞IO、IO多路复用、信号驱动IO、异步IO几种模型。Java Socket对象的阻塞&非阻塞模式对象前两种;Linux的select函数属于IO多路复用;epoll系统调用介于第三四种模型之间;第五种模型Linux少有支持,Windows由OCP线程模型。Kafka客户端底层使用了Java的selector实现,selector在Linux上实现机制是epoll,Windows上实现机制是select。因此Kafka部署在Linux上更有优势,I/O性能更强。 * 零拷贝支持:从磁盘读取数据发送到
阅读更多

Redis原理和实践

数据结构 整体组织形式 全局哈希表,每个哈希桶存储键值对,值存储的是指向实际元素的指针。redis采用链地址法(拉链法)解决哈希冲突,当链表长度过长时查询速度会变慢,所以链表长度过长时需要rehash,增加哈希桶数量 rehash过程: 使用两个全局哈希表实现 1. 给哈希表2分配更大的空间,比如哈希表1的两倍 2. 把哈希表1的数据重新映射拷贝到哈希表2 3. 释放哈希表1的空间 渐进式rehash: 时机:负载因子(哈希表已保存的节点数量/哈希表大小)大于1且没有进行bgsave或bgrewiteaof时。或者负载因子大于5时 原因:第2步涉及大量数据拷贝,如果一次性把哈
阅读更多

高并发问题

问题分类 侧重于“高并发读”的系统 例如如下场景 1. 搜索引擎 2. 电商的商品搜索 3. 电商系统的商品描述、图片和价格 侧重于“高并发读”的系统 例如如下场景 1. 广告扣费系统 同时侧重于“高并发读”和“高并发写”的系统 例如如下场景 1. 电商的库存系统和秒杀系统 2. 支付系统和微信红包 3. IM、微博和朋友圈 高并发读 策略:加缓存 本地缓存或Memcached/Redis集中式缓存 当数据库支持不住的时候,首先想到的就是为其加一层缓存。缓存通常有两种思路:一种是本地缓存,另一种是Memcached/Redis类的集中式缓存 使用缓存时需要考虑一些问题
阅读更多

分布式事务一致性

分布式事务问题 定义:分库架构下无法使用单机数据库的事务能力,需要在多个服务协同操作下保证数据一致性 解决方案:强一致性协议 一个协调者,多个参与者,协同进行分布式事务处理 2PC(两阶段提交) 流程 1. 准备阶段:协调者向各个参与者发起询问,说要执行一个事务,各参与者可能回复YES、NO或超时。 2. 提交阶段:如果所有参与者都回复的是 YES,则事务协调者向所有参与者发起事务提交操作,即Commit操作,所有参与者各自执行事务,然后发送ACK 特点 优点 原理简单,实现方便 缺点 1. 同步阻塞:在阶段1,锁定资源之后,要等所有节点返回,然后才能一起进入阶段2,不能很好地应
阅读更多

高可用和稳定性

多副本 1. 本地缓存多副本 2. Redis多副本 3. MySQL多副本 4. 消息中间件多副本 隔离、限流、熔断和降级 隔离 定义:将系统或资源分割开,在系统发生故障时能限定传播范围和影响范围,即发生故障后不会出现滚雪球效应 1. 数据隔离 2. 机器隔离 3. 线程池隔离:为了某个rpc接口较慢导致线程池打满,为不同的rpc接口提供不同的线程池 4. 信号量隔离:为了解决线程数过多导致上下文切换开销的大问题,共用线程池但是取线程之前需要获得信号量,信号量达到阈值则无法获取线程 限流 定义:系统的处理能力不能应对外部请求的涂增流量时,为了不让系统崩溃(如线程池资源耗
阅读更多

leetcode 45.跳跃游戏II

https://leetcode.com/problems/jump-game-ii/ 45.跳跃游戏 II 你被给了一个长度为 n 的整数数组 nums,索引从 0 开始。你最初位于 nums[0]。 数组中的每个元素 nums[i] 代表从索引 i 出发的最大向前跳跃长度。换句话说,如果你在 nums[i],你可以跳到任何 nums[i + j],其中: * 0 <= j <= nums[i] 且 * i + j < n 返回到达 nums[n - 1] 的最小跳跃次数。测试用例生成保证你可以到达 nums[n - 1]。 示例 1: 输入:nums = [2,3,1,1
阅读更多

leetcode 31. 下一个排列

https://leetcode.com/problems/next-permutation/description/ 31.下一个排列 整数数组的排列是将其成员排列成序列或线性顺序。 * 例如,对于arr = [1,2,3],arr的所有排列如下:[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]。 整数数组的下一个排列是它的整数下一个字典序排列。更正式地说,如果将数组的所有排列按字典序排序放入一个容器中,那么该数组的下一个排列就是排序容器中紧随其后的排列。如果无法进行这种排列,则数组必须重新排列为最低可能的顺序(即按升序排序)。
阅读更多

leetcode 33.在旋转排序数组中搜索

https://leetcode.com/problems/search-in-rotated-sorted-array/description/ 33.旋转有序数组中的搜索[中等] 有一个整数数组nums,按升序排序(值各不相同)。在传递给您的函数之前,nums可能被一个未知的枢轴索引k(1 <= k < nums.length)旋转,使得得到的数组为[nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …, nums[k-1]](索引从0开始)。例如,[0,1,2,4,5,6,7]可能在枢轴索引3处旋转并变为[4,5,6,7,0,1,
阅读更多

项目回顾

大数据离线任务调度系统 定义 大数据离线任务调度系统 是指用于 管理、编排和执行批处理(离线)数据任务 的平台,它确保 数据在正确的时间、以正确的依赖关系顺序、在正确的计算资源上被处理,以支持数据仓库建设、ETL流程、数据分析、数据报表等工作。 上下游关联:上层是数据开发平台、BI平台、机器学习平台等等,下层是Spark、MR、异步数据源同步引擎等底层引擎 运行频率:一般是分钟级、小时级、日级 痛点问题 * 调度时延高:对于到达就绪时间的任务,旧架构下采取轮询的模式从DB查询任务,时延较高 * 有状态服务:服务内存中存储DAG结构,服务重启或故障情况下需要恢复内存状态 * 单点问题:服
阅读更多

操作系统

操作系统相关书籍:《Linux是怎样工作的 - [日]武内觉》 存储层次 高速缓存 从内存直接和寄存器之间做数据拷贝很慢,高速缓存的存在,正是为了抹平寄存器与内存之间的性能差距。 读取数据 从内存读取数据时,数据显呗送往高速缓存,在被送往寄存器,读取的数据大小取决于缓存块大小(cache line size),该值由各个CPU规定。 假设缓存块的大小为 10 字节,高速缓存的容量为 50 字节,并且存在两个长度为 10 字节的寄存器(R0 与 R1)。在这样的运行环境下,把内存地址 300 上的数据读取到 R0 时的情形如图 6-2 所示。此后,当 CPU 需要再次读取地址 300 上的
阅读更多